資源簡介
第三次上機—語法分析1
目的:熟練掌握自上而下的語法分析方法,并能用C++程序實現。
要求:
1. 使用的文法如下:
E ? TE ¢
E ¢ ? + TE ¢ | e
T ? FT ¢
T ¢ ? * FT ¢ | e
F ? (E) | id
2. 對于任意給定的輸入串(詞法記號流)進行語法分析,遞歸下降方法和非遞歸預測分析方法可以任選其一來實現。
3. 要有一定的錯誤處理功能。即對錯誤能提示,并且能在一定程度上忽略盡量少的記號來進行接下來的分析。可以參考書上介紹的同步記號集合來處理。
可能的出錯情況:idid*id, id**id, (id+id, +id*+id ……
4. 輸入串以#結尾,輸出推導過程中使用到的產生式。例如:
輸入:id+id*id#
輸出:E ? TE ¢
T ? FT ¢
F ? id
E ¢ ? + TE ¢
T ? FT ¢
……
如果輸入串有錯誤,則在輸出中要體現是跳過輸入串的某些記號了,還是彈棧,彈出某個非終結符或者是終結符了,同時給出相應的出錯提示信息。比如:
idid*id對應的出錯信息是:“輸入串跳過記號id,用戶多輸入了一個id”;
id**id對應的出錯信息是:“彈棧,彈出非終結符F,用戶少輸入了一個id”
(id+id對應的出錯信息是:“彈棧,彈出終結符 ) ,用戶少輸入了一個右括號(或者說,括號不匹配)”
有余力的同學可進一步考慮如下擴展:
1. 將遞歸下降方法和非遞歸預測分析方法都實現
2. 在語法分析的過程中調用第二次上機的結果,即利用詞法分析器來返回一個記號給語法分析器。
3. 編寫First和Follow函數,實現其求解過程。
測試文法:
A->BCDE
B->aBA|ε
C->F|ε
D->b|c|ε
E->e|ε
F->d|ε

代碼片段和文件信息
#include?
using?namespace?std;
char?st[20];???//存儲輸入句子
int?i=0;??????//數組下標
void?E();??????
void?R();//E‘
void?T();
void?H();//T‘
void?F();
//***********************************
//檢錯部分
int?comp(char?s1string?s2);
int?error_check(int?n);
string?firfol[5]={“(i““)+e““(i““+*)e““(i“};
string?synch[5]={“)““““+)““““+*)“};
char?s[5]={‘E‘‘R‘‘T‘‘H‘‘F‘};
int?error_check(int?n){
?if(comp(st[i]synch[n])==1){
?cout<<“彈出非終結符“<?return?0;
?}
?else?while(comp(st[i]firfol[n])==0&&comp(st[i]synch[n])==0&&st[i]!=‘#‘){
?cout<<“輸入串跳過記號“< ?i++;
?}
?return?1;
}
int?comp(char?s1string?s2){
?for(int?j=0;j ?if(s1==s2[j])
?return?1;
?}
?return?0;
}
//*****************************
void?main(){
?cout<<“使用的文法為:\nE->TE‘\nE‘->+TE‘|e\nT->FT‘\nT‘->*FT‘|e\nF->(E)|id\n“;
?cout<<“-------------------“< ?cout<<“輸入待檢測串(以?#?結束):“< ?cin>>st;
?cout<<“-------------------“< ?cout< ????E();
?if(st[i]!=‘#‘){
?cout<<“輸入串跳過記號?“< ?i++;
?E();
?}system(“pause“);
}
void?E(){
?if(error_check(0)==0||st[i]==‘#‘);
?else{
?cout<<“E->TE‘“< ????????T();
????????R();
?}
}
void?R(){
?if(error_check(1)==0);
?else{
?if(st[i]==‘+‘){
?cout<<“E‘->+TE‘“< ????????????i++;
????????????T();
????????????R();
?}
?else?
?cout<<“T‘->e“< ?}
}
void?T(){
?if(error_check(2)==0);
?else{
?cout<<“T->FT‘“< ????????F();
????????H();
?}
}
void?H(){
?if(error_check(3)==0);
?else{
?if(st[i]==‘*‘){
?cout<<“T‘->*FT‘“< ????????????i++;
????????????F();
????????????H();
?}
?else?
?cout<<“T‘->e“< ?}
}
void?F(){
?if(error_check(4)==0);
?else{
?if(st[i]==‘i‘){
i++;
?if(st[i]==‘d‘)
?{
?cout<<“F->id“< ?i++;
?}
?}
?else
?if(st[i]==‘(‘){
?cout<<“F->(E)“< ????????????????i++;
????????????????E();
?if(st[i]==‘)‘){
?i++;
?}
?else?if(st[i]!=‘)‘)
?cout<<“括號不匹配“< ?}
?}
}
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2013-04-27?19:07??test\
?????文件????????2127??2013-05-27?18:47??test\digui.cpp
?????文件????????4562??2013-05-27?18:47??test\feidigui.cpp
?????文件???????32256??2013-04-22?21:35??test\第三次上機作業-語法分析1.doc
評論
共有 條評論