資源簡介
參照C語言版本,用Java寫的語義分析程序,采用遞歸下降分析法,對算術表達式、賦值語句進行語義分析并生成四元式序列。在實驗三遞歸下降分析法的基礎上改的。
用Eclipse做的,有運行結果截圖。

代碼片段和文件信息
package?org.test;
import?java.util.ArrayList;
import?org.test.WordAnalyzer;
public?class?SemanticAnalyzer?{
WordAnalyzer?wa?=?new?WordAnalyzer();
private?int?tempIndex?=?1;
private?boolean?isError?=?false;
class?Quadruple?{//用內部類表示四元式
String?result;
String?ag1;
String?op;
String?ag2;
public?Quadruple(String?result?String?ag1)?{
this.result?=?result;
this.ag1?=?ag1;
this.op?=?““;
this.ag2?=?““;
}
public?Quadruple(String?result?String?ag1?String?op?String?ag2)?{
this.result?=?result;
this.ag1?=?ag1;
this.op?=?op;
this.ag2?=?ag2;
}
}
ArrayList?quadList?=?new?ArrayList();//四元式序列
public?String?newtemp()?{//生成臨時變量
return?“t“?+?tempIndex++;
}
public?int?lrparser()?{
int?schain?=?0;
if?(wa.syn?==?1)?{
wa.scaner();
schain?=?yujuchuan();
if?(wa.syn?==?6)?{?//?“end”
wa.scaner();
if?(wa.syn?==?0?&&?isError?==?false)?//?“end”之后是“#”并且沒有出錯,則分析成功
System.out.println(“語義分析成功!“);
}?else?{
if?(isError?==?false)?//?之前分析都成功,但沒有“end”
System.out.println(“語義分析出錯!缺少“end”“);
isError?=?true;
}
}?else?{
System.out.println(“語義分析出錯!缺少“begin”“);
isError?=?true;
}
return?(schain);
}
public?int?yujuchuan()?{//分析語句串
int?schain?=?0;
schain?=?statement();?//?分析第一條語句
while?(wa.syn?==?26)?{//?為“;”時,分析下一條語句
wa.scaner();
if?(wa.syn?==?6)
break;
schain?=?statement();
}
return?(schain);
}
public?int?statement()?{//分析語句
int?schain=0;
String?txex;
if?(wa.syn?==?10)?{?//語句的開始是標識符,讀下一個單詞符號
tx?=?wa.token.toString();
wa.scaner();
if?(wa.syn?==?18)?{?//為“:=”?賦值時,分析表達式
wa.scaner();
ex?=?expression();
quadList.add(new?Quadruple(tx?ex));
schain?=?0;
}?else?{
System.out.println(“語義分析出錯!表達式錯誤“);
isError?=?true;
}
}?else?{
System.out.println(“語義分析出錯!語句錯誤“);
isError?=?true;
}
return?schain;
}
public?String?expression()?{//分析表達式
String?txe1e2op;
e1?=?term();?//分析第一項
while?(wa.syn?==?13?||?wa.syn?==?14)?{?//?為“+”或“-”時,分析下一項
op?=?wa.token.toString();
wa.scaner();
e2?=?term();
tx?=?newtemp();
quadList.add(new?Quadruple(tx?e1?op?e2));
e1?=?tx;
}
return(e1);
}
public?String?term()?{//分析項
String?txe1e2op;
e1?=?factor();?//分析第一個因子
while?(wa.syn?==?15?||?wa.syn?==?16)?{?//為“*”或“/”時,分析下一個因子
op?=?wa.token.toString();
wa.scaner();
e2?=?factor();
tx?=?newtemp();
quadList.add(new?Quadruple(tx?e1?op?e2));
e1?=?tx;
}
return(e1);
}
public?String?factor()?{//分析因子
String?fx?=?““;
if?(wa.syn?==?10)?{?//為標識符時,這一項分析結束
fx?=?wa.token.toString();
wa.scaner();
}?else?if(?wa.syn?==?11)?{//為整數時,這一項分析結束
fx?+=?wa.sum;
wa.scaner();
}?else?if?(wa.syn?==?27)?{?//為“(”時,分析“(”里的表達式
wa.scaner();
fx?=?expression();
if?(wa.syn?==?28)?//表達式分析結束且下一個單詞符號為“)”時,這一項分析結束
wa.scan
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件?????????301??2017-12-31?16:59??.classpath
?????文件?????????398??2017-12-31?16:59??.project
?????目錄???????????0??2017-12-31?16:59??.settings\
?????文件?????????598??2017-12-31?16:59??.settings\org.eclipse.jdt.core.prefs
?????目錄???????????0??2017-12-31?16:59??src\
?????目錄???????????0??2017-12-25?10:08??src\org\
?????目錄???????????0??2017-12-25?10:08??src\org\test\
?????文件????????4353??2018-01-20?22:45??src\org\test\SemanticAnalyzer.java
?????文件????????2289??2017-12-25?09:59??src\org\test\WordAnalyzer.java
?????文件????????8726??2017-12-25?22:27??實驗結果.PNG
- 上一篇:編譯原理實驗三語義分析JavaCC代碼
- 下一篇:JAVA考試試題
評論
共有 條評論