資源描述:
《編譯原理預(yù)測分析法實驗報告(c語言)》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、編譯原理實驗報告目的要求1.構(gòu)造文法的語法分析程序,要求采用預(yù)測分析法對輸入的字符串進行語法分析。2.加深對預(yù)測分析LL(1)分析法的理解和掌握。實驗內(nèi)容對文法G進行語法分析,文法G如下所示:*0.S→a*/*1.S→^*2.S→(T)*3.T→SW**4.W→,SW*5.W→ε;并對任給的一個輸入串進行語法分析檢查。程序要求能對輸入串進行預(yù)測分析,能判別程序是否符合已知的語法規(guī)則,如果不符合(編譯出錯),則輸出錯誤信息。程序輸入/輸出示例:輸入:一個以#結(jié)束的符號串:例如:(a,a)#輸出:步數(shù)分析棧輸
2、入串所用規(guī)則(1)#S(a,a))#2源程序://LL(1)預(yù)測分析控制程序#include#include#includecharstr[100];//存儲待分析的句子constcharT[]="a^(),#";//終結(jié)符,分析表的列符constcharNT[]="STW";//非終結(jié)符,分析表的行符/*指向產(chǎn)生式右部符號串*/constchar*p[]={/*0.S→a*/"a",/*1.S→^*/"^",/*2.S→(T)*/"(T)",/*
3、3.T→SW*/"SW",/*4.W→,SW*/",SW",/*5.W→ε;*/""};//設(shè)M[i][j]=x,通過p[M[i][j]]=p[x]獲取右部符號串。constintM[][6]={/*a^(),#*//*S*/{0,1,2,-1,-1,-1},/*T*/{3,3,3,-1,-1,-1},/*W*/{-1,-1,-1,5,4,-1}};voidinit()//輸入待分析的句子{printf("請輸入待分析的句子(以$結(jié)束):");scanf("%s",str);}intlin(charc
4、);//非終結(jié)符轉(zhuǎn)換為行號intcol(charc);//終結(jié)轉(zhuǎn)換為列號boolisNT(charc);//isNT判斷是否是非終結(jié)符boolisT(charc);//isT判斷是否是終結(jié)符。voidmain(void){inti,j=0;intflag=1,flag2=0;charA;//設(shè)置指示句子的當(dāng)前字符charstack[20]={'#','S'};//棧賦初值inttop=1;//設(shè)置棧頂指針charX='';//存儲棧頂字符init();A=str[0];printf("t步數(shù)t分析棧
5、t輸入串t所用規(guī)則");//在屏幕上輸出列表標(biāo)題while(1){printf("t(%d)t",++j);//輸出當(dāng)前執(zhí)行步數(shù)for(i=0;i<=top;i++)//輸出當(dāng)前棧的內(nèi)容(出棧前){printf("%c",stack[i]);}printf("t");for(i=flag-1;str[i]!='$';i++){printf("%c",str[i]);}if(flag2==1){printf("t%d",M[lin(X)][col(A)]);flag2=0;}//出棧X=s
6、tack[top--];if(X=='#')//是結(jié)束符{if(X==A)//是結(jié)束符{printf("tAcc");}elseprintf("tERROR");break;}elseif(isT(X))//是終結(jié)符{A=str[flag++];}elseif(isNT(X))//是否是非終結(jié)符{flag2=1;//逆序入棧for(i=strlen(p[M[lin(X)][col(A)]])-1;i>=0;i--){stack[++top]=*(p[M[lin(X)][col(A)]]+i);
7、}}else{printf("Errorinmain()>%c",X);exit(0);}}}intlin(charc){for(inti=0;i<(int)strlen(NT);i++){if(c==NT[i]){returni;}}printf("Errorinlin()>%c",c);exit(0);}intcol(charc){for(inti=0;i<(int)strlen(T);i++){if(c==T[i])returni;}printf("Errorincol()>%c",c)
8、;exit(0);}boolisNT(charc)//是否是非終結(jié)符{for(inti=0;i<(int)strlen(NT);i++){if(c==NT[i])returntrue;}returnfalse;}boolisT(charc)//是否是終結(jié)符(不包括'#'){for(inti=0;i<(int)strlen(T)-1;i++){if(c==T[i]){returntrue;}}returnfalse;}程序運行截