資源描述:
《實(shí)驗(yàn)二 語法分析(算符優(yōu)先).doc》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、實(shí)驗(yàn)二語法分析實(shí)驗(yàn)報(bào)告一、實(shí)驗(yàn)題目算符優(yōu)先分析程序二、實(shí)驗(yàn)內(nèi)容及要求(1)根據(jù)給定文法,先求出FirstVt和LastVt集合,構(gòu)造算符優(yōu)先關(guān)系表(要求算符優(yōu)先關(guān)系表輸出到屏幕或者輸出到文件);(2)根據(jù)算法和優(yōu)先關(guān)系表分析給定表達(dá)式是否是該文法識(shí)別的正確的算術(shù)表達(dá)式(要求輸出歸約過程)(3)給定表達(dá)式文法為:G(E’):E’→#E#E→E+T
2、TT→T*F
3、FF→(E)
4、i(4)分析的句子為:(i+i)*i和i+i)*i三、程序源代碼:#include#include#inclu
5、de#include#defineSIZE128charpriority[6][6];//算符優(yōu)先關(guān)系表數(shù)組charinput[SIZE];//存放輸入的要進(jìn)行分析的句子charremain[SIZE];//存放剩余串charAnalyseStack[SIZE];//分析棧voidanalyse();inttestchar(charx);//判斷字符X在算符優(yōu)先關(guān)系表中的位置voidremainString();//移進(jìn)時(shí)處理剩余字符串,即去掉剩余字符串第一個(gè)字符intk;v
6、oidinit()//構(gòu)造算符優(yōu)先關(guān)系表,并將其存入數(shù)組中{priority[0][0]='>';priority[0][1]='<';priority[0][2]='<';priority[0][3]='<';priority[0][4]='>';priority[0][5]='>';priority[1][0]='>';priority[1][1]='>';priority[1][2]='<';priority[1][3]='<';priority[1][4]='>';priority[1][5]='>';prio
7、rity[2][0]='>';priority[2][1]='>';priority[2][2]='$';//無優(yōu)先關(guān)系的用$表示priority[2][3]='$';priority[2][4]='>';priority[2][5]='>';priority[3][0]='<';priority[3][1]='<';priority[3][2]='<';priority[3][3]='<';priority[3][4]='=';priority[3][5]='$';priority[4][0]='>';priorit
8、y[4][1]='>';priority[4][2]='$';priority[4][3]='$';priority[4][4]='>';priority[4][5]='>';priority[5][0]='<';priority[5][1]='<';priority[5][2]='<';priority[5][3]='<';priority[5][4]='$';priority[5][5]='=';}voidanalyse()//對(duì)所輸入的句子進(jìn)行算符優(yōu)先分析過程的函數(shù){inti,j,f,z,z1,n,n1,z2,n
9、2;intcount=0;//操作的步驟數(shù)chara;//用于存放正在分析的字符charp,Q,p1,p2;f=strlen(input);//測(cè)出數(shù)組的長(zhǎng)度for(i=0;i<=f;i++){a=input[i];if(i==0)remainString();if(AnalyseStack[k]=='+'
10、
11、AnalyseStack[k]=='*'
12、
13、AnalyseStack[k]=='i'
14、
15、AnalyseStack[k]=='('
16、
17、AnalyseStack[k]==')'
18、
19、AnalyseStack[k]=='
20、#')j=k;elsej=k-1;z=testchar(AnalyseStack[j]);//從優(yōu)先關(guān)系表中查出s[j]和a的優(yōu)先關(guān)系if(a=='+'
21、
22、a=='*'
23、
24、a=='i'
25、
26、a=='('
27、
28、a==')'
29、
30、a=='#')n=testchar(a);else//如果句子含有不是終結(jié)符集合里的其它字符,不合法{printf("錯(cuò)誤!該句子不是該文法的合法句子!");break;}p=priority[z][n];if(p=='$'){printf("錯(cuò)誤!該句子不是該文法的合法句子!");return
31、;}if(p=='>'){for(;;){Q=AnalyseStack[j];if(AnalyseStack[j-1]=='+'
32、
33、AnalyseStack[j-1]=='*'
34、
35、AnalyseStack[j-1]=='i'
36、
37、AnalyseStack[j-1]=='('
38、
39、AnalyseStack[j-1]==')'
40、
41、Anal