資源描述:
《編譯原理預(yù)測分析法實(shí)驗(yàn)報(bào)告(C語言編寫)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、編譯原理實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)名稱:預(yù)測分析法姓名:專業(yè)班級:計(jì)科學(xué)號:指導(dǎo)老師:日期:2011年6月1日目的要求1.構(gòu)造文法的語法分析程序,要求采用預(yù)測分析法對輸入的字符串進(jìn)行語法分析。2.加深對預(yù)測分析LL(1)分析法的理解和掌握。實(shí)驗(yàn)內(nèi)容對文法G進(jìn)行語法分析,文法G如下所示:*0.S→a*/*1.S→^*2.S→(T)*3.T→SW**4.W→,SW*5.W→ε;并對任給的一個(gè)輸入串進(jìn)行語法分析檢查。程序要求能對輸入串進(jìn)行預(yù)測分析,能判別程序是否符合已知的語法規(guī)則,如果不符合(編譯出錯(cuò)),則輸出錯(cuò)誤信息。程
2、序輸入/輸出示例:輸入:一個(gè)以#結(jié)束的符號串:例如:(a,a)#輸出:步數(shù)分析棧輸入串所用規(guī)則(1)#S(a,a))#2源程序://LL(1)預(yù)測分析控制程序#include#include#includecharstr[100];//存儲(chǔ)待分析的句子constcharT[]="a^(),#";//終結(jié)符,分析表的列符constcharNT[]="STW";//非終結(jié)符,分析表的行符/*指向產(chǎn)生式右部符號串*/constchar*p[]={/*0
3、.S→a*/"a",/*1.S→^*/"^",/*2.S→(T)*/"(T)",/*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("請輸入待分析的
4、句子(以$結(jié)束):");scanf("%s",str);}intlin(charc);//非終結(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='
5、';//存儲(chǔ)棧頂字符init();A=str[0];printf("t步數(shù)t分析棧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){prin
6、tf("t%d",M[lin(X)][col(A)]);flag2=0;}//出棧X=stack[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>=
7、0;i--){stack[++top]=*(p[M[lin(X)][col(A)]]+i);}}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
8、(c==T[i])returni;}printf("Errorincol()>%c",c);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(