資源簡(jiǎn)介
參照C語(yǔ)言版本,用Java寫(xiě)的語(yǔ)義分析程序,采用遞歸下降分析法,對(duì)算術(shù)表達(dá)式、賦值語(yǔ)句進(jìn)行語(yǔ)義分析并生成四元式序列。在實(shí)驗(yàn)三遞歸下降分析法的基礎(chǔ)上改的。
用Eclipse做的,有運(yùn)行結(jié)果截圖。

代碼片段和文件信息
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?{//用內(nèi)部類(lèi)表示四元式
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()?{//生成臨時(shí)變量
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”之后是“#”并且沒(méi)有出錯(cuò),則分析成功
System.out.println(“語(yǔ)義分析成功!“);
}?else?{
if?(isError?==?false)?//?之前分析都成功,但沒(méi)有“end”
System.out.println(“語(yǔ)義分析出錯(cuò)!缺少“end”“);
isError?=?true;
}
}?else?{
System.out.println(“語(yǔ)義分析出錯(cuò)!缺少“begin”“);
isError?=?true;
}
return?(schain);
}
public?int?yujuchuan()?{//分析語(yǔ)句串
int?schain?=?0;
schain?=?statement();?//?分析第一條語(yǔ)句
while?(wa.syn?==?26)?{//?為“;”時(shí),分析下一條語(yǔ)句
wa.scaner();
if?(wa.syn?==?6)
break;
schain?=?statement();
}
return?(schain);
}
public?int?statement()?{//分析語(yǔ)句
int?schain=0;
String?txex;
if?(wa.syn?==?10)?{?//語(yǔ)句的開(kāi)始是標(biāo)識(shí)符,讀下一個(gè)單詞符號(hào)
tx?=?wa.token.toString();
wa.scaner();
if?(wa.syn?==?18)?{?//為“:=”?賦值時(shí),分析表達(dá)式
wa.scaner();
ex?=?expression();
quadList.add(new?Quadruple(tx?ex));
schain?=?0;
}?else?{
System.out.println(“語(yǔ)義分析出錯(cuò)!表達(dá)式錯(cuò)誤“);
isError?=?true;
}
}?else?{
System.out.println(“語(yǔ)義分析出錯(cuò)!語(yǔ)句錯(cuò)誤“);
isError?=?true;
}
return?schain;
}
public?String?expression()?{//分析表達(dá)式
String?txe1e2op;
e1?=?term();?//分析第一項(xiàng)
while?(wa.syn?==?13?||?wa.syn?==?14)?{?//?為“+”或“-”時(shí),分析下一項(xiàng)
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()?{//分析項(xiàng)
String?txe1e2op;
e1?=?factor();?//分析第一個(gè)因子
while?(wa.syn?==?15?||?wa.syn?==?16)?{?//為“*”或“/”時(shí),分析下一個(gè)因子
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)?{?//為標(biāo)識(shí)符時(shí),這一項(xiàng)分析結(jié)束
fx?=?wa.token.toString();
wa.scaner();
}?else?if(?wa.syn?==?11)?{//為整數(shù)時(shí),這一項(xiàng)分析結(jié)束
fx?+=?wa.sum;
wa.scaner();
}?else?if?(wa.syn?==?27)?{?//為“(”時(shí),分析“(”里的表達(dá)式
wa.scaner();
fx?=?expression();
if?(wa.syn?==?28)?//表達(dá)式分析結(jié)束且下一個(gè)單詞符號(hào)為“)”時(shí),這一項(xiàng)分析結(jié)束
wa.scan
?屬性????????????大小?????日期????時(shí)間???名稱(chēng)
-----------?---------??----------?-----??----
?????文件?????????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??實(shí)驗(yàn)結(jié)果.PNG
評(píng)論
共有 條評(píng)論