资源简介

一、实验目的 实现一个的中间代码生成程序,识别用户输入的关于标识符与整数的含加法、乘法的算术表达式并输出汇编指令序列。 二、实验主要内容 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

评论

共有 条评论