【實驗要求】
(1)待分析的簡單語言的詞法同實驗1
(2)待分析的簡單語言的語法
用擴充的bnf表示如下:
1)《程式》::=begin《語句串》end
2) 《語句串》::=《語句》
3) 《語句》::=《賦值語句》
4) 《賦值語句》::=id:=《表示式》
5) 《表示式》::=《項》
6) 《項》::=《因子》
7) 《因子》::=id|num|(《表示式》)
(3)語法分析程式的功能
輸入單詞串以」#」結束,如果是文法正確的句子,輸出成功資訊;否則輸出錯誤資訊。
例如:輸入 begin a:=9; x:=2 * 3; b:=a + x end #
輸出 success
輸入 x:=a + b * c end #
輸出 error
這個實驗二與實驗一是有一定聯絡的,實驗一請**:
實驗一 詞法分析器實驗:
#include #include using namespace std;
char prog[800]; //儲存程式
char token[10]; //儲存單詞字串
char ch; //當前字元
int syn; //單詞種別碼
int sum; //整型常數
int p; //prog指標
int m; //token指標
int n;
int kk; //錯誤標記
//關鍵字
const char * rwtab[6] = ;
bool isletter(char ch); //判斷是否為字母
bool isdigit(char ch); //判斷是否為數字
void scanner(); //掃瞄分析器
void irparser(); //語法分析器
void yucu(); //語句串分析函式
void statement(); //語句分析函式
void expression(); //表示式分析函式
void term();
void factor();
bool isletter(char ch)
else
}bool isdigit(char ch)
else }
void scanner()
m = 0;
//獲取下乙個有效字元
ch = prog[p];
while(ch == ' ')
if(isdigit(ch))
} //字元為字串
else if(isletter(ch))
token[m] = '\0';
m++;
syn = 10;
for(n = 0; n < 6; n++)
} }else
else if (ch == '=')
break;
case '>':
syn = 23;
m = 0;
token[m++] = ch;
p++;
ch = prog[p];
if (ch == '=')
break;
case ':':
syn = 17;
m = 0;
token[m] = ch;
m++;
p++;
ch = prog[p];
if (ch == '=')
break;
case '+':
syn = 13;
token[0] = ch;
p++;
ch = prog[p];
break;
case '-':
syn = 14;
token[0] = ch;
p++;
ch = prog[p];
break;
case '*':
syn = 15;
token[0] = ch;
p++;
ch = prog[p];
break;
case '/':
syn = 16;
token[0] = ch;
p++;
ch = prog[p];
break;
case '=':
syn = 25;
token[0] = ch;
p++;
ch = prog[p];
break;
case ';':
syn = 26;
token[0] = ch;
p++;
ch = prog[p];
break;
case '(':
syn = 27;
token[0] = ch;
p++;
ch = prog[p];
break;
case ')':
syn = 28;
token[0] = ch;
p++;
ch = prog[p];
break;
case '#':
syn = 0;
token[0] = ch;
break;
default:
syn = -1;
break;
}} }
void irparser()
} else
} }else
}void yucu()
}void statement()
else
} else
}void expression()
}void term()
} void factor()
else if (syn == 27)
else
}} int main(int argc, char** ar**) while(str != '#');
p = 0;
ch = prog[p];
scanner();
irparser();
//開始分析
// do{
// scanner();
// switch(syn){
// case 11:
// cout << "(" << syn << "," << sum << ")" << endl;
// break;
// case -1:
// cout << "error" << endl;
// break;
// default:
// cout << "("<< syn << "," << token << ")" 《是的,終於寫完啦,好開心!!!
編譯原理實驗三 語法分析(遞迴下降法)
實驗任務 完成以下描述算術表示式的ll 1 文法的遞迴下降分析程式 g e e te e ate t ft t mft f e i a m 說明 終結符號i為使用者定義的簡單變數,即識別符號的定義。設計要求 1 輸入串應是詞法分析的輸出二元式序列,即某算術表示式 實驗專案一 的輸出結果。輸出為輸入串...
遞迴下降語法分析實驗
通過設計 開發乙個高階語言的遞迴下降語法分析程式,實現 對詞法分析程式所提供的單詞序列進行語法檢查和結構分析,加 深對相關課堂教學內容的理解,提高語法分析方法的實踐能力。1 理解語法分析在編譯程式中的作用,以及它與詞法分析程式的 關係 2 掌握遞迴下降語法分析方法的主要原理 3 理解遞迴下降分析法對...
實驗2 遞迴下降語法分析程式設計
開發語言及實現平台或實驗環境 c clion 實驗目的 1 理解語法分析在編譯程式中的作用,以及它與詞法分析程式的關係 2 加深對遞迴下降語法分析原理的理解 3 掌握遞迴下降語法分析的實現方法 實驗內容 編制乙個遞迴下降分析程式,實現對詞法分析程式提供的單詞序列的語法檢查和結構分析。實驗要求 1 待...