資源簡介
通過上機實習(xí),加深對語法制導(dǎo)翻譯原理的理解,掌握將語法分析所識別的語法成分變換為中間代碼的語義翻譯方法。
采用遞歸下降語法制導(dǎo)翻譯法,對算術(shù)表達式、賦值語句進行語義分析并生成四元式序列。

代碼片段和文件信息
package?com;
public?class?Analyzer?{
private?String?input?=““;//輸入緩沖
private?String?token?=““;//單詞緩沖
private?int?p_input?=?0;//輸入緩沖指針
//private?int?p_token?=?0;//單詞緩沖指針
private?char?ch?=?‘?‘;
private?String[]?keyWords?=?{“begin““if““then““while““do““end““int““String““boolean““class“};
public?Analyzer(){
p_input?=?0;
}
//外部接口
public?void?setInput(String?input)?{
this.input?=?input;
p_input?=?0;//每一行數(shù)據(jù)進來,這個下標要置0
}
//從輸入緩沖區(qū)讀取一個字符到ch中
public?char?getCh(){
ch?=?input.charAt(p_input);
p_input++;
return?ch;
}
//去掉空白字符
public?char?getNoBlankChar(){
while(ch?==‘?‘?||?ch?==?10){
ch?=?input.charAt(p_input);
p_input++;
}
return?ch;
}
//判斷該字符是否是字母
private?boolean?isLetter(char?ch){
if(ch?>=‘a(chǎn)‘?&&?ch?<=?‘z‘?||?ch?>=‘A‘?&&?ch?<=?‘Z‘){
return?true;
}else
return?false;
}
//判斷該字符是否是數(shù)字
private?boolean?isNumber(char?ch){
if(ch?>=‘0‘?&&?ch?<=?‘9‘?){
return?true;
}else
return?false;
}
//拼接單詞
void?concat(){
String?ch_String??=?String.valueOf(ch);//先轉(zhuǎn)換成String類型才能拼接
//System.out.println(“ch_String?:?“?+?ch_String?);
//token.concat(ch_String);
token?=?token?+?ch_String;
//System.out.println(“token?:?“?+?token?);
}
//回退一個字符
void?retrace(){
p_input?--;
}
//檢索關(guān)鍵字,返回關(guān)鍵字的種別碼(即數(shù)組的下標)
int?reverse(){
for(int?i?=?0?;?i? if(keyWords[i].equals(token)){
return?i+1;//返回關(guān)鍵字的下標
}
}
return?10;//不是關(guān)鍵字則返回10
}
??//判斷該字符是否是空格字符
private?boolean?isBlankChar(char?ch){
if(ch?==?‘?‘){
return?true;
}else{
return?false;
}
}
//判斷該字符串是否都是數(shù)字
private?boolean?isNumberString(String?token){
for(int?i?=?0?;?i? if(!isNumber(token.charAt(i))){//只要有一個字符不是數(shù)字,即返回false
return?false;
}
}
return?true;
}
//詞法掃描
public?WORD?scanner(){
//System.out.println(“執(zhí)行Scanner()“);
WORD?myWord??=?new?WORD();
myWord.setTypeNum(10);
myWord.setWord(““);
//p_token?=?0;
token?=““;
getCh();//得到第一個字符
getNoBlankChar();//去掉空白字符串的情況確保得到的是有效字符
//如果第一個字符是字母的情況
if(isLetter(ch)){
//while(isLetter(ch)?||?isNumber(ch)){//如果當(dāng)前字符是數(shù)字或者字母
while(isLetter(ch)?||?isNumber(ch)){//如果當(dāng)前字符是數(shù)字或者字母
concat();//將當(dāng)前字符和之前的字符拼接起來
getCh();//繼續(xù)讀取下一個字符
}
retrace();//回退一個字符(因為多讀了一個字符)
myWord.setTypeNum(reverse());
myWord.setWord(token);
return?myWord;
}
else?if(isNumber(ch)){//第一個字符是數(shù)字
//while(isNumber(ch)){
while(isLetter(ch)?||?isNumber(ch)){//如果當(dāng)前字符是數(shù)字或者字母
concat();
getCh();
}
retrace();//回退一個字符(因為多讀了一個字符)
if(isNumberString(token)){//如果該單詞都是數(shù)字字符
myWord.setTypeNum(11);//數(shù)字的種別碼是11
}else{
myWord.setTypeNum(600);//錯誤單詞的種別碼是600
}
myWord.setWord(token);
return?myWord;
}
else?switch(ch){
?? case?‘=‘:?getCh();
??????????????if(ch?==?‘=‘){
???????? ?????
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????299??2017-12-16?09:37??語義分析實驗\SemanticAnalyze\.classpath
?????文件????????391??2017-12-16?09:32??語義分析實驗\SemanticAnalyze\.project
?????文件????????598??2017-12-16?09:37??語義分析實驗\SemanticAnalyze\.settings\org.eclipse.jdt.core.prefs
?????文件???????4115??2017-12-16?15:53??語義分析實驗\SemanticAnalyze\bin\com\Analyzer.class
?????文件???????1410??2017-12-16?09:37??語義分析實驗\SemanticAnalyze\bin\com\FileInput.class
?????文件???????3396??2017-12-16?16:40??語義分析實驗\SemanticAnalyze\bin\com\LRparse.class
?????文件???????1398??2017-12-16?09:37??語義分析實驗\SemanticAnalyze\bin\com\Main.class
?????文件????????703??2017-12-16?09:37??語義分析實驗\SemanticAnalyze\bin\com\WORD.class
?????文件?????????58??2017-12-16?16:29??語義分析實驗\SemanticAnalyze\data\testData.txt
?????文件???????7188??2017-12-16?15:53??語義分析實驗\SemanticAnalyze\src\com\Analyzer.java
?????文件????????856??2017-12-16?09:35??語義分析實驗\SemanticAnalyze\src\com\FileInput.java
?????文件???????3353??2017-12-16?16:40??語義分析實驗\SemanticAnalyze\src\com\LRparse.java
?????文件???????1125??2017-12-16?09:36??語義分析實驗\SemanticAnalyze\src\com\Main.java
?????文件????????345??2017-12-16?09:36??語義分析實驗\SemanticAnalyze\src\com\WORD.java
?????文件??????82818??2017-12-16?16:30??語義分析實驗\語義分析實驗.docx
?????目錄??????????0??2017-12-16?16:41??語義分析實驗\SemanticAnalyze\bin\com
?????目錄??????????0??2017-12-16?16:41??語義分析實驗\SemanticAnalyze\src\com
?????目錄??????????0??2017-12-16?16:41??語義分析實驗\SemanticAnalyze\.settings
?????目錄??????????0??2017-12-16?16:41??語義分析實驗\SemanticAnalyze\bin
?????目錄??????????0??2017-12-16?16:41??語義分析實驗\SemanticAnalyze\data
?????目錄??????????0??2017-12-16?16:41??語義分析實驗\SemanticAnalyze\src
?????目錄??????????0??2017-12-16?16:41??語義分析實驗\SemanticAnalyze
?????目錄??????????0??2017-12-16?16:42??語義分析實驗
-----------?---------??----------?-----??----
???????????????108053????????????????????23
評論
共有 條評論