




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
課程編譯原理實(shí)驗(yàn)名稱實(shí)驗(yàn)二LL(1)分析法實(shí)驗(yàn)?zāi)康?1.掌握LL(1)分析法的基本原理;2.掌握LL(1)分析表的構(gòu)造方法;3.掌握LL(1)驅(qū)動程序的構(gòu)造方法。實(shí)驗(yàn)內(nèi)容及規(guī)定根據(jù)某一文法編制調(diào)試LL(1)分析程序,以便對任意輸入的符號串進(jìn)行分析。本次實(shí)驗(yàn)的目的重要是加深對預(yù)測分析LL(1)分析法的理解。對下列文法,用LL(1)分析法對任意輸入的符號串進(jìn)行分析:(1)E->TG(2)G->+TG(3)G->ε(4)T->FS(5)S->*FS(6)S->ε(7)F->(E)(8)F->i 程序輸入一以#結(jié)束的符號串(涉及+*()i#),如:i+i*i#。輸出過程如下:環(huán)節(jié)分析棧剩余輸入串所用產(chǎn)生式1Ei+i*i#E->TG............實(shí)驗(yàn)過程及結(jié)果代碼如下:#include<iostream>#include"edge.h"usingnamespacestd;edge::edge(){?cin>>left>>right; rlen=right.length(); if(NODE.find(left)>NODE.length())?NODE+=left;}stringedge::getlf(){?returnleft;}stringedge::getrg(){ returnright;}stringedge::getfirst(){ returnfirst;}stringedge::getfollow(){ returnfollow;}stringedge::getselect(){ returnselect;}stringedge::getro(){?stringstr; str+=right[0]; returnstr;}intedge::getrlen(){ returnright.length();}voidedge::newfirst(stringw){ inti;?for(i=0;i<w.length();i++)? if(first.find(w[i])>first.length())??first+=w[i];}voidedge::newfollow(stringw){ inti;?for(i=0;i<w.length();i++) if(follow.find(w[i])>follow.length()&&w[i]!='@')??follow+=w[i];}voidedge::newselect(stringw){?inti;?for(i=0;i<w.length();i++)?if(select.find(w[i])>select.length()&&w[i]!='@') ?select+=w[i];}voidedge::delfirst(){ inti=first.find('@');?first.erase(i,1);}intSUM;stringNODE,ENODE;//計(jì)算firstvoidfirst(edgeni,edge*n,intx){ inti,j;?for(j=0;j<SUM;j++)?{ ?if(ni.getlf()==n[j].getlf()) {? ?if(NODE.find(n[j].getro())<NODE.length())? ?{ ??for(i=0;i<SUM;i++)?? if(n[i].getlf()==n[j].getro())???first(n[i],n,x);???}? ?else ?n[x].newfirst(n[j].getro()); ?}?}}//計(jì)算followvoidfollow(edgeni,edge*n,intx){ inti,j,k,s;?stringstr;?for(i=0;i<ni.getrlen();i++) {? s=NODE.find(ni.getrg()[i]); ?if(s<NODE.length()&&s>-1)//是非終結(jié)符??if(i<ni.getrlen()-1)//不在最右 for(j=0;j<SUM;j++) if(n[j].getlf().find(ni.getrg()[i])==0) {? if(NODE.find(ni.getrg()[i+1])<NODE.length())? ?{?? for(k=0;k<SUM;k++) ? if(n[k].getlf().find(ni.getrg()[i+1])==0) ?? {????n[j].newfollow(n[k].getfirst());?? ?if(n[k].getfirst().find("@")<n[k].getfirst().length())? n[j].newfollow(ni.getfollow());?? ?} ? } ? else ? {? ??str.erase(); ? str+=ni.getrg()[i+1];? n[j].newfollow(str);? ?}? }? }}//計(jì)算selectvoidselect(edge&ni,edge*n){?inti,j;?if(ENODE.find(ni.getro())<ENODE.length()) {? ni.newselect(ni.getro());??if(ni.getro()=="@") ?ni.newselect(ni.getfollow());?} else?for(i=0;i<ni.getrlen();i++)?{? for(j=0;j<SUM;j++) ?if(ni.getrg()[i]==n[j].getlf()[0]) ?{?? ni.newselect(n[j].getfirst());???if(n[j].getfirst().find('@')>n[j].getfirst().length())???return;? } }}//輸出集合voidout(stringp){ inti; if(p.length()==0) return; cout<<"{";?for(i=0;i<p.length()-1;i++)?{?cout<<p[i]<<","; }?cout<<p[i]<<"}";}//連續(xù)輸出符號voidoutfu(inta,stringc){?inti; for(i=0;i<a;i++)?cout<<c;}//輸出預(yù)測分析表voidoutgraph(edge*n,string(*yc)[50]){?inti,j,k; boolflag;?for(i=0;i<ENODE.length();i++)?{?if(ENODE[i]!='@') {?? outfu(10,""); ?cout<<ENODE[i]; }?} outfu(10,"");?cout<<"#"<<endl; intx; for(i=0;i<NODE.length();i++)?{ outfu(4,"");? cout<<NODE[i]; outfu(5,"");? for(k=0;k<ENODE.length();k++)? {???flag=1; ?for(j=0;j<SUM;j++)???{?? ?if(NODE[i]==n[j].getlf()[0]) {?? ??x=n[j].getselect().find(ENODE[k]); ? ?if(x<n[j].getselect().length()&&x>-1)?? {? ? ?cout<<"->"<<n[j].getrg(); yc[i][k]=n[j].getrg(); ?outfu(9-n[j].getrlen(),"");??? ?flag=0;?? }?????x=n[j].getselect().find('#'); ? ?if(k==ENODE.length()-1&&x<n[j].getselect().length()&&x>-1) ?? {? ??cout<<"->"<<n[j].getrg(); ? ? ?yc[i][j]=n[j].getrg();???? } }? }?? if(flag&&ENODE[k]!='@')?? outfu(11,"");??} ?cout<<endl;?}}//分析符號串intpipei(string&chuan,string&fenxi,string(*yc)[50],int&b){?charch,a;?intx,i,j,k; b++; cout<<endl<<""<<b;?if(b>9)?outfu(8,"");?else outfu(9,""); cout<<fenxi; outfu(26-chuan.length()-fenxi.length(),""); cout<<chuan; outfu(10,"");?a=chuan[0];?ch=fenxi[fenxi.length()-1]; x=ENODE.find(ch); if(x<ENODE.length()&&x>-1)?{ if(ch==a) { ?fenxi.erase(fenxi.length()-1,1);???chuan.erase(0,1); cout<<"'"<<a<<"'匹配";? ?if(pipei(chuan,fenxi,yc,b)) ??return1; ??else ??return0;?} else return0;?} else { if(ch=='#') { ?if(ch==a) {? ?cout<<"分析成功"<<endl;???return1; }??else? return0; }?else? if(ch=='@') {? fenxi.erase(fenxi.length()-1,1);? ?if(pipei(chuan,fenxi,yc,b))? ?return1;? ?else? return0; }? else? {? i=NODE.find(ch); if(a=='#') {?? x=ENODE.find('@'); ?if(x<ENODE.length()&&x>-1) ? j=ENODE.length()-1;? ?else???j=ENODE.length(); ?}??else ??j=ENODE.find(a);??if(yc[i][j].length()) {? cout<<NODE[i]<<"->"<<yc[i][j];? fenxi.erase(fenxi.length()-1,1);???for(k=y(tǒng)c[i][j].length()-1;k>-1;k--) ? if(yc[i][j][k]!='@')? ?fenxi+=yc[i][j][k];???if(pipei(chuan,fenxi,yc,b)) ??return1;? ?else? ?return0;??} else? ?return0;? } }}voidmain(){?edge*n; stringstr,(*yc)[50];?inti,j,k; boolflag=0; cout<<"請輸入上下文無關(guān)文法的總規(guī)則數(shù):"<<endl;?cin>>SUM; cout<<"請輸入具體規(guī)則(格式:左部右部,@為空):"<<endl;?n=newedge[SUM];?for(i=0;i<SUM;i++) for(j=0;j<n[i].getrlen();j++) {?? str=n[i].getrg();? if(NODE.find(str[j])>NODE.length()&&ENODE.find(str[j])>ENODE.length()) ?ENODE+=str[j];?}?//計(jì)算first集合?for(i=0;i<SUM;i++)?{?first(n[i],n,i);?}?//outfu(10,"~*~");cout<<endl; for(i=0;i<SUM;i++)?if(n[i].getfirst().find("@")<n[i].getfirst().length()) {? if(NODE.find(n[i].getro())<NODE.length())? ?{ ? for(k=1;k<n[i].getrlen();k++) ?{??? if(NODE.find(n[i].getrg()[k])<NODE.length()) ??{ ??for(j=0;j<SUM;j++) ??? { ? ? if(n[i].getrg()[k]==n[j].getlf()[0])? ? ???{ ? ? ? n[i].newfirst(n[j].getfirst()); ??? ? break; ??? ? } ? ?} ? if(n[j].getfirst().find("@")>n[j].getfirst().length()) ?? {?? ?n[i].delfirst();??? ? break;? ?? } ????}? ? }? ? }?} //計(jì)算follow集合 for(k=0;k<SUM;k++) {?for(i=0;i<SUM;i++)?{?? if(n[i].getlf()==n[0].getlf()) ??n[i].newfollow("#");?? follow(n[i],n,i); } for(i=0;i<SUM;i++) {?? for(j=0;j<SUM;j++)? ?if(n[j].getrg().find(n[i].getlf())==n[j].getrlen()-1) n[i].newfollow(n[j].getfollow()); } } //計(jì)算select集合?for(i=0;i<SUM;i++)?{?select(n[i],n); } for(i=0;i<NODE.length();i++)?{?str.erase(); for(j=0;j<SUM;j++)? if(n[j].getlf()[0]==NODE[i])? {?? if(!str.length()) ??str=n[j].getselect(); else ? {?? for(k=0;k<n[j].getselect().length();k++)????if(str.find(n[j].getselect()[k])<str.length())? ?{? ? flag=1;? break; } } } }?//輸出?cout<<endl<<"非終結(jié)符"; outfu(SUM,"");?cout<<"First";?outfu(SUM,""); cout<<"Follow"<<endl; outfu(5+SUM,"-*-");?cout<<endl;?for(i=0;i<NODE.length();i++)?{ for(j=0;j<SUM;j++) if(NODE[i]==n[j].getlf()[0]) ?{ ? outfu(3,"");?? cout<<NODE[i]; outfu(SUM+4,""); ?out(n[j].getfirst());???outfu(SUM+4-2*n[j].getfirst()
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公文寫作與處理考試高分技巧及試題及答案
- 現(xiàn)代管理學(xué)重點(diǎn)查漏試題及答案
- 市政項(xiàng)目評估指標(biāo)的設(shè)計(jì)與應(yīng)用試題及答案
- 管理者對組織文化建設(shè)的影響力試題及答案
- 行政管理中有效實(shí)施反饋機(jī)制試題及答案
- 專用設(shè)備修理合同范例
- 2025年自考行政管理國際視野試題及答案
- 敏捷管理方法的應(yīng)用場景試題及答案
- 未來規(guī)劃行政管理自考試題及答案
- 出售小區(qū)圍欄合同范例
- 浙江農(nóng)村振興報(bào)告
- (完整版)Conners-兒童行為問卷-常模和題目
- 素養(yǎng)導(dǎo)向的表現(xiàn)性評價(jià)
- 國貿(mào)特色專業(yè)申報(bào)匯報(bào)
- 公路工程安全風(fēng)險(xiǎn)辨識與防控手冊
- 跆拳道體能測試登記表
- 大學(xué)軍事理論課教程第四章現(xiàn)代戰(zhàn)爭第二節(jié) 新軍事革命
- 專題四“挺膺擔(dān)當(dāng)”主題團(tuán)課
- 醫(yī)院體檢電子表格
- 國家義務(wù)教育質(zhì)量監(jiān)測初中美術(shù)試題
- 2023年10月江蘇省高等教育自學(xué)考試機(jī)床與數(shù)控技術(shù)
評論
0/150
提交評論