




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
課程編譯原理實(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ū)動(dòng)程序的構(gòu)造方法。實(shí)驗(yàn)內(nèi)容及規(guī)定根據(jù)某一文法編制調(diào)試LL(1)分析程序,以便對(duì)任意輸入的符號(hào)串進(jìn)行分析。本次實(shí)驗(yàn)的目的重要是加深對(duì)預(yù)測(cè)分析LL(1)分析法的理解。對(duì)下列文法,用LL(1)分析法對(duì)任意輸入的符號(hào)串進(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é)束的符號(hào)串(涉及+*()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ù)輸出符號(hào)voidoutfu(inta,stringc){?inti; for(i=0;i<a;i++)?cout<<c;}//輸出預(yù)測(cè)分析表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;?}}//分析符號(hào)串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<<"請(qǐng)輸入上下文無關(guān)文法的總規(guī)則數(shù):"<<endl;?cin>>SUM; cout<<"請(qǐng)輸入具體規(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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 紗線生產(chǎn)過程中的設(shè)備維護(hù)與管理考核試卷
- 躺式旅行悠閑享受度假時(shí)光考核試卷
- 輕質(zhì)高強(qiáng)泡沫塑料的研究與發(fā)展考核試卷
- 航天器空間碎片監(jiān)測(cè)與預(yù)警系統(tǒng)考核試卷
- 通風(fēng)電器具物聯(lián)網(wǎng)技術(shù)應(yīng)用考核試卷
- 蔬菜加工企業(yè)品牌國際化戰(zhàn)略考核試卷
- 管道工程法律法規(guī)政策學(xué)習(xí)、運(yùn)用與實(shí)施考核試卷
- 玻璃保溫容器耐壓性能研究考核試卷
- 甲狀腺患者的護(hù)理
- 智能停車項(xiàng)目投資建設(shè)與回報(bào)協(xié)議
- 北京故宮的詳細(xì)資料資料講解
- GB/T 38472-2023再生鑄造鋁合金原料
- 莫高窟經(jīng)典簡(jiǎn)介
- 2023年貴州黔南州人民檢察院招考聘用派遣制檢察輔助人員筆試題庫含答案解析
- 機(jī)械制造技術(shù)基礎(chǔ)課程設(shè)計(jì)講課用
- CMOS反相器的與設(shè)計(jì)
- 核醫(yī)學(xué)科儀器管理操作保養(yǎng)維修制度
- 《祝福》配套劇本 課件
- 電源板QC工程圖
- 小學(xué)數(shù)學(xué)小升初小升初專題復(fù)習(xí)小升初專題復(fù)習(xí)
- GB/T 8162-2008結(jié)構(gòu)用無縫鋼管
評(píng)論
0/150
提交評(píng)論