资源简介
一、实验目的
实现一个的中间代码生成程序,识别用户输入的关于标识符与整数的含加法、乘法的算术表达式并输出汇编指令序列。
二、实验主要内容
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分析仪
- 下一篇:距离多普勒成像算法分析
相关资源
- 编译原理 递归下降语法分析程序代码
- 对PL0语言及其编译器进行扩充和修改
- 编译原理大作业 完整编译器
- 编译原理课程设计——简单编译器
- 编译原理--词法分析器+语法分析器 源
- pl0语法分析器
- 编译原理 三地址代码生成器
- 编译原理实验报告+源代码 预测分析法
- LL(1)分析过程模拟
- 编译原理实验常工院版
- 编译原理FOR循环语句的翻译程序设计
- LR(0)完整的语法分析方法(拓广文
- OUC编译原理全部实验
- 编译原理上机源代码LR语法分析器
- 编译原理LR0分析代码完整
- 哈工大编译原理实验三语义分析实验
- 编译原理实验报告,词法分析,语法
- 算符优先分析程序的设计可趁设计
- 山东大学编译原理实验
- 编译原理语法分析实验报告
- 编译原理-语法分析-LL1
- 编译原理优先算法代码,及详细实验
- 编译原理 课后习题答案 陈意云 张昱
- 编译原理语法树的实现
- 编译原理实验MiniPascal编译器设计 Fl
- 子集构造法NFA的确定化
- 程序设计语言 编译原理 第三版 国防
- 编译原理First集Follow集求解
- 云南大学软件学院编译原理实验1-5
- 山东科技大学编译原理课程设计
评论
共有 条评论