pl0語言的語法分析

2021-09-20 07:10:25 字數 3543 閱讀 6681

實驗內容

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以及個...