版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、課程 編譯原理實(shí)驗(yàn)名稱 實(shí)驗(yàn)二LL(1)分析法實(shí)驗(yàn)?zāi)康? 掌握LL(1)分析法的基本原理;2. 掌握LL(1)分析表的構(gòu)造方法;3. 掌握LL(1)驅(qū)動(dòng)程序的構(gòu)造方法。一.實(shí)驗(yàn)內(nèi)容及要求根據(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->s(4) T->FS(5) S->*FS(6) S->£(7) F->(E)(8) F->i程序輸入一以#結(jié)
2、束的符號(hào)串(包括+* () i#),如:i+i*i#。輸出過(guò)程如下: 步驟 分析棧 剩余輸入串所用產(chǎn)生式1Ei+i*i#E->TG.實(shí)驗(yàn)過(guò)程及結(jié)果代碼如下:#in clude<iostream>#in clude "edge.h" using n amespace std;edge:edge()cin> >left»right;rlen=right.le ngth();if(NODE.fi nd(left)>NODE.Ie ngth() NODE+=left;string edge:getlf()return left;stri
3、 ng edge:getrg()retur n right;stri ng edge:getfirst()return first;stri ng edge:getfollow()return follow;stri ng edge:getselect()retur n select;stri ng edge:getro()stri ng str;str+=rightO;return str;int edge:getrle n()retur n right.le ngth();void edge:newfirst(string w)int i;for(i=0;i<wen gth();i+
4、)if(first.fi nd(wi)>first.le ngth() first+=wi;void edge: newfollow(stri ng w)int i;for(i=0;i<wen gth();i+)if(follow.fi nd(wi)>follow.le ngth()&&&wi!=) follow+=wi;void edge: newselect(stri ng w)int i;for(i=0;i<wen gth();i+)if(select.fi nd(wi)>select.le ngth()&&&
5、wi!=) select+=wi;void edge:delfirst()int i=first.fi nd(); first.erase(i,1);int SUM;stri ng NODE,ENODE;計(jì)算firstvoid first(edge ni,edge *n,int x)int i,j;for(j=0;j<SUM;j+)if(n i.getlf()=nj.getlf()if(NODE.fi nd( nj.getro()<NODE.le ngth()for(i=0;i<SUM;i+)if(n i.getlf()=nj.getro()first( n i, n,x);
6、elsen x. newfirst (n j.getro();計(jì)算 followvoid follow(edge n i,edge *n ,i nt x)int i,j,k,s;stri ng str;for(i=0;i <n i.getrle n( );i+)s=NODE.fi nd( ni.getrg()i);if(s<NODE.le ngth()&&s>-1) /是非終結(jié)符if(i<ni.getrlen()-1) / 不在最右 for(j=0;j<SUM;j+)if(n j.getlf().fi nd(n i.getrg()i)=O)if(N
7、ODE.fi nd(n i.getrg()i+1)<NODE.le ngth() for(k=0;k<SUM;k+)if(n k.getlf().fi nd( ni.getrg()i+1)=0)n j. newfollow( nk.getfirst();if(n k.getfirst().fi nd(”")< nk.getfirst()e ngth() n j. newfollow( ni.getfollow();elsestr.erase();str+=n i.getrg()i+1;n j. newfollow(str);計(jì)算 selectvoid select(
8、edge &n i,edge *n)int i,j;if(ENODE.fi nd(n i.getro()<ENODE.Ie ngth()ni. newselect( ni.getro();if(n i.getro()="")ni. newselect( ni.getfollow();elsefor(i=0;i <n i.getrle n( );i+)for(j=0;j<SUM;j+)if(n i.getrg()i=nj.getlf()O)ni. newselect( nj.getfirst();if(n j.getfirst().fi nd()&g
9、t; nj.getfirst().le ngth() return;輸出集合void out(stri ng p)int i;if(p.le ngth()=0)return;cout<<""for(i=0;i<pen gth()-1;i+)cout<<pi<<"," cout<<pi<<""/連續(xù)輸出符號(hào)void outfu(i nt a,stri ng c)int i;for(i=0;i<a;i+) cout<<c;輸出預(yù)測(cè)分析表void outgr
10、aph(edge *n, stri ng (*yc)50) int i,j,k;bool flag;for(i=0;i<ENODEe ngth();i+)if(ENODEi!='')outfu(10,""); cout<<ENODEi;outfu(10,""); cout<<"#"<<e ndl;int x;for(i=0;i<NODE.le ngth();i+)outfu(4,"");cout<<NODEi;outfu(5,"&
11、quot;);for(k=0;k<ENODEe ngth();k+) flag=1;for(j=0;j<SUM;j+)if(NODEi=nj.getlf()0)x=nj.getselect().fi nd(ENODEk); if(x< nj.getselect().le ngth()&&x>-1) cout<<"->" <<n j.getrg(); ycik=nj.getrg();outfu(9-n j.getrle n()," ”); flag=O;x=nj.getselect().fi nd
12、('#');if(k=ENODE.Ie ngth()-1 &&x<n j.getselect().le ngth() && x>-1) cout<<"->" <<n j.getrg();ycij=nj.getrg();if(flag&&ENODEk!='')outfu(11,"");cout<<e ndl;分析符號(hào)串int pipei(string &chuan,string &fenxi,string (
13、*yc)50,int &b)char ch,a;int x,i,j,k;b+;cout<<e ndl<<" "<<b;if(b>9)outfu(8,"");elseoutfu(9,"");cout<<fe nxi;outfu(26-chua n.le ngth()-fe nxi.le ngth(),"");cout<<chua n;outfu(10,"");a=chua n 0;ch=fe nxife nxi.le ngt
14、h()-1;x=ENODE.fi nd(ch);if(x<ENODE.le ngth()&& x>-1)if(ch=a)fen xi.erase(fe nxi .len gth()-1,1);chua n. erase(0,1);cout<<"”'<<a<<"'匹配"if(pipei(chua n,fen xi,yc,b)return 1;elsereturn 0;elsereturn 0;elseif(ch='#')if(ch=a)cout<<"
15、分析成功"<<endl; return 1;elsereturn 0;elseif(ch=)fen xi.erase(fe nxi .len gth()-1,1); if(pipei(chua n,fen xi,yc,b) return 1;elsereturn 0;elsei=NODE.fi nd(ch);if(a='#')x=ENODE.fi nd(''); if(x<ENODE.le ngth() && x>-1) j=ENODE.le ngth()-1;elsej=ENODE.le ngth();else
16、j=ENODE.fi nd(a); if(ycij.le ngth()cout<<NODEi<<"->"<<ycij; fen xi.erase(fe nxi .len gth()-1,1);for(k=ycij.le ngth()-1;k>-1;k-)if(ycijk!=)fen xi+=ycijk;if(pipei(chua n,fen xi,yc,b)return 1;elsereturn 0;elsereturn 0;void mai n()edge *n;stri ng str,(*yc)50;int i,j,k;b
17、ool flag=0;cout<<"請(qǐng)輸入上下文無(wú)關(guān)文法的總規(guī)則數(shù):"<<endl;cin> >SUM;cout<<"請(qǐng)輸入具體規(guī)則(格式:左部 右部,為空):"<<endl; n=new edgeSUM;for(i=0;i<SUM;i+)for(j=0;j< ni.getrle n( );j+)str=n i.getrg();if(NODE.fi nd(strj)>NODE.Ie ngth()&&ENODE.fi nd(strj)>ENODE.Ie ng
18、th() ENODE+=strj;/計(jì)算first集合for(i=0;i<SUM;i+)first( ni, n,i);outfu(10,"*");cout<<e ndl;for(i=0;i<SUM;i+)if(n i.getfirst().fi nd("")< ni.getfirst().le ngth()if(NODE.fi nd( ni.getro()<NODE.le ngth()for(k=1;k< ni.getrle n();k+)if(NODE.fi nd( ni.getrg()k)<NODEe
19、 ngth()for(j=0;j<SUM;j+)if(n i.getrg()k=nj.getlf()O)n i. newfirst (n j.getfirst(); break;if(n j.getfirst().fi nd("")> nj.getfirst().le ngth() n i.delfirst();break;計(jì)算follow 集合for(k=0;k<SUM;k+)for(i=0;i<SUM;i+)if(n i.getlf()=nO.getlf()n i. newfollow("#");follow( ni, n,i
20、);for(i=0;i<SUM;i+)for(j=0;j<SUM;j+)if(n j.getrg().fi nd(n i.getlf()=nj.getrle n()-1)n i. newfollow( nj.getfollow();/計(jì)算select集合for(i=0;i<SUM;i+)select( ni, n);for(i=0;i<NODE.le ngth();i+)str.erase();for(j=0;j<SUM;j+)if(n j.getlf()0=NODEi)if(!str.le ngth()str=nj.getselect();elsefor(k=0
21、;k< nj.getselect().le ngth();k+) if(str.fi nd( nj.getselect()k)<str.le ngth() flag=1;break;/輸出cout<<endl<<"非終結(jié)符"outfu(SUM,"");cout<<"First"outfu(SUM,"");cout<<"Follow"<<e ndl;outfu(5+SUM,"-*-");cout<&l
22、t;e ndl;for(i=0;i<NODE.le ngth();i+)for(j=0;j<SUM;j+)if(NODEi=nj.getlf()0)outfu(3,"");cout<<NODEi; outfu(SUM+4,""); out( nj.getfirst();outfu(SUM+4-2*nj.getfirst().length(),""); out( nj.getfollow();cout<<e ndl;break;outfu(5+SUM,"-*-");cout<
23、<endl<<"判定結(jié)論:"if(flag)cout<<"該文法不是LL文法!"<<endl; return;else cout<<"該文法是 LL(1)文法!"<<endl;/輸出預(yù)測(cè)分析表cout<<endl<<"預(yù)測(cè)分析表如下:"<<endl;yc=new stringNODE.Iength()50;outgraph( n,yc);string chuan,fenxi,fchuan;cout<<endl<<"請(qǐng)輸入符號(hào)串:"cin> >chua n;fchua n=chua n;fen xi="#"fen xi+=NODE0;i=0;cout<<endl<<"預(yù)測(cè)分析過(guò)程如下:"<<endl;cout<<"步驟"outfu(7,"");cout<<"分析棧"o
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度幼兒園兒童床墊定制采購(gòu)合同3篇
- 2025年度人工智能教育培訓(xùn)合作合同7篇
- 2025年廠房鋼結(jié)構(gòu)工程環(huán)保驗(yàn)收與監(jiān)測(cè)合同4篇
- 2024鐵路消防安全管理與應(yīng)急預(yù)案合同3篇
- 2025年度健康生活A(yù)PP定制化功能開(kāi)發(fā)合同3篇
- 「可靠」2024年度廣告位租賃合同3篇
- 2025年度科技園區(qū)場(chǎng)地租賃與合作開(kāi)發(fā)合同范本4篇
- 2024版建筑渣土清運(yùn)協(xié)議樣本版
- 2025年度新能源車輛充電設(shè)施安裝與維護(hù)合同3篇
- 2025年度叉車司機(jī)安全操作與事故責(zé)任認(rèn)定合同4篇
- 銀行信息安全保密培訓(xùn)
- 市政道路工程交通疏解施工方案
- 2024年部編版初中七年級(jí)上冊(cè)歷史:部分練習(xí)題含答案
- 拆遷評(píng)估機(jī)構(gòu)選定方案
- 床旁超聲監(jiān)測(cè)胃殘余量
- 上海市松江區(qū)市級(jí)名校2025屆數(shù)學(xué)高一上期末達(dá)標(biāo)檢測(cè)試題含解析
- 綜合實(shí)踐活動(dòng)教案三上
- 《新能源汽車電氣設(shè)備構(gòu)造與維修》項(xiàng)目三 新能源汽車照明與信號(hào)系統(tǒng)檢修
- 2024年新課標(biāo)《義務(wù)教育數(shù)學(xué)課程標(biāo)準(zhǔn)》測(cè)試題(附含答案)
- 醫(yī)院培訓(xùn)課件:《靜脈中等長(zhǎng)度導(dǎo)管臨床應(yīng)用專家共識(shí)》
- 中國(guó)國(guó)際大學(xué)生創(chuàng)新大賽與“挑戰(zhàn)杯”大學(xué)生創(chuàng)業(yè)計(jì)劃競(jìng)賽(第十一章)大學(xué)生創(chuàng)新創(chuàng)業(yè)教程
評(píng)論
0/150
提交評(píng)論