




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
中南大學(xué)編譯原理
實(shí)驗(yàn)報(bào)告班級(jí):計(jì)科1205姓名:趙越學(xué)號(hào):0909122209實(shí)驗(yàn)ー詞法分析程序設(shè)計(jì)與實(shí)現(xiàn)ー、實(shí)驗(yàn)?zāi)康募由顚?duì)詞法分析器的工作過程的理解;加強(qiáng)對(duì)詞法分析方法的掌握;能夠采用一種編程語言實(shí)現(xiàn)簡(jiǎn)單的詞法分析程序;能夠使用自己編寫的分析程序?qū)?jiǎn)單的程序段進(jìn)行詞法分析。二、實(shí)驗(yàn)內(nèi)容自定義ー種程序設(shè)計(jì)語言,或者選擇已有的?種高級(jí)語言,編制它的詞法分析程序。詞法分析程序的實(shí)現(xiàn)可以采用任何一種編程語言和編程工具。從輸入的源程序中,識(shí)別出各個(gè)具有獨(dú)立意義的單詞,即關(guān)鍵字、標(biāo)識(shí)符、常數(shù)、運(yùn)算符、界符。并依次輸出各個(gè)單詞的內(nèi)部編碼及單詞符號(hào)自身值。(遇到錯(cuò)誤時(shí)可顯示“Error”,然后跳過錯(cuò)誤部分繼續(xù)顯示)三、實(shí)驗(yàn)要求:.對(duì)單詞的構(gòu)詞規(guī)則有明確的定義;.編寫的分析程序能夠正確識(shí)別源程序中的單詞符號(hào);.識(shí)別出的單詞以く種別碼,值〉的形式保存在符號(hào)表中,正確設(shè)計(jì)和維護(hù)符號(hào)表;.對(duì)于源程序中的詞法錯(cuò)誤,能夠做出簡(jiǎn)單的錯(cuò)誤處理,給出簡(jiǎn)單的錯(cuò)誤提示,保證順利完成整個(gè)源程序的詞法分析;四、實(shí)驗(yàn)步驟.定義目標(biāo)語言的可用符號(hào)表和構(gòu)詞規(guī)則;.依次讀入源程序符號(hào),對(duì)源程序進(jìn)行單詞切分和識(shí)別,直到源程序結(jié)束;.對(duì)正確的單詞,按照它的種別以〈種別碼,值〉的形式保存在符號(hào)表中;.對(duì)不正確的單詞,做出錯(cuò)誤處理。五、設(shè)計(jì)思路和實(shí)現(xiàn)過程本實(shí)驗(yàn)是詞法分析器,我是用的是MFC實(shí)現(xiàn)的,我的設(shè)計(jì)思路就是按照書上提示的算法,先將兒個(gè)詞法分析器所需的基本函數(shù)用C++的形式實(shí)現(xiàn),然后使用循環(huán)語句讀入輸入串的每ー個(gè)字符,然后用if…else…語句實(shí)現(xiàn),具體判斷方式如下:1、如果讀入的是字母,那么繼續(xù)讀入,知道讀入的字符不是字母或者數(shù)字為止,對(duì)照標(biāo)識(shí)符表,如果是標(biāo)識(shí)符,則顯示該串及對(duì)應(yīng)標(biāo)識(shí)符;如果不是,則顯示該串和“$ID”;2、如果讀入的是數(shù)字,則繼續(xù)讀入,知道不是數(shù)字為止,并顯示該串和“$INT”;3、如果讀入的是“則分別輸出該串和"ASSIGN”,”$PLUS”,'SEMICOLON","$LPAR","$RPAR","$LBRACE","$RBRACE”;4、如果讀入的是那么繼續(xù)讀入,如果下ー個(gè)是則輸出該串和"$POWER〃;否則輸出該串和‘'$STAR",并將指針回退;5、如果獨(dú)到輸入串末尾,則退出。六、錯(cuò)誤處理創(chuàng)建一個(gè)鍵,如果讀岀的字符不屬于以上任何情況,則把此鍵置為真,通知程序退出循環(huán),從而實(shí)現(xiàn)對(duì)錯(cuò)誤的處理。七、關(guān)鍵代碼voidCWordanalysisDlg::GetChar()(ch=minput.GetAt(pointer);pointer++;voidCWord_analysisDlg::Concat()(strToken+=ch;}voidCWord_analysisDlg::GetBC()(while(ch==1')GetChar();voidCWord_analysisDlg::Retract(){pointerーー;ch二’';intCWordanalysisDlg::Reserve()(//if(strcmp(stricken,))inti;for(i=l;iく15;i++)if(strcmp(strToken,Token[i])==0)returni;return0;boolCWord_analysisDlg::IsLetter(){if(ch〉ニ'a'&&ch<='z'||ch>='A'&&ch<='Z')returntrue;elsereturnfalse;I7ヽboolCWordanalysisDlg::IsDigit(){if(ch>=O'&&ch<='9')returntrue;elsereturnfalse;voidCWord_analysisDlg::0nAnalysis()(//TODO:Addyourcontrolnotificationhandlercodeherem_list.DeleteAllItems();pointer=0;UpdateDataO;m_input+='\0';while(pointer<m_input.GetLength()-1)(if(end)break;Analysis();)voidCWord_analysisDlg::Analysis()strToken=;GetCharO;GetBC();if(IsLetterO){while(IsLetter()|IlsDigitO){ConcatO;GetCharO;}Retract();code=Reserve();if(code==0)(mlist.InsertItem(index,strToken);m_list.SetltemText(index,1,〃$ID");index++;return;)else(m_list.Insertltem(index,strToken);m_list.SetltemText(index,1,Token[code]);index++;return;elseif(IsDigit())(while(IsDigit()){Concat();GetCharO;}Retract();m_list.InsertItern(index,strToken);m_list.SetltemText(index,1,*$INT*);index++;return;)elseif(ch=='二’)Insertltem(index,strToken);mlist.SetltemText(index,1,"$ASSIGN");index++;return;)elseif(ch=='+')(mlist.InsertItem(index,strToken);m_list.SetltemText(index,1,"$PLUS");index++;return;)elseif(ch=='*')(GetCharO;if(ch=='*')(m_list,InsertItem(index,strToken);m_list.SetltemText(index,1,”$POWER〃);index++;return;)else(Retract();(m_list.InsertItem(index,strToken);m_list.SetltemText(index,1,”$STAR");index++;return;)elseif(ch==';)lnsertltem(index,strToken);mlist.SetltemText(index,1,?z$SEMIC0L0N*);index++;return;)elseif(ch=='(')(mlist.InsertItem(index,strToken);m_list.SetltemText(index,1,*$LPAR#);index++;return;)elseif(ch==')')(m_list.InsertItem(index,strToken);m_list.SetltemText(index,1,*$RPAR/Z);index++;return;)else if(ch=='{')(m_list.InsertItem(index,strToken);m_list.SetltemText(index,1,ZZ$LBRACE/Z);index++;return;)elseif(ch=='}')(m_list.InsertItem(index,strToken);mlist.SetltemText(index,1,”$RBRACE");index++;return;)elseif(ch=='\0,)end=l;return;else(AfxMessageBox("出入錯(cuò)誤”);pointer=rainput.GetLengthO;return;)實(shí)驗(yàn)二LL(1)文法語法分析設(shè)計(jì)一.實(shí)驗(yàn)?zāi)康?熟悉判斷LL(1)文法的方法及對(duì)某輸入串的分析過程。.學(xué)會(huì)構(gòu)造表達(dá)式文法的預(yù)測(cè)分析表。二.實(shí)驗(yàn)內(nèi)容編寫ー個(gè)語法分析程序,對(duì)于給定的輸入串,能夠判斷識(shí)別該串是否為給定文法的句型。三.實(shí)驗(yàn)步驟從鍵盤讀入輸入串,并判斷正誤;若無誤,由程序自動(dòng)構(gòu)造FIRST、FOLLOW集以及SELECT集合,判斷是否為L(zhǎng)L(1)文法;若符合LL(1)文法,由程序自動(dòng)構(gòu)造LL(1)分析表;由算法判斷輸入符號(hào)串是否為該文法的句型【源代碼】#include“stdio.h"#include"stdlib.h"#defineMaxRuIeNum8defineMaxVnNum5defineMaxVtNum5defineMaxStackDepth20defineMaxPLength20defineMaxStLength50structpRNode/?產(chǎn)生式右部結(jié)構(gòu)?/(intrCursor;/?右部序號(hào)?/structpRNode*next;};structpNode/?產(chǎn)生式結(jié)點(diǎn)結(jié)構(gòu)*/(intICursor;/?左部符號(hào)序號(hào)?/intrLength;/?右部長(zhǎng)度?//?注當(dāng)rLength=1時(shí),rCursor=T為空產(chǎn)生式?/structpRNode*rHead;/?右部結(jié)點(diǎn)頭指針?/);charVn[MaxVnNum+1];/*非終結(jié)符集?/intvnNum;charVt[MaxVtNum+1];/?終結(jié)符集?/intvtNum;structpNodeP[MaxRuIeNum];/?產(chǎn)生式?/intPNum;/?產(chǎn)生式實(shí)際個(gè)數(shù)?/charbuffer[MaxPLength+1];charch;/*符號(hào)或stringch;*/charst[MaxStLength];/*要分析的符號(hào)串?/structcolIectNode/?集合元素結(jié)點(diǎn)結(jié)構(gòu)*/(intnVt;/?在終結(jié)符集中的下標(biāo)?/structcolIectNode*next;);structcoIIectNode*first[MaxVnNum+1];"first集?/structcoIIectNode*follow[MaxVnNum+1];"follow集?/intanaIyseTabIe[MaxVnNum+1][MaxVtNum+1+1];"預(yù)測(cè)分析表存放為產(chǎn)生式的編號(hào),+1用于存放結(jié)束符,多+1用于存放#(T)*/intanaIyseStack[MaxStackDepth+1];"分析棧?/inttopAnalyse;"分析棧頂?/"intreverseStack[MaxStackDepth+1];"顛倒順序棧?/"inttopReverse;"倒敘棧頂?/voidInit();"初始化?/intIndexCh(charch);"返回Vn在Vn表中的位置+100、Vt在Vt表中的位置,7表示未找到?/voidInputVt();"輸入終結(jié)符?/voidInputVnO;/?輸入非終結(jié)符?/voidShowChArray(char*collect,intnum);"輸出Vn或Vt的內(nèi)容?/voidInputP();/?產(chǎn)生式輸入?/boolCheckP(char*st);/?判斷產(chǎn)生式正確性?/voidFirst(intU);/?計(jì)算first集,LH>xx...*/voidAddFirst(intU,intnCh);"加入first集?/boolHaveEmpty(intnVn);"判斷first集中是否有空(T)*/voidFollow(intV);"計(jì)算千〇IIow集?/voidAddFolIow(intV,intnCh,intkind);"加入follow集,kind=0表加入follow集,kind=1加入first集?/voidShowCoIIect(structcolIectNode**collect);"輸出first或follow集?/voidFirstFollow();/?計(jì)算first和folIow*/voidCreateAT();/?構(gòu)造預(yù)測(cè)分析表?/voidShowAT();"輸出分析表?/voidIdentify(char*st);"主控程序,為操作方便?/"分析過程顯示操作為本行變換所用,與教程的顯示方式不同?/voidInitStackO;/?初始化棧及符號(hào)串?/voidShowStack();/?顯示符號(hào)棧中內(nèi)容?/voidPop();"棧頂出棧?/voidPush(intr);/?使用產(chǎn)生式入棧操作?/#incIude"LL1.hvoidmain(void)chartodo,ch;Init();InputVn();InputVt();InputPO;getchar();FirstFollow();printf("所得first集為:");ShowCoIlect(first);printf(“所得follow集為:つ;ShowCoIlect(foIIow);CreateAT0;ShowAT();todo二'y';whiIeCy*=todo)(printf("\n是否繼續(xù)進(jìn)行句型分析?(y/n):");todo=getchar();whileCy'!=todo&&'n'!=todo)(printf("\n(y/n)?");todo=getchar();}if('y'=todo)(inti;InitStackO;printf("請(qǐng)輸入符號(hào)串(以#結(jié)束):“);ch=getchar();i=0;while,#'!=ch&&i<MaxStLength)(ifC'!=ch&&''n'!=ch)(st[i++]=ch;}ch=getchar();)ifC#'=ch&&i<MaxStLength)(st[i]=ch;Identify(st);eIseprintf("輸入出錯(cuò)!\n");1}getchar();}voidInit()(inti,j;vnNum=0;vtNum=0;PNum=0;for(i=0;i<=MaxVnNum;i++)Vn[i]ハ(X;for(i=0;i<=MaxVtNum;i++)Vt[i]=](X;for(i=0;i<MaxRuleNum;i++)(P[i].ICursor=NULL;P[i].rHead=NULL;P[i].rLength=0;}PNum=0;for(i=0;i<=MaxPLength;i++)buffer[i]=1\0,;for(i=0;i<MaxVnNum;i++)(first[i]=NULL;follow[i]=NULL;)for(i=0;i<=MaxVnNum;i++)(for(j=0;j<=MaxVnNum+1;j++)analyseTable[i][j]=-1;)}/?返回Vn在Vn表中的位置+100、Vt在Vt表中的位置,7表示未找到*/intIndexCh(charch)(intn;n=0;/*isVn?*/while(ch!=Vn[n]&&‘、〇’!=Vn[n])n++;ifC\0*!=Vn[n])return100+n;n=0;/*isVt?*/while(ch!=Vt[n]&&'、〇’!=Vt[n])n++;if('、〇'!=Vt[n])returnn;return-1;)/?輸出Vn或Vt的內(nèi)容?/voidShowChArray(char*collect)(intk=0;whiIe(''〇'!=collect[k])(printfC%c’、coIIect[k++]);}printf("'n");)/?輸入非終結(jié)符?/voidInputVn()(intinErr=1;intn,k;charch;whiIe(inErr)(printf("'n請(qǐng)輸入所有的非終結(jié)符,注意:“);printf("請(qǐng)將開始符放在第一位,并以#號(hào)結(jié)束:'n〃);ch='';n=0;/?初始化數(shù)組?/whiIe(n<MaxVnNum)[Vn[n++]='\0';)n=0;while(('r!=ch)&&(n<MaxVnNum))(if(''!=ch&&''n'!=ch&&-1=IndexCh(ch))Vn[n++]=ch;vnNum++;ch=getchar():)Vn[n]=,#,;/?以“ダ標(biāo)志結(jié)束用于判斷長(zhǎng)度是否合法?/k=n;/*k用于記錄n以便改Vn[n]='、0’*/if('#'!=ch)(if('#'!=(ch=getchar()))(while('#'!=(ch=getchar()))printf("\n符號(hào)數(shù)目超過限制!'n");inErr=1;continue;))/?正確性確認(rèn),正確則,執(zhí)行下下面,否則重新輸入?/Vn[k]='、〇';ShowChArray(Vn);ch='';while('y'!=ch&&'n'!=ch)Iif('\n"!=ch)Iprintf("輸入正確確認(rèn)?(y/n):");)scanf("%c”,&ch);)if('n'=ch)(printf("錄入錯(cuò)誤重新輸入!'n");inErr=1;)eIse[inErr=0;/?輸入終結(jié)符?/voidInputVt()(intinErr=1;intn,k;charch;while(inErr)(printf("\n請(qǐng)輸入所有的終結(jié)符,注意:");printf("以#號(hào)結(jié)束:、n");ch='';n=0:/?初始化數(shù)組?/whiIe(n<MaxVtNum)(Vt[n++]='\0';)n=0:while(C#'!=ch)&&(n<MaxVtNum))(ifC'!=ch&&'\n'!=ch&&-1=IndexCh(ch))(Vt[n++]=ch;vtNum++;)ch=getchar();)Vt[n]= ;/?以u(píng)#n標(biāo)志結(jié)束?/k=n;/*k用于記錄n以便改Vt[n]='、0'*/if('#'!=ch)(if('#'!=(ch=getchar()))(whileC#'!=(ch=getchar()))printf(''、n符號(hào)數(shù)目超過限制!、n");inErr=1;continue;))/*正確性確認(rèn),正確則,執(zhí)行下下面,否則重新輸入*/Vt[k]='、〇';ShowChArray(Vt);chゴ’;whileCy'!=ch&&'n'!=ch)(if('\n'!=ch)(printf("輸入正確確認(rèn)?(y/n):");}scanfぐ’%c",&ch);}ifCn*=ch)(printf("錄入錯(cuò)誤重新輸入!'n〃);inErr=1;1eIse(inErr=0;}}1/?產(chǎn)生式輸入?/voidInputPO(charch;inti=0,n,num;printf(“請(qǐng)輸入文法產(chǎn)生式的個(gè)數(shù):");scanf("%d",&num);PNum=num;getchar();/?消除回車符*/printf("\n請(qǐng)輸入文法的%d個(gè)產(chǎn)生式,并以回車分隔每個(gè)產(chǎn)生式:“,num);printf("\n");whiIe(iくnum)(printf("第%d個(gè):“,i);/?初始化?/for(n=0;n<MaxPLength;n++)buffer[n]二‘、。';/?輸入產(chǎn)生式串?/ch二',;n二。;while,'n'!=(ch二getchar())&&n<MaxPLength)(if(''!=ch)buffer[n++]二ch;)buffer[n]二,'〇';/*printf("%s",buffer);*/if(CheckP(buffer))(/?填寫入產(chǎn)生式結(jié)構(gòu)體?/pRNode*pt,*qt;P[i].ICursor二|ndexCh(buffer[0]);pt=(pRNode*)maIloc(sizeof(pRNode));pt->rCursor=IndexCh(buffer[3]);pt->next=NULL;P[i].rHead=pt;n=4;while(‘、〇’!=buffer[n])Iqt=(pRNode*)maIIoc(sizeof(pRNode));qt->rCursor=IndexCh(buffer[n]);qt->next=NULL;pt->next=qt;pt=qt;n++;}P[i].rLength=n-3;i++;/?調(diào)試時(shí)使用?/)eIseprintf(〃輸入符號(hào)含非法在成分,請(qǐng)重新輸入!、バ);})/?判斷產(chǎn)生式正確性?/booICheckP(char*st)(intn;if(100>IndexCh(st[0]))returnfalse;ifCコ!=stロ])returnfalse;ifO'!=st[2])returnfalse;for(n=3;'、〇'!=st[n];n++)(if(-1==IndexCh(st[n]))returnfalse;)returntrue;)/*=========ニニ=first&f〇||ow二======ニニニニニ二=ニニ*//?計(jì)算fjrst集,U->xx...*/voidFirst(intU)inti,j;for(i=0;i<PNum;i++)(if(P[i].ICursor=U)(structpRNode*pt;pt=P[i].rHead;j=0;while(j<P[i].rLength)(if(100>pt->rCursor)(/?注:此處因編程出錯(cuò),使空產(chǎn)生式時(shí)rlength同樣是!,故此處同樣可處理空產(chǎn)生式?/AddFirst(U,pt->rCursor);break;)eIse(if(NULL=first[pt->rCursor-100])(First(pt->rCursor);)AddFirst(U,pt->rCursor);if(!HaveEmpty(pt->rCursor))(break;)eIse(pt=pt->next;))j++;)if(j>=P[i].rLength)/?當(dāng)產(chǎn)生式右部都能推出空時(shí)?/AddFirst(U,-1);/?加入first集?/voidAddFirst(intU,intnCh)/?當(dāng)數(shù)值小于100時(shí)nCh為Vt*//?當(dāng)處理非終結(jié)符時(shí),AddFirst不添加空項(xiàng)(-1)*/structcolIectNode*pt,*qt;intch;/?用于處理Vn*/pt=NULL;qt=NULL;if(nCh<100)(pt=first[U-100];whiIe(NULL!=pt)(if(pt->nVt==nCh)break;eIse(qt=pt;pt=pt->next;})if(NULL=pt)(pt=(structcollectNode*)maIIoc(sizeof(structcolIectNode));pt->nVt=nCh;pt->next=NULL;if(NULL=first[U-100])(first[U-100]=pt;}eIse(qt->next=pt;/*qt指向first集的最后ー個(gè)元素?/)pt=pt->next;eIse(pt=first[nCh-100];while(NULL!=pt)(ch=pt->nVt;if(-1!=ch)[AddFirst(U,ch);pt=pt->next;)/?判斷first集中是否有空(T)*/booIHaveEmpty(intnVn)(if(nVn<100)/?為終結(jié)符時(shí)(含ー1),在follow集中用到?/returnfalse;structcolIectNode*pt;pt=first[nVn-100];whiIe(NULL!=pt)(if(-1==pt->nVt)returntrue;pt=pt->next;)returnfalse;I/?計(jì)算follow集,例:U->xVy,U->xV.(注:初始符必含#——"-1")*/voidFollow(intV){inti;structpRNode*pt;if(100=V)/?當(dāng)為初始符時(shí)?/AddFollow(V,-1,0);for(i=0;i<PNum;i++)(pt=P[i].rHead;while(NULL!=pt&&pt->rCursor!=V)/?注此不能處理:Uー〉xVyVz的情況?/pt=pt->next;if(NULL!=pt)(pt=pt->next;/*V右側(cè)的符號(hào)?/if(NULL=pt)/*當(dāng)V后為空時(shí)Vー〉xV,將左符的follow集并入V的follow集中?/(if(NULL=follow[P[i].ICursor-100]&&P[i].ICursor!=V)(Follow(P[i].ICursor);}AddFoIIow(V,P[i].ICursor,0);)else/?不為空時(shí)Vー〉xVy,(注意:y-??調(diào)用AddFollow加入Vt或y的first集?/(while(NULL!=pt&&HaveEmpty(pt->rCursor))AddFollow(V,pt->rCursor,1):/*y的前綴中有空時(shí),加如first集?/pt=pt->next;}if(NULL=pt)/?當(dāng)后面的字符可以推出空時(shí)?/(if(NULL=follow[P[i].ICursor-100]&&P[i],ICursor!=V)(Follow(P[i].ICursor);)AddFoIIow(V,P[i].ICursor,0);}else/?發(fā)現(xiàn)不為空的字符時(shí)?/(AddFollow(V,pt->rCursor,1);))))}/?當(dāng)數(shù)值小于100時(shí)nCh為Vt*//*#用T表示,kind用于區(qū)分是并入符號(hào)的first集,還是follow集kind=〇表加入follow集,kind=1加入first集?/voidAddFollow(intV,intnCh,intkind)(structcoIIectNode*pt,*qt;intch;/?用于處理Vn*/pt=NULL;qt=NULL;if(nCh<100)/?為終結(jié)符時(shí)?/Ipt=follow[V-100];while(NULL!=pt)(if(pt->nVt==nCh)break;eIse(qt=pt;pt=pt->next;}Iif(NULL=pt)pt=(structcolIectNode*)ma11oc(sizeof(structcolIectNode));pt->nVt=nCh;pt->next=NULL;if(NULL=follow[V-100])(follow[V-100]=pt;}eIseIqt->next=pt;/*qt指向follow集的最后ー個(gè)元素?/}pt=ptー〉next;))else/?為非終結(jié)符時(shí),要區(qū)分是加first還是follow*/Iif(0=kind)(pt=follow[nCh-100]:whiIe(NULL!=pt)(ch=pt->nVt;AddFollow(V,ch,0);pt=pt->next;))eIse(pt=first[nCh-100];whiIe(NULL!=pt)(ch=pt->nVt;if(-1!=ch)(AddFoIIow(V,ch,1);)pt=pt->next;)/?輸出first或follow集?/voidShowCo11ect(structcolIectNode**coIIect)structcolIectNode*pt;i=0;while(NULL!=collect[i])(pt=coIIect[i];printf("\n%c:\t",Vn[i]);whiIe(NULL!=pt)(if(-1!=pt->nVt)[printf("紀(jì)”,Vt[pt->nVt]);)eIseprintf("#");pt=pt->next;)i++;}printf("\n");)/?計(jì)算first和f011ow*/voidFirstFollow()(inti;i=0;whileC\0'!=Vn[i])(if(NULL=first[i])First(100+i);i++;]i=0;whileC\0'!=Vn[i])(if(NULL=follow[i])Follow(100+i);i++;}}/*==== ===構(gòu)造預(yù)測(cè)分析表,例:U::xyz */voidCreateAT()(inti;structpRNode*pt;structcolIectNode*ct;for(i=0;i<PNum;i++)pt=P[i].rHead;whiIe(NULL!=pt&&HaveEmpty(pt->rCursor))(/?處理非終結(jié)符,當(dāng)為終結(jié)符時(shí),定含空為假跳出?/ct=first[pt->rCursor-100];whiIe(NULL!=ct)[if(-1!=ct->nVt)analyseTable[P[i],(Cursor-100][ct->nVt]=i;ct=ct->next;}pt=pt->next;)if(NULL=pt)(/*NULL=pt,說明xyz->,用到follow中的符號(hào)?/ct=follow[P[i].ICursor-100];whiIe(NULL!=ct)(if(-1!=ct->nVt)analyseTable[P[i],ICursor-100][ct->nVt]=i;else/?當(dāng)含有#號(hào)時(shí)?/analyseTable[P[i],ICursor-100][vtNum]=i;ct=ct->next:))eIse(if(100<=pt->rCursor)/?不含空的非終結(jié)符?/(ct=first[pt->rCursor-100];whiIe(NULL!=ct)(analyseTable[P[i].ICursor-100][ct->nVt]=i;ct-ct->next;))else/?終結(jié)符或者空?/Iif(-1=pt->rCursor)/*-1為空產(chǎn)生式時(shí)?/ct=follow[P[i],ICursor-100];whiIe(NULL!=ct)(if(-1!=ct->nVt)analyseTable[P[i].ICursor-100][ct->nVt]=i;else/?當(dāng)含有#號(hào)時(shí)?/analyseTable[P[i].ICursor-100][vtNum]=i;ct=ct->next;))else/?為終結(jié)符?/(analyseTable[P[i].ICursor-100][pt->rCursor]=i;)))))/*輸出分析表?/voidShowAT()(inti,j;printf("構(gòu)造預(yù)測(cè)分析表如下:'n");printf("\t|Vt");for(i=0;i<vtNum;i++)(printf("%c\t”,Vt[i]);1printf("#\t\n");printf \t| \t");for(i=0;i<=vtNum;i++)printfぐ’ \t");printf("\n");for(i=0;i<vnNum;i++)(printf("%c\tI\t",Vn[i]);for(j=0;j<=vtNum;j++)(if(-1!=analyseTable[i][j])printf("R(%d)\t",analyseTable[i][j]);elseprintf("error、ピ);)printf("\n");))/*============主控程序=============*/voidIdentify(char*st)(intcurrent,step,r;/*r表使用的產(chǎn)生式的序號(hào)?/printf("\n%s的分析過程:、n”,st);printf("步驟ゝt分析符號(hào)棧、t當(dāng)前指示字符、t使用產(chǎn)生式序號(hào)、n");step=0;current=0;/?符號(hào)串指示器?/printf("%d\t”,step);ShowStack();printf(z/\t\t%c\t\t \n”,st[current]);while。#'!=st[current])(if(100>anaIyseStack[topAnaIyse])/?當(dāng)為終結(jié)符時(shí)?/(if(anaIyseStack[topAnaIyse]=IndexCh(st[current]))(/?匹配出棧,指示器后移?/Pop0;current++;step++;printf("%d\t”,step);ShowStack();printf("\t\t%c\t\t出棧、后移、n〃,st[current]);eIse(printf("%c-%c不匹配!”,anaIyseStack[topAnaIyse],st[current]);printf(〃此串不是此文法的句子!'n");return;11else/?當(dāng)為非終結(jié)符時(shí)?/(r=anaIyseTabIe[anaIyseStack[topAnaIyse]-100][IndexCh(st[current])];if(-1!=r)(Push(r);/?產(chǎn)生式右部代替左部,指示器不移動(dòng)?/step++;printf("%d\t",step);ShowStack();printf(,,\t\t%c\t\t%d\n,,1st[current],r):1else(printf("無可用產(chǎn)生式,此串不是此文法的句子!'n");return;)))if('#'==st[current])(if(O==topAnaIyse&&'#'=st[current])(step++;printfぐ‘%d\t”,step);ShowStack();printf("\t\t%c\t\t分析成功!\n”,st[current]);printf("%s是給定文法的句子!'n”,st);eIse{while(topAnaIyse>0){if(100>anaIyseStack[topAnaIyse])/?當(dāng)為終結(jié)符時(shí)?/{ printf(“無可用產(chǎn)生式,此串不是此文法的句子!'n〃);return;1eIse{r=anaIyseTabIe[anaIyseStack[topAnaIyse]-100][vtNum];if(-1!=r){Push(r);/?產(chǎn)生式右部代替左部,指示器不移動(dòng)?/step++;printf("%d't",step);ShowStack();if(0==topAnaIyse&&'#'=st[current]){printf("'t't%c't't分析成功!'n”,st[current]);printf("%s是給定文法的句子!'n”,st);)eIseprintf("\t\t%c\t\t%d\n",st[current],r); }eIse{printf(〃無可用產(chǎn)生式,此串不是此文法的句子!'n");return;}1)))/*初始化棧及符號(hào)串?/voidInitStack()Iinti;/?分析棧的初始化?/for(i=0;i<MaxStLength;i++)st[i]=[0,;analyseStack[O]=-1;/*#(-1)入棧*/analyseStack[1]=100;/?初始符入棧*/topAnaIyse=1;)/?顯示符號(hào)棧中內(nèi)容*/voidShowStack(){inti;for(i=0;i<=topAnaIyse;i++){if(100<=analyseStack[i])printf(,z%cz,,Vn[anaIyseStack[i]-100]);eIse{if(-1!=anaIyseStack[i])printf(/z%czz,Vt[anaIyseStack[i]]);elseprintf(/z#zz);11)/?棧頂出棧*/voidPop(){topAnaIyse—;1/?使用產(chǎn)生式入棧操作?/voidPush(intr){inti;structpRNode*pt;Pop();pt=P[r].rHead;if(-1==pt->rCursor)/?為空產(chǎn)生式時(shí)?/return;topAnaIyse+=P[r].rLength;for(i=0;i<P[r].rLength;i++){/?不為空產(chǎn)生式時(shí)?/anaIyseStack[topAnaIyse-i]=ptー〉rCursor;/?逆序入棧*/pt-pt->next;レ?循環(huán)未完時(shí)pt為空,則說明rLength記錄等出錯(cuò)?/四.實(shí)驗(yàn)結(jié)果請(qǐng)輛人所有的非終結(jié)符,汪怠:請(qǐng)將開始存放在弟一包,幵以4號(hào)結(jié)兎:SHMAttSHNA輸入正確確認(rèn)?<y/n>:V輸入正確確認(rèn)?<y/n>:y請(qǐng)輸入所有的終結(jié)符,注意:以苗號(hào)結(jié)束:adbe輸入正破確認(rèn)?(y/n):y看輸入受法產(chǎn)生式的個(gè)數(shù)」?jié)n輸入文法的7個(gè)產(chǎn)生式,并以回車分隔每個(gè)產(chǎn)生式:第0個(gè):S->aH第1個(gè):H->aMd第2個(gè):H->d第3個(gè):M->Ab第4個(gè):M->第5個(gè):A->aM第6個(gè):A->e所得£i?st集為:所得fol103集為:adbeItSR<0>errorerrorerrorerrorR<1>R<2>errorerrorerrorMR<3>R<4>R<4>R<3>errorAR<5>errorerrorR<6>errory■■是構(gòu)造預(yù)測(cè)分析表如下:SHMA請(qǐng)輸入符號(hào)串(以?結(jié)束):■N的,分析過程,步彝 分析符號(hào)棧 當(dāng)前指示字符 使用產(chǎn)生式序號(hào)無可用產(chǎn)生式,此串不是此文法的句子!是否繼續(xù)進(jìn)行句型分析?<y/n>:<y/n>?V<y/n>?<y/n>?y請(qǐng)輸入符號(hào)串(以?結(jié)束):aaabdttaaabd*的分;步驟則..棧程號(hào)過符當(dāng)前指示字符使用產(chǎn)生式序號(hào)。 USa——1 UHca02 MHa出棧、后移3 ItdMaa14 ttdh1a出棧、后移5 ttdbAa36 ttdbMaa57 ttdbMb出棧、后移8 Vdl)b4dユ0 nA中氯易物UabdJt是ム定文法的句子!n分柝戰(zhàn)功!是否繼續(xù)進(jìn)行句型分析?<y/n>:五.實(shí)驗(yàn)總結(jié)通過這次的實(shí)驗(yàn),我深入了解了詞法分析器和LL(1)文法預(yù)測(cè)分析法設(shè)計(jì)和實(shí)現(xiàn),增強(qiáng)了我的自學(xué)能力和獨(dú)立思考能力,也讓我對(duì)程序設(shè)計(jì)有了更大的興趣,自己通過查找資料、復(fù)習(xí)課本、編程調(diào)試,寫實(shí)驗(yàn)報(bào)告等環(huán)節(jié),進(jìn)ー步掌握了以前學(xué)到的知識(shí),并且還對(duì)編譯原理應(yīng)用有了更深入的認(rèn)識(shí)與掌握。在完成這個(gè)程序后,真的很開心,也了使我解到編譯原理的魅カ所在,激發(fā)了我要解決更多更難問題的決心。實(shí)驗(yàn)ーLR分析器設(shè)計(jì)與實(shí)現(xiàn)第一章概述本課程設(shè)計(jì)完成了以下內(nèi)容:.實(shí)現(xiàn)了對(duì)任意給定的文法G,識(shí)別文法活前綴的OE4、。必的狀態(tài)轉(zhuǎn)化矩陣及ムマ(0)項(xiàng)目集規(guī)范族的構(gòu)造;.判斷該文法是否為厶Z?(0)文法,實(shí)現(xiàn)了以?(0)分析表的構(gòu)造,并輸出到指定文件中;.實(shí)現(xiàn)了厶/?(0)分析器總控程序,對(duì)輸入的表達(dá)式進(jìn)行文法分析。第二章 設(shè)計(jì)的基本原理本課程設(shè)計(jì)的核心算法”主要有三點(diǎn):L識(shí)別文法活前綴的OFA、。必的狀態(tài)轉(zhuǎn)化矩陣及ムR(0)項(xiàng)目集規(guī)范族的構(gòu)造;2.厶/?(0)分析表的構(gòu)造;3.厶7?(0)分析器總控程序的構(gòu)造。識(shí)別文法的LR(O)項(xiàng)目集規(guī)范族的構(gòu)造采用e-QLOSURE(閉包)的構(gòu)造ー個(gè)文法G的ムZ?(0)項(xiàng)目規(guī)范簇。假定,是文法G,的任一項(xiàng)目集,定義和構(gòu)造,的閉包。厶。SURE")的算法:/的任何項(xiàng)目都屬于CLOSURE^);(2)若A-aB0屬于CLOSURE⑴,那么,對(duì)任何關(guān)于5的產(chǎn)生式8fア,項(xiàng)目8fア也屬于CLOSURE(I);(3)重復(fù)執(zhí)行上述兩個(gè)步驟直至CLOSURE^)不再增大。其中初始,={S,fE},5,為對(duì)文法G進(jìn)行拓廣構(gòu)造G,而引進(jìn)的不出現(xiàn)在G中的非終結(jié)符。定義狀態(tài)轉(zhuǎn)換函數(shù)GO,GO(/,X)的第一個(gè)變?cè)?是一個(gè)項(xiàng)目集,第二個(gè)變?cè)猉是ー個(gè)文法符號(hào)。函數(shù)值GO(/,X)定義為GOa,X)=CLOSURE(1/)。其中J={任何形如AfaXタ的項(xiàng)目丨AraXタ屬于/}LR(O)分析表的構(gòu)造假定C={/°,ム,…/“}。令每個(gè)項(xiàng)目集ム的下標(biāo)作為分析器的狀態(tài)。特別是,令那個(gè)包含項(xiàng)目S->S的集合人的下標(biāo)k為分析器的初態(tài)。分析表的AC77ON子表和GOT。子表可按如下方法構(gòu)造:(1)若項(xiàng)目Afa。タ屬于ム且GO(4,a)=/,,a為終結(jié)符,則置ACTIONlk?為“把(j,a)移近棧”,簡(jiǎn)記為“5ノ”。(2)若項(xiàng)目Afa屬于/*,那么對(duì)于任何終結(jié)符a(或結(jié)束符#),置AC77ON伙,a]為“用產(chǎn)生式Afタ進(jìn)行規(guī)約”,簡(jiǎn)記為“ゲ(假定產(chǎn)生式Afa是文法G"的第j個(gè)產(chǎn)生式)⑶若項(xiàng)目SIS屬于/*,則置AC77ON伙,a]為“接受”,簡(jiǎn)記為“acc”。(4)若GO(/*,A)=ム,則置ACTION伙,A]=j.(5)分析表中凡不能用規(guī)則1?4填入信息的空白處均置上“報(bào)錯(cuò)標(biāo)志”。如果分析表中任何ー項(xiàng)被重復(fù)填入,則說明分析表的入口不是唯一的,項(xiàng)目集中存在沖突項(xiàng)目,該文法不是厶R(0)文法。LR(O)分析器總控程序構(gòu)造ムR(0)分析表包括量部分,“動(dòng)作”AC77ON表和“狀態(tài)轉(zhuǎn)換”GOTO表。ん。7y。y中,0規(guī)定了當(dāng)狀態(tài)5面臨輸入符號(hào)。時(shí)應(yīng)采取什么動(dòng)作。GOTO[s,X]規(guī)定了狀態(tài)s面對(duì)文法符號(hào)X時(shí)下ー狀態(tài)是什么。每ー項(xiàng)ACTION[s,a]所規(guī)定的動(dòng)作不外乎是下述四種可能之ー。(1)移進(jìn)把(s,a)的下一狀態(tài)s,=GOTQs,X]和輸入符號(hào)。推進(jìn)棧,下ー輸入符號(hào)變成現(xiàn)行輸入符號(hào)。(2)歸約指用某ー產(chǎn)生式A-タ進(jìn)行規(guī)約。假若月的長(zhǎng)度為「,規(guī)約的動(dòng)作是,去除棧頂?shù)膔個(gè)項(xiàng),使?fàn)顟B(tài)s,?變成棧頂狀態(tài),然后把0-4)的下ー狀態(tài)『=GOTO[s吁八川推進(jìn)棧。規(guī)約動(dòng)作不改變現(xiàn)行輸入符號(hào)。規(guī)約動(dòng)作不改變現(xiàn)行輸入符號(hào)。(3)接受宣布分析成功,停止分析器工作(4)報(bào)錯(cuò)發(fā)現(xiàn)源程序含有錯(cuò)誤,調(diào)用出錯(cuò)處理程序。第三章 程序設(shè)計(jì)程序總體構(gòu)架本課程設(shè)計(jì)開發(fā)的程序主要由4張表組成,分別為:符號(hào)表Sig〃一List、產(chǎn)生式表Formula_List>L/?(0)表LRO_Table和項(xiàng)目集規(guī)范簇表Closure_List〇同時(shí),項(xiàng)目集規(guī)范簇表包含ー個(gè)分析棧作為ムZ?(0)分析器總控程序。產(chǎn)生式表包含符號(hào)表作為子表,項(xiàng)目集規(guī)范簇表包含產(chǎn)生式表、ZJ?(O)表作為子表。程序工作流程:.讀取含有文法規(guī)則的文件,為該文法中的每一個(gè)不同的文法符號(hào)(終結(jié)符和非終結(jié)符分配ー個(gè)編號(hào)),記錄文法符號(hào)的屬性(終結(jié)符/非終結(jié)符),存儲(chǔ)于ー,張符號(hào)表Sign_List中;.再次讀取文件,將產(chǎn)生式存儲(chǔ)于產(chǎn)生式表ド。/厶ぶ中;.根據(jù)產(chǎn)生式構(gòu)建厶Z?(0)項(xiàng)目集規(guī)范族,存儲(chǔ)于表Closure_List中;.根據(jù)構(gòu)建的ン?(0)項(xiàng)目集規(guī)范族構(gòu)建厶/?(0)分析表,填寫厶/?(0)分析表同時(shí)檢查該文法是否為厶Z?(0)文法;.對(duì)于輸入的表達(dá)式,レ?(0)分析器根據(jù)構(gòu)建的n?(0)分析表進(jìn)行文法分析,給出分析結(jié)果。
程序存儲(chǔ)結(jié)構(gòu)符號(hào)表存儲(chǔ)結(jié)構(gòu)Ararry_Index動(dòng)態(tài)數(shù)組下標(biāo),同時(shí)作為符號(hào)的編號(hào)Identity標(biāo)識(shí)符Is_Vn是否為非終結(jié)符產(chǎn)生式表存儲(chǔ)結(jié)構(gòu)Formula_Num產(chǎn)生式標(biāo)號(hào)Vn_Name非終結(jié)符標(biāo)號(hào)(與Sign_Lisi中的Ararry_Index一致)Formula指示當(dāng)前非終結(jié)符V〃ーName的產(chǎn)生式Formula_Length當(dāng)前非終結(jié)符い〃ーName產(chǎn)生式的長(zhǎng)度,用于幫助區(qū)分一個(gè)產(chǎn)生式的不同項(xiàng)目,即項(xiàng)目個(gè)數(shù)等于Formula_Length+1Next_Vn指示下ー個(gè)非終結(jié)符Sign_Name一個(gè)產(chǎn)生式中的標(biāo)識(shí)符名(與Sign_List中的Ararry_Index一致)Next_Signー個(gè)產(chǎn)生式中的下ー個(gè)標(biāo)識(shí)符1)定義二兀組:Item_Name_Type=<Formula_Num,Formula_Item>Formula_Num:產(chǎn)生式標(biāo)號(hào),與Formula一List中的Formula_Num一致Formula_Item:ー個(gè)產(chǎn)生式的第,個(gè)項(xiàng)目,可由Z7。ケ%か。_Lis/中的Formula_Length幫助確定如:產(chǎn)生式Wー>E:W->E<1,1>,W->E<1,2>Closure_List結(jié)構(gòu):Current_State當(dāng)前狀態(tài)編號(hào)Next_State指示下一狀態(tài)Item指示閉包中的項(xiàng)目Item_Name閉包中的項(xiàng)目名Destination當(dāng)前項(xiàng)目的GotoSet產(chǎn)生的新狀態(tài)的編號(hào),即狀態(tài)轉(zhuǎn)移的目的地狀態(tài)編號(hào)Next_Item閉包中的下ー個(gè)項(xiàng)目GoToSet_Parent待構(gòu)造的GoTo項(xiàng)目的閉包的ParentGoToSet_Child待構(gòu)造的GoTo項(xiàng)目的閉包Current_Parent待構(gòu)造狀態(tài)的ParentCurrent_Child待構(gòu)造狀態(tài)的項(xiàng)目LRQ_Table_Child指示表頭的孩子結(jié)點(diǎn)LRO_Table_Parent指示表頭的后繼結(jié)點(diǎn)Operation指示該表項(xiàng)的操作Oprand指示該表項(xiàng)的操作數(shù)Has_Been_Filled指示該表項(xiàng)是否被填寫過,用于判斷文法是否為レ?(0)文法3.3程序算法3.1項(xiàng)目集規(guī)范族的構(gòu)造(初始化)將初始條件作為該狀態(tài)頭結(jié)點(diǎn)的第一個(gè)孩子結(jié)點(diǎn),并構(gòu)造該孩子結(jié)點(diǎn)的閉包,連接其后,GoToSejPare〃,指向第一個(gè)狀態(tài)頭結(jié)點(diǎn),GoToSet_Child指向第一個(gè)狀態(tài)頭結(jié)點(diǎn)的第一個(gè)孩子結(jié)點(diǎn);查看GoToSet_Parent,若為空,停止;若不為空,轉(zhuǎn)3;查看GoToSet_Child,若為空,轉(zhuǎn)4;若不為空,構(gòu)造GoToSef_C/n/"的GoToSet,檢査該狀態(tài)與之前構(gòu)造的狀態(tài)有無重復(fù),若重復(fù),則停止構(gòu)造,GoToSerー。J〃イ的。esガ〃両沁〃填寫重復(fù)的已存在的狀態(tài)的編號(hào);若不重復(fù),則作為ー個(gè)新狀態(tài),連接于arre〃f_Pare而,并構(gòu)造其閉包連接其后,GoToSet_Child指向Next_State。轉(zhuǎn)2;GoToSet_Pare〃,指向下ー狀態(tài),若下一狀態(tài)為空,則結(jié)束,否則,GoToSet_Child指向下ー狀態(tài)頭結(jié)點(diǎn)的第一個(gè)孩子結(jié)點(diǎn),轉(zhuǎn)3〇具體細(xì)節(jié):設(shè)GoToSer_C7n7d所指項(xiàng)目為<,">,因?yàn)橐獙?duì)其構(gòu)造閉包,該項(xiàng)目一定不是終態(tài),所以區(qū)分項(xiàng)目的圓點(diǎn)符號(hào)位于第,個(gè)標(biāo)識(shí)符的左側(cè)?,F(xiàn)在構(gòu)造<"/>的閉包,分兩個(gè)步驟實(shí)現(xiàn):.構(gòu)造GoToSet_Child的GoToSet:查看Formula_Length中編號(hào)為i的產(chǎn)生式,取得該產(chǎn)生式的長(zhǎng)度屬性Formula_Length若j之Formula_Length+1,則停止構(gòu)造當(dāng)前閉包(已是終態(tài)),此時(shí)GoToSet_Child的Destination項(xiàng)填ー1;2)否則,將+ 作為該閉包的第一個(gè)項(xiàng)目設(shè)機(jī),此時(shí)GoToSejCが,d的Destination項(xiàng)填該新狀態(tài)的狀態(tài)編號(hào)。.構(gòu)造該孩子結(jié)點(diǎn)的閉包:查看Formula_List中編號(hào)為i的產(chǎn)生式的第,+1個(gè)標(biāo)識(shí)符,取得該標(biāo)識(shí)符的Sign_Name,查看Sign_Lisi中該標(biāo)識(shí)符的類別屬性/3)若為1(非終結(jié)符),則查看ドorm”ルーLisf非終結(jié)符Sig”的所有產(chǎn)生式,記這些產(chǎn)生式的編號(hào)為Sig〃.,將所有的<Sign_Name_i,1>加入閉包4)否則,結(jié)束.檢查該狀態(tài)與之前構(gòu)造的狀態(tài)有無重復(fù):斷言:任意兩個(gè)狀態(tài),只要G%5々不同,則即為不同狀態(tài)。3.3.2LR(O)分析表構(gòu)造對(duì)于編號(hào)為,?的狀態(tài),現(xiàn)依據(jù)其項(xiàng)目<「國(guó)〉填寫ン?(0)分析表:.如果該項(xiàng)目形如Xf…丫…,查看該項(xiàng)目的Destination屬性,k=Destinationi)若丫為終結(jié)符,則在表的狀態(tài),對(duì)應(yīng)行,對(duì)應(yīng)列,填寫s*,表示將把伏,わ移進(jìn)棧2)若y為非終結(jié)符,則在表的狀態(tài)i對(duì)應(yīng)行,’「對(duì)應(yīng)列,填寫ス,表示狀態(tài)轉(zhuǎn)移至え狀態(tài).如果該項(xiàng)目形如xfy1)若ド為起始符號(hào),則置在表的狀態(tài)i對(duì)應(yīng)行,#對(duì)應(yīng)列,填寫acc,表示接受。2)否則,對(duì)任何終結(jié)符或結(jié)束符#,則在表的狀態(tài)i對(duì)應(yīng)行,’「對(duì)應(yīng)列,填寫(,表示用產(chǎn)生式p進(jìn)行規(guī)約。第四章程序測(cè)試以文法G為例:W-£E^aAElbBAfcAAfdBtcBBid程序模塊輸入:含上述文法的文件,下面展示個(gè)模塊的輸出結(jié)果1符號(hào)表測(cè)試continue11010100k01234567ooooooooNNNNNNNNPcontinue11010100k01234567ooooooooNNNNNNNNP輸出F-3KWJZr4-H3443(=1圖6符號(hào)表測(cè)試與預(yù)期結(jié)果相同產(chǎn)生式表測(cè)試drC:\VmOYS\systea32\cad.exe|e<w>ー)!《e〉1<E>->2<a>3<A>1<E>>>4<b>5<B>3<A>->6<c>3<A>□<A>->7<d>5<B>->6<c>5<B>5<B>->7<d>?i*essanykeytocontinue...圖7產(chǎn)生式表測(cè)試輸出結(jié)果與讀入的文件中的產(chǎn)生式相同,且產(chǎn)生式中符號(hào)的編號(hào)正確項(xiàng)目集規(guī)范族表測(cè)試 e01r012345678911P?>yeXZ1KZVZ10H11__k! e01r012345678911P?>yeXZ1KZVZ10H11__k!14711-11-,,**********33y1222322322,,n**********46a1123245367くく<<<<<<<<<<s::s<4,1,5>,く<4,1,5>く6,1,8>.tocont
輸出結(jié)果為く狀態(tài)編號(hào)〉:く產(chǎn)生式編號(hào),產(chǎn)生式項(xiàng)目編號(hào),項(xiàng)目轉(zhuǎn)移的目標(biāo)狀態(tài)〉與預(yù)期結(jié)果相同LR(0)分析表測(cè)試,|D|x|state計(jì)010020
ard006926539746ssrsrrsrrrC005825538746ssrsrrsrrrB0001
0001000
gb300020530746srrrrrr0
A004001000000
state計(jì)010020
ard006926539746ssrsrrsrrrC005825538746ssrsrrsrrrB0001
0001000
gb300020530746srrrrrr0
A004001000000
9gtoa200020530746
s1*rrrrrynsse0000000000r圖9レ?(0)分析表測(cè)試輸出結(jié)果為厶/?(0)分析表,與預(yù)期結(jié)果相同LR(O)分析器測(cè)試以輸入字符串a(chǎn)cccd#和acad#為例|caC:\fIID0fS\syste?32\cad.exeLccdttNoerrorfoundacadtterrorat3pressanykeytocontinue.表達(dá)式的分析結(jié)果正確第五章 總結(jié)和展望完成了編譯原理課程設(shè)計(jì)之后,我感到十分的疲憊,但是那ー份富有成就感的欣喜卻勝過了那十分的疲憊。由于本次選題匆忙,選了一道比較有難度的題目,在做課程設(shè)計(jì)的過程中,我翻閱了很多相關(guān)資料,對(duì)課本中點(diǎn)到即止的知識(shí)進(jìn)行了更加深入的學(xué)習(xí),有了更加深入的理解。做課程設(shè)計(jì)的過程是痛苦的,我在這ー個(gè)星期內(nèi)多次熬夜戰(zhàn)斗,有時(shí)甚至顧不上吃飯,只為了揪出程序中的錯(cuò)誤,只為了精益求精的完成這個(gè)課程設(shè)計(jì)。就在我寫這份總結(jié)的時(shí)候,我發(fā)現(xiàn)自己我ー點(diǎn)也不累了,反而很興奮,很有成就感。通過本次課程設(shè)計(jì),我發(fā)現(xiàn)實(shí)踐是檢驗(yàn)學(xué)習(xí)深度、學(xué)習(xí)成果的唯一途徑,課本上的知識(shí)點(diǎn)都是濃縮的精華,在理論闡述上不可能做到面面俱到,學(xué)到的知識(shí)當(dāng)然也不可能直接運(yùn)用到實(shí)際情況上。在實(shí)踐的過程中,我們需要將我們學(xué)習(xí)到的知識(shí)進(jìn)行ー定程度的擴(kuò)充,本次課程設(shè)計(jì)涉及到算法,LR分析器自動(dòng)構(gòu)造程序的機(jī)制原理以及C++語言。在用C++語言實(shí)現(xiàn)本次課程設(shè)計(jì)的過程中,我更加熟悉了C++語言的語法機(jī)制,語言規(guī)范;在實(shí)現(xiàn)LR分析器自動(dòng)構(gòu)造程序的過程中,我更加熟悉了其構(gòu)造程序的原理以及與之相關(guān)的算法。由于時(shí)間匆忙,我完成的課程設(shè)計(jì)還有很多不足之處,很多工作還可以繼續(xù)完善,在提交作業(yè)之后,我不會(huì)把它放在那里一看不看的,我會(huì)繼續(xù)完善它,讓它更加人性化,具有可操作性,比如做個(gè)可視化的界面出來,豐富它的功能,相信以后的工作將更加多彩豐富,更加有成就感!參考文獻(xiàn)[1]陳火旺,劉春林,譚慶平,趙克佳,劉越程序設(shè)計(jì)語言編譯原理國(guó)防エ業(yè)出版社2006[2]譚浩強(qiáng)C++程序設(shè)計(jì)清華大學(xué)出版社2007附錄說明:本附錄中包含了本次課程設(shè)計(jì)的所有代碼ClosureList.h#ifndefCLOSURE_LIST_HttdefineCLOSURE,IST_H#include"FormulaList,h”#include"LR0_Table.h"structItem_Name_Type{intFormula_Num;intFormula_Item;};structClosure_ChiIdNode(Item_Name_TypeItemName;intDestination;Closure_Child_Node*Next」tem;};structClosure_Parent_Node(intCurrent_State;C1osure_Parent_Node*Next_State;C1osure_Chi1d_Node*Item;};classClosureListprivate:C1osure_Parent_Node*Closure_List_head;Closure_Parent_Node*GoToSet_Parent;ClosureParentNode*CurrentParent;Closure_Child_Node*GoToSet_ChiId;ClosureChildNode*Current_Child;intAmountOfState;Formula_Listsub_Formula_List;LROTablesubLROTable;public:ClosureList():subFormulaList(),subLROTable()(Closure_List_head=NULL;GoToSetParent=NULL;Current_Parent=NULL;GoToSetChild=NULL;Current_Child=NULL;AmountOf_State=0;Create_Closure_List(););、Closure_List();voidprint_Closure_List();voidmake_LR0_Table();voidprintLROTable();voidOutput_LRO_Table_ToFile();boolSentence_Analyse(constcharSentence[50]);private:voidAdd_Clousure();boolAddGoToSet();voidSet_Initial_State();voidCreate_Closure_Ust();boolIs_Same_State_Exist(constintFormula_Num,constintFormula」tem,int&Same_State_Num);voidDestroy_Closure_List();};#endifFormula_List.h#ifndefFORMULALISTII^defineFORMULA,IST_H#include*Sign_List.h*structFormulaListChilditem(intSignName;Formu1a_List_Childltem*Next_Sign;);structFormulaListParentitem(intFormulaNum;intVn_Name;intFormulaLength;Formu1a_List_Parentitem*Next_Vn;FormulaListChilditem*Formula;};classFormula_List{private;Formu1a_List_Parentltem*Formu1a_List_head;Formula_List_ChiIdltern*current_Formula_Itern;Formula_List_ParentItem*current_VnNode;Sign_ListSub_Sign_List;public:Formula_List():Sub_Sign_List()(Formu1a_List_head=NULL;current_Formula_Item=NULL;current_VnNode=NULL;Create_Formula_Ust(););Formula_List();voidprint_Formula_List();intint_checkSignName(constcharword);charchar_check_Sign_Name(constintSign_Name);intGetFormulaLength(constintFormulaNum);intGet_Sign_Name(constintFormula_Num,constintItem_Num);intGetFormulaLeftVn(constintFormulaNum);boolIs_Sign_Name_Vn(constintSignName);intGetAmountOf_Identity();private:voidDestroy_Formula_List();voidCreateFormulaList0;};ttendifLR0_Table.h#ifndefLROTABLE_H^defineLRO_TABLE_H#include<iostream>#include<fstream>usingnamespacestd;^include"ConstValue.h"structLRO_Table_Child(charOperation;intOprand;boolHas_Been_Filled;LRO_Table_ChiId*Next_Table_ChiId;};structLR0_Tab1e_Parent(LRO_Table_Child*Table_Child;.RO_Table_Parent*Next_Tab1e_Parent;};classLR0_Tableprivate:LROTableParent*LROTablehead;LRO_Table_Parent*Current_Parent;LROTableChild*CurrentChild;public:LROTable0;"LRO_Table();voidinitial(constintAmountOfState,constintAmountOfIdentity);boolFill_In_Table(constintState_Num,constintIdentity_Num,constcharcharOpration,constintintOprand);void_OutputToFile();voidprintLROTableO;voidVisit_LRO_Tab1e(constintState_Num,constintIdentity_Num,char&charOpration,int&intOprand);private:voidDe
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 工程施工的重點(diǎn)和難點(diǎn)及保證措施
- 【中考模擬】2025年江蘇省鎮(zhèn)江市第三中學(xué)數(shù)學(xué)中考練習(xí)卷(含解析)
- 斷橋鋁窗安裝現(xiàn)場(chǎng)監(jiān)督質(zhì)量保證措施
- 十四五規(guī)劃房地產(chǎn)調(diào)控心得體會(huì)
- 危重患者轉(zhuǎn)運(yùn)及交接操作流程他
- 小學(xué)合唱社團(tuán)藝術(shù)交流計(jì)劃
- 民用建筑施工進(jìn)度計(jì)劃
- 成人教育教育信息化能力提升培訓(xùn)心得體會(huì)
- 以延吉市XX中學(xué)為例剖析高中化學(xué)習(xí)題課教學(xué)現(xiàn)狀與提升路徑
- 以市場(chǎng)為導(dǎo)向:中國(guó)美術(shù)學(xué)院藝術(shù)設(shè)計(jì)職業(yè)技術(shù)學(xué)院專業(yè)設(shè)置變革與實(shí)踐
- T∕HGJ 12402-2021 石油化工裝置火災(zāi)緊急隔離控制閥設(shè)計(jì)標(biāo)準(zhǔn)
- 辦公用紙項(xiàng)目建設(shè)實(shí)施方案
- 2024版《53天天練單元?dú)w類復(fù)習(xí)》3年級(jí)語文下冊(cè)(統(tǒng)編RJ)附參考答案
- 辣椒購(gòu)銷合同范本
- 13J927-3 機(jī)械式停車庫(kù)設(shè)計(jì)圖冊(cè)
- 裝卸工安全培訓(xùn)課件
- 高位截癱護(hù)理查房
- 2024圖書約稿合同范本
- 肥料代理合作協(xié)議書
- 檢修作業(yè)培訓(xùn)
- 山東省煙臺(tái)市2024-2025學(xué)年高二化學(xué)下學(xué)期期末考試試題
評(píng)論
0/150
提交評(píng)論