




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上實(shí)驗(yàn)二 LL(1)分析法一、 實(shí)驗(yàn)?zāi)康?通過完成預(yù)測(cè)分析法的語法分析程序,了解預(yù)測(cè)分析法和遞歸子程序法的區(qū)別和聯(lián)系。使學(xué)生了解語法分析的功能,掌握語法分析程序設(shè)計(jì)的原理和構(gòu)造方法,訓(xùn)練學(xué)生掌握開發(fā)應(yīng)用程序的基本方法。有利于提高學(xué)生的專業(yè)素質(zhì),為培養(yǎng)適應(yīng)社會(huì)多方面需要的能力。二、實(shí)驗(yàn)內(nèi)容及設(shè)計(jì)原理 所謂LL(1)分析法,就是指從左到右掃描輸入串(源程序),同時(shí)采用最左推導(dǎo),且對(duì)每次直接推導(dǎo)只需向前看一個(gè)輸入符號(hào),便可確定當(dāng)前所應(yīng)當(dāng)選擇的規(guī)則。實(shí)現(xiàn)LL(1)分析的程序又稱為L(zhǎng)L(1)分析程序或LL1(1)分析器。我們知道一個(gè)文法要能進(jìn)行LL(1)分析,那么這個(gè)文法應(yīng)該滿足
2、:無二義性,無左遞歸,無左公因子。當(dāng)文法滿足條件后,再分別構(gòu)造文法每個(gè)非終結(jié)符的FIRST和FOLLOW集合,然后根據(jù)FIRST和FOLLOW集合構(gòu)造LL(1)分析表,最后利用分析表,根據(jù)LL(1)語法分析構(gòu)造一個(gè)分析器。LL(1)的語法分析程序包含了三個(gè)部分,總控程序,預(yù)測(cè)分析表函數(shù),先進(jìn)先出的語法分析棧,本程序也是采用了同樣的方法進(jìn)行語法分析,該程序是采用了C+語言來編寫,其邏輯結(jié)構(gòu)圖如下:LL(1)預(yù)測(cè)分析程序的總控程序在任何時(shí)候都是按STACK棧頂符號(hào)X和當(dāng)前的輸入符號(hào)a做哪種過程的。對(duì)于任何(X,a),總控程序每次都執(zhí)行下述三種可能的動(dòng)作之一:()若X = a =#,則宣布分析成功,
3、停止分析過程。()若X = a #,則把X從STACK棧頂彈出,讓a指向下一個(gè)輸入符號(hào)。()若X是一個(gè)非終結(jié)符,則查看預(yù)測(cè)分析表M。若MA,a中存放著關(guān)于X的一個(gè)產(chǎn)生式,那么,首先把X彈出STACK棧頂,然后,把產(chǎn)生式的右部符號(hào)串按反序一一彈出STACK棧(若右部符號(hào)為,則不推什么東西進(jìn)STACK棧)。若MA,a中存放著“出錯(cuò)標(biāo)志”,則調(diào)用出錯(cuò)診斷程序ERROR。三、程序結(jié)構(gòu)描述1、定義的變量初始化預(yù)測(cè)分析表:LL E8="TG","TG","error","error","error",&qu
4、ot;error","error","error"LL G8="error","error","null","+TG","-TG","error","error","null"LL T8="FS","FS","error","error","error","error"
5、,"error","error"LL S8="error","error","null","null","null","*FS","/FS","null"LL F8="i","(i)","error","error","error","error","error&quo
6、t;,"error"const int MaxLen=10; 初始化棧的長(zhǎng)度const int Length=10; 初始化數(shù)組長(zhǎng)度char Vn5='E','G','T','S','F' 非終結(jié)符數(shù)組char Vt8='i','(',')','+','-','*','/','#' 終結(jié)符數(shù)組char ch,X; /全局變量,ch用于讀當(dāng)前字符,X用于獲取棧頂元素cha
7、r strTokenLength; 存儲(chǔ)規(guī)約表達(dá)式2、定義的函數(shù)class stack 棧的構(gòu)造及初始化int length(char *c) 輸出字符數(shù)組的長(zhǎng)度void print(int i,char*c) 剩余輸入串的輸出void run() 分析程序3、LL(1)預(yù)測(cè)分析程序流程圖四、程序源代碼及運(yùn)行結(jié)果#include<iostream>using namespace std;const int MaxLen=10; /初始化棧的長(zhǎng)度 const int Length=10;/初始化數(shù)組長(zhǎng)度 char Vn5='E','G','T&
8、#39;,'S','F'/非終結(jié)符數(shù)組 char Vt8='i','(',')','+','-','*','/','#'/終結(jié)符數(shù)組 char ch,X;/全局變量,ch用于讀當(dāng)前字符,X用于獲取棧頂元素 char strTokenLength;/存儲(chǔ)規(guī)約表達(dá)式 struct LL/ll(1)分析表的構(gòu)造字初始化 char*c;LL E8="TG","TG","error",&
9、quot;error","error","error","error","error"LL G8="error","error","null","+TG","-TG","error","error","null"LL T8="FS","FS","error","error&quo
10、t;,"error","error","error","error"LL S8="error","error","null","null","null","*FS","/FS","null"LL F8="i","(i)","error","error","error&q
11、uot;,"error","error","error"class stack/棧的構(gòu)造及初始化 public: stack();/初始化 bool empty() const;/是否為空 bool full() const;/是否已滿 bool get_top(char &c)const;/取棧頂元素 bool push(const char c);/入棧 bool pop();/刪除棧頂元素 void out();/輸出棧中元素 stack()/析構(gòu) private: int count;/棧長(zhǎng)度 char dataMax
12、Len;/棧中元素 ;stack:stack() count=0;bool stack:empty() const if(count=0) return true; return false;bool stack:full() const if(count=MaxLen) return true; return false;bool stack:get_top(char &c)const if(empty() return false; else c=datacount-1; return true; bool stack:push(const char c) if(full() re
13、turn false; datacount+=c; return true;bool stack:pop() if(empty() return false; count-; return true;void stack:out() for(int i=0;i<count;i+) cout<<datai; cout<<" "int length(char *c) int l=0; for(int i=0;ci!='0'i+) l+; return l;void print(int i,char*c)/剩余輸入串的輸出 for(i
14、nt j=i;j<Length;j+) cout<<cj; cout<<" " void run() bool flag=true;/循環(huán)條件 int step=0,point=0;/步驟、指針 int len;/長(zhǎng)度 cout<<"請(qǐng)輸入要規(guī)約的字符串:"<<endl; cin>>strToken; ch=strTokenpoint+;/讀取第一個(gè)字符 stack s; s.push('#');/棧中數(shù)據(jù)初始化 s.push('E'); s.get_top
15、(X);/取棧頂元素 cout<<"步驟 "<<"分析棧 "<<"剩余輸入串 "<<"所用產(chǎn)生式 "<<"動(dòng)作"<<endl; cout<<step+<<" " s.out(); print(point-1,strToken); cout<<" "<<"初始化"<<endl; while(flag) if(
16、X=Vt0)|(X=Vt1)|(X=Vt2)|(X=Vt3)|(X=Vt4)|(X=Vt5)|(X=Vt6) /判斷是否為終結(jié)符(不包括#) if(X=ch)/終結(jié)符,識(shí)別,進(jìn)行下一字符規(guī)約 s.pop(); s.get_top(X); ch=strTokenpoint+; cout<<step+<<" " s.out(); print(point-1,strToken); cout<<" "<<"GETNEXT(I)"<<endl; else flag=false; cou
17、t<<"error!"<<endl; else if(X='#')/規(guī)約結(jié)束 if(X=ch) cout<<step+<<" " s.out(); print(point-1,strToken); cout<<" "<<X<<"->"<<ch<<" "<<"結(jié)束"<<endl; s.pop(); flag=false; el
18、se flag=false; cout<<"error!"<<endl; else if(X=Vn0) /非終結(jié)符E for(int i=0;i<8;i+)/查分析表 if(ch=Vti) if(strcmp(Ei.c,"error")=0)/出錯(cuò) flag=false; cout<<"error"<<endl; else /對(duì)形如 X->X1X2的產(chǎn)生式進(jìn)行入棧操作 s.pop(); len=length(Ei.c)-1; for(int j=len;j>=0;j-)
19、 s.push(Ei.cj); cout<<step+<<" " s.out(); print(point-1,strToken); cout<<X<<"->"<<Ei.c<<" "<<"POP,PUSH(" for(int z=len;z>=0;z-) cout<<Ei.cz; cout<<")"<<endl; s.get_top(X); else if(X=Vn
20、1) /同上,處理 G for(int i=0;i<8;i+) if(ch=Vti) if(strcmp(Gi.c,"null")=0) s.pop(); cout<<step+<<" " s.out(); print(point-1,strToken); cout<<" "<<X<<"->"<<""<<" "<<"POP"<<endl;
21、 s.get_top(X); else if(strcmp(Gi.c,"error")=0) flag=false; cout<<"error"<<endl; else s.pop(); len=length(Gi.c)-1; for(int j=len;j>=0;j-) s.push(Gi.cj); cout<<step+<<" " s.out(); print(point-1,strToken); cout<<X<<"->"&l
22、t;<Gi.c<<" "<<"POP,PUSH(" for(int z=len;z>=0;z-) cout<<Gi.cz; cout<<")"<<endl; s.get_top(X); else if(X=Vn2) /同上 處理 T for(int i=0;i<8;i+) if(ch=Vti) if(strcmp(Ti.c,"error")=0) flag=false; cout<<"error"<&
23、lt;endl; else s.pop(); len=length(Ti.c)-1; for(int j=len;j>=0;j-) s.push(Ti.cj); cout<<step+<<" " s.out(); print(point-1,strToken); cout<<X<<"->"<<Ti.c<<" "<<"POP,PUSH(" for(int z=len;z>=0;z-) cout<<Ti.c
24、z; cout<<")"<<endl; s.get_top(X); else if(X=Vn3)/同上 處理 S for(int i=0;i<8;i+) if(ch=Vti) if(strcmp(Si.c,"null")=0) s.pop(); cout<<step+<<" " s.out(); print(point-1,strToken); cout<<" "<<X<<"->"<<&q
25、uot;"<<" "<<"POP"<<endl; s.get_top(X); else if(strcmp(Si.c,"error")=0) flag=false; cout<<"error"<<endl; else s.pop(); len=length(Si.c)-1; for(int j=len;j>=0;j-) s.push(Si.cj); cout<<step+<<" " s.out(); print(point-1,strToken); cout<<X<<"->"<<Si.c<<" "<<"POP,PUSH(" for(int z=len;z>=0;z
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 河南藝術(shù)機(jī)構(gòu)管理辦法
- 高職人才培養(yǎng)質(zhì)量增值評(píng)價(jià)研究
- 比質(zhì)比價(jià)采購(gòu)管理辦法
- 鋼結(jié)構(gòu)維護(hù)與結(jié)構(gòu)施工技術(shù)指南
- 新教師教學(xué)工作中存在的問題分析
- 小學(xué)隊(duì)列隊(duì)形教學(xué)計(jì)劃
- 春節(jié)技師放假管理辦法
- 體育與藝術(shù)融合發(fā)展的實(shí)施路徑研究
- 梧州學(xué)院專業(yè)管理辦法
- 接地系統(tǒng)安裝工藝與技術(shù)研究
- 煤炭造價(jià)知識(shí)培訓(xùn)
- 2025屆遼寧省大連市高新區(qū)英語七年級(jí)第二學(xué)期期末學(xué)業(yè)質(zhì)量監(jiān)測(cè)模擬試題含答案
- 腫瘤全程康復(fù)管理制度
- 對(duì)患者的健康教育制度
- 三級(jí)醫(yī)院評(píng)審標(biāo)準(zhǔn)感染防控部分解讀(25VS22版)
- 中國(guó)PSRAM行業(yè)市場(chǎng)供需態(tài)勢(shì)及發(fā)展前景研判報(bào)告
- 2025呼倫貝爾農(nóng)墾集團(tuán)有限公司校園招聘44人筆試參考題庫(kù)附帶答案詳解析集合
- 2025年《社區(qū)居家智慧康養(yǎng)管理》課程標(biāo)準(zhǔn)(含課程思政元素)
- 加裝電梯合同解除協(xié)議書
- T/CCOA 50-2023低菌小麥粉生產(chǎn)技術(shù)規(guī)程
- 安全生產(chǎn)責(zé)任制度完整版
評(píng)論
0/150
提交評(píng)論