资源简介
一、实验目的
实现一个的中间代码生成程序,识别用户输入的关于标识符与整数的含加法、乘法的算术表达式并输出汇编指令序列。
二、实验主要内容
1、本次实验表达式文法如下:
0) S->E
1) E->E+E
2) E->E*E
3) E->(E)
4) E->i
2、LR分析表:
状态 ACTION GOTO
+ * ( ) i # E
0 S2 S3 1
1 S4 S5 acc
2 S2 S3 6
3 r4 r4 r4 r4
4 S2 S3 7
5 S2 S3 8
6 S4 S5 S9
7 r1 S5 r1 r1
8 r2 r2 r2 r2
9 r3 r3 r3 r3
3、要求输入关于标识符与整数的含加法、乘法的算术表达式,输出对应的汇编语言序列;
4、只考虑仅含一个寄存器的情形,且表达式中不存在跳转汇编指令和标号;

代码片段和文件信息
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
public class LR {
private int[][] ELR={{-1-12-13-11}
{45-1-1-10-1}
{-1-12-13-16}
{104104-1104-1104-1}
{-1-12-13-17}
{-1-12-13-18}
{45-19-1-1-1}
{1015-1101-1101-1}
{102102-1102-1102-1}
{103103-1103-1103-1}};
private List symbol=new ArrayList<>();
private Stack stateStack=new Stack<>();
private Stack symbolStack=new Stack<>();
private String statement;
private int length=0;
private class Sym{
String name;
int type;
public Sym(String nameint type){
this.name=name;
this.type=type;
}
public String getName() {
return name;
}
};
private List symTable=new ArrayList<>(100);
private class object{
String action;
String arg1;
String arg2;
public object(String actionString arg1String arg2){
this.action=action;
this.arg1=arg1;
this.arg2=arg2;
}
public void print(){
if(arg1==“r0“){
System.out.println(action+“ r0 “+symTable.get(Integer.parseInt(arg2)-1).getName());
}else if(arg2==“r0“){
System.out.println(action+“ “+symTable.get(Integer.parseInt(arg1)-1).getName()+“ r0“);
}else{
System.out.println(action+“ “+symTable.get(Integer.parseInt(arg1)-1).getName()+“ “+symTable.get(Integer.parseInt(arg2)-1).getName());
}
}
};
private Listject> objectCode=new ArrayList<>(100);
private int tempCount=0;
private int symCount=0;
public LR(String expression){
statement=expression+‘#‘;
symbol.add(‘+‘);
symbol.add(‘*‘);
symbol.add(‘(‘);
symbol.add(‘)‘);
symbol.add(‘i‘);
symbol.add(‘#‘);
symbol.add(‘E‘);
stateStack.push(0);
symbolStack.push(‘#‘);
length=statement.length();
}
private void analysisStatement() throws Exception{
int index=0;
while(index int start=index;
if(statement.charAt(index)>=‘0‘&&statement.charAt(index)<=‘9‘){
index++;
while(statement.charAt(index)>=‘0‘&&statement.charAt(index)<=‘9‘){
index++;
}
symTable.add(symCount new Sym(statement.substring(start index) 0));
symCount++;
analysisStack(‘i‘);
continue;
}
if((statement.charAt(index)>=‘a‘&&statement.charAt(index)<=‘z‘)||(statement.charAt(index)>=‘A‘&&statement.charAt(index)<=‘Z‘)){
index++;
while((statement.charAt(index)>=‘0‘&&statement.charAt(index)<=‘9‘)||(statement.charAt(index)>=‘a‘&&statement.charAt(index)<=‘z‘)||(statement.charAt(index)>=‘A‘&&statement.charAt(index)<=‘Z‘)){
index++;
}
symTable.add(symCount new Sym(statement.substring(start index) 1));
symCount++;
analysisStack(‘i‘);
continue;
}
if(statement.charAt(index)==‘+‘||statement.charAt(index)==‘*‘||statement.charAt(index)==‘(‘||state
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 6579 2012-12-28 23:44 LR.java
- 上一篇:攀藤G5ST分析仪
- 下一篇:距离多普勒成像算法分析
相关资源
- 编译原理实验工具及参考源码(lex&
- 类pascal语言编译器(编译原理实验)
- 编译原理课程设计:词法语法编译器
- 中科院 编译原理 习题及解答
- 编译原理四元式和逆波兰式
- 《编译原理》清华大学版中的pl0扩充
- PL/0功能扩充break功能
- 编译原理LR(0)语法分析
- 编译原理中间代码生成程序
- 编译原理:LR分析程序
- 编译原理实验:词法分析,语法分析
- 吉林大学编译原理课件
- 编译原理龙书答案
- 编译原理 第三章课后习题答案
- 易语言变量和数组的编译原理
- 编译原理语法分析器、词法分析器
- 山东大学编译原理PL/0语言 compiler实验
- FOR循环语句的翻译程序设计简单优先
- NFA的确定化NFA->DFA完整可运行代码
- 哈工大威海编译原理实验报告和源代
- 哈工大威海-编译原理实验报告和源码
- 编译原理课设c编译器
- 赋值语句翻译四元式
- 河北工业大学编译原理实验代码及实
- 编译原理课程设计 while do循环语句翻
- 编译原理课程设计do——while简单优先
- 南开大学编译原理课件及作业
- 华工往年编译原理试卷
- 编译原理课程设计for循环LR法三元式
- 哈工程-编译原理课程设计(2016级)
评论
共有 条评论