實驗內容
1、算術表示式文法:
vn =
其中:e為開始符號;
vt =
其中:id代表識別符號,要求是長度不超過10的字母序列;num代表常數,要求是正整數;
文法規則集如下:
e→te』
e』→+te』| -te』 |ε
t→ft』
t』→ft』| /ft』 |ε
f→(e) | id | num
2、實驗步驟
(1)按照文法求出每個非終結符的first和follow集(手工計算並在實驗報告中抄寫即可,不要求程式實現);
(2)針對給出的表示式文法,構造遞迴下降分析程式;
3、程式功能要求
(1)程式通過標準輸入按行讀取使用者輸入,表示式在1行內讀完。
(2)程式對使用者輸入的內容首先進行詞法分析處理(可以復用實驗一的部分**,由於詞法規則更簡單,可以大大簡化),詞法分析得到的詞法單位對應文法中的終結符。
(3)對於使用者輸入的表示式,如果經過分析後語法正確,給出相應提示。如果分析過程中遇到錯誤不需要嘗試恢復分析,停止該次分析過程即可,但應盡量給出說明性較強的錯誤提示。
下面給出一些驗證語法分析結果正確性的測試用例:
正確:a+3*( b + c/10) -4 +5
錯誤:a+3 ( b + c/10)
錯誤:(1+2)(3-4)
錯誤:(1+2
#include
using namespace std;
const
int n=
1e5+10;
string s1[11]
=;string s2[14]
=;string str1;
int d1=
0,len=
11,len2=
14,x=0;
vectorg;
struct node
;vectorg1;
bool e()
;bool e1()
;bool t()
;bool t1()
;bool f()
;bool isao
(int i)
}return0;
}int
main()
while
(ii++;}
if(i>=len1)
break;if
(isalpha
(str1[i]))
string temp;
while
(iisalpha
(str1[i]))
);temp="";
}}i++;}
if(temp!="")
}if(k==g.
size()
)else
g1.push_back()
; cout<<
")"
isdigit
(str1[i]))
string temp;
for(i;i)else
else
break;}
}if(temp!=
" "));
}}elseif(
isao
(i))
if(d1)
if(str1[i]
==':'))
;}else
i+=2
;}else);
}}i++;}
}else
cout<<
"error"
}}}}
for(
int i=
0;isize()
;i++
) x=0;
if(e(
))else
return0;
}bool e()
node t1=g1[x]
; string type=t1.type;
string value=t1.value;
cout<<
"e "
"("||type==
"id"
||type==
"num")if
(!e1(
))}else
return1;
}bool e1()
if(x==g1.
size()
) node t1=g1[x]
; string type=t1.type;
string value=t1.value;
cout<<
"e1 "
"+")if(
!e1()
)}else
if(value==
"-")if(
!e1()
)}else
if(value==
")"||value==
"#")
else
return1;
}bool t()
node t1=g1[x]
; string type=t1.type;
string value=t1.value;
cout<<
"t "
"("||type==
"id"
||type==
"num")if
(!t1(
))}else
return1;
}bool t1()
if(x==g1.
size()
) node t1=g1[x]
; string type=t1.type;
string value=t1.value;
cout<<
"t1 "
"*"||value==
"/")if(
!t1()
)}else
if(value==
"+"||value==
"-"||value==
")")
else
return1;
}bool f()
node t1=g1[x]
; string type=t1.type;
string value=t1.value;
cout<<
"f "
"(")
if(x>=g1.
size()
) node t2=g1[x];if
(t2.value!=
")")
else
}else
if(type==
"id"
||type==
"num"
)else
return1;
}
編譯原理 PL 0語言詞法分析
輸入pl 0語言源程式 輸出二元式序列,單詞種類,單詞的值 該語言的保留字,識別符號以及數字可用乙個狀態機來識別,其餘符號可用乙個單獨的狀態機來識別。正規式如下 字母開頭 letter letter digit 數字開頭 digit digit 符號省略 將正規式轉換為dfa 首先,規定幾個變數與函...
Linux環境下的針對PL0語言的語法詞法語義分析
摘 要 此次編譯原理課程設計,我利用flex工具進行pl 0語言的詞法分析 自己用c 語言實現了lr語法分析 語義分析以及中間 生成,我選擇的是布林表示式文法,對符合文法的布林表示式能夠產生相應四元式,處理了控制結構的真鏈與假鏈,對錯誤的表示式能夠給出錯誤提示。鑑於flex工具原本來自unix以及個...
Linux環境下的針對PL0語言的語法詞法語義分析
摘 要 此次編譯原理課程設計,我利用flex工具進行pl 0語言的詞法分析 自己用c 語言實現了lr語法分析 語義分析以及中間 生成,我選擇的是布林表示式文法,對符合文法的布林表示式能夠產生相應四元式,處理了控制結構的真鏈與假鏈,對錯誤的表示式能夠給出錯誤提示。鑑於flex工具原本來自unix以及個...