資源簡介
一、實驗目的
實現一個的中間代碼生成程序,識別用戶輸入的關于標識符與整數的含加法、乘法的算術表達式并輸出匯編指令序列。
二、實驗主要內容
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分析儀
- 下一篇:距離多普勒成像算法分析
評論
共有 條評論