編譯原理實驗報告LL分析法_第1頁
編譯原理實驗報告LL分析法_第2頁
編譯原理實驗報告LL分析法_第3頁
已閱讀5頁,還剩3頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、課 程 編譯原理 實驗名稱 實驗二 LL(1) 分析法實驗?zāi)康? 掌握 LL(1) 分析法的基本原理;2 掌握 LL(1) 分析表的構(gòu)造方法;3 掌握 LL(1) 驅(qū)動程序的構(gòu)造方法。一. 實驗內(nèi)容及要求根據(jù)某一文法編制調(diào)試 LL( 1)分析程序,以便對任意輸入的符號串進(jì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#) ,如:

2、i+i*i# 。輸出過程如下: 步驟 分析棧 剩余輸入串 所用產(chǎn)生式1 E i+i*i# E-TG. 實驗過程及結(jié)果代碼如下:#include#include using namespace std;edge:edge()cinleftright; rlen=();if(left)()NODE+=left;string edge:getlf()return left;string edge:getrg()return right;string edge:getfirst()return first;string edge:getfollow()return follow;string edge

3、:getselect()return select;string edge:getro()string str;str+=right0;return str;int edge:getrlen()return ();void edge:newfirst(string w)int i;for(i=0;i() first+=wi;void edge:newfollow(string w)int i;for(i=0;i()&wi!=) follow+=wi;void edge:newselect(string w)int i;for(i=0;i()&wi!=) select+=wi;void edge

4、:delfirst()int i=();(i,1);int SUM;string NODE,ENODE;etlf()if(nj.getro()() for(i=0;iSUM;i+) if(ni.getlf()=nj.getro() first(ni,n,x);else nx.newfirst(nj.getro();etlf().find()i)=0)if()i+1)()for(k=0;kSUM;k+) if(nk.getlf().find()i+1)=0) nj.newfollow(nk.getfirst();etlf()0)etlf()0)if(nk.getfirst().find()nj.

5、getfirst().length()return;x=nj.getselect().find(ENODEk); if(x-1) coutnj.getrg(); ycik=nj.getrg(); outfu(9-nj.getrlen(), ); flag=0;x=nj.getselect().find(#);if(k=()-1&x-1) coutnj.getrg(); ycij=nj.getrg();if(flag&ENODEk!=)outfu(11, );coutendl;ength()coutNODEi-1;k-) if(ycijk!=) fenxi+=ycijk;if(pipei(chu

6、an,fenxi,yc,b) return 1;elsereturn 0;elsereturn 0;void main()edge *n;string str,(*yc)50;int i,j,k;bool flag=0;cout 請輸入上下文無關(guān)文法的總規(guī)則數(shù): SUM;cout 請輸入具體規(guī)則(格式:左部右部, 為空): endl;n=new edgeSUM;for(i=0;iSUM;i+) for(j=0;j()&(strj)() ENODE+=strj; etfirst().find()ni.getfirst().length()if(ni.getro()()for(k=1;kni.ge

7、trlen();k+)if(ni.getrg()k)() for(j=0;jnj.getfirst().length() ni.delfirst(); break;etlf()=n0.getlf() ni.newfollow(#); follow(ni,n,i);for(i=0;iSUM;i+) for(j=0;jSUM;j+) if(nj.getrg().find(ni.getlf()=nj.getrlen()-1) ni.newfollow(nj.getfollow();etlf()0=NODEi)if(!() str=nj.getselect(); else for(k=0;knj.ge

8、tselect().length();k+) if(nj.getselect()k)()flag=1;break;etlf()0)outfu(3, ); coutNODEi; outfu(SUM+4, ); out(nj.getfirst();outfu(SUM+4-2*nj.getfirst().length(), ); out(nj.getfollow();coutendl;break; outfu(5+SUM,-*-); coutendl 判定結(jié)論: ;if(flag)cout 該文法不是 LL(1) 文法 !endl; return;elsecout 該文法是 LL(1) 文法 !en

9、dl;/ 輸出預(yù)測分析表 coutendl 預(yù)測分析表如下: endl; yc=new string()50;outgraph(n,yc);string chuan,fenxi,fchuan; coutendlchuan; fchuan=chuan;fenxi=#; fenxi+=NODE0;i=0;coutendl 預(yù)測分析過程如下: endl; cout 步驟 ;outfu(7, );cout 分析棧 ;outfu(10, );cout 剩余輸入串 ;outfu(8, );cout 推導(dǎo)所用產(chǎn)生式或匹配 ; if(pipei(chuan,fenxi,yc,i)coutendl 輸入串 fchuan 是該

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論