




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、編譯原理程序設(shè)計(jì)實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)題目班級(jí):計(jì)算機(jī)1306姓名:于厚藝學(xué)號(hào):20131289實(shí)驗(yàn)?zāi)繕?biāo):表達(dá)式語(yǔ)法分析器的設(shè)計(jì)實(shí)現(xiàn)1) 遞歸下降子程序2) LL(1)分析法 實(shí)驗(yàn)內(nèi)容:1. 概要設(shè)計(jì)1) 按照流程圖,調(diào)用子程序?qū)崿F(xiàn);2) 通過(guò)ll(1)分析表和對(duì)應(yīng)壓棧、彈棧操作實(shí)現(xiàn)。2. 流程圖1) 遞歸:Z(main):開始Read(w)E#? N Err結(jié)束入口入口E: E1:+?T YE1Read(w)-? N出口 Y T N出口入口入口T: T1:*?F YRead(w)/?T1 N出口 YT N入口出口F:(?I? N N errRead(w) Y YRead(w)E)? 出口 Y N er
2、r2) LL(1):調(diào)用函數(shù)token()切分單詞構(gòu)建LL(1)分析表開始調(diào)用*Analyse(char *token)進(jìn)行分析結(jié)束3. 關(guān)鍵函數(shù)1) 遞歸下降子程序void E();/E-TX;int E1();/X-+TX | evoid T();/T-FYint T1();/Y-*FY | eint F();/F-(E) | i2) LL(1)分析法 char *Find(char vn,char vt)/是否查到表char *Analyse(char *token)/分析過(guò)程int Token()/將token中數(shù)字表示成i,標(biāo)識(shí)符表示成n源程序代碼:(加入注釋)1) 遞歸下降子程序:
3、#include#include#include #include using namespace std;/*全局變量*/char str30;int index=0;void E();/E-TX;int E1();/X-+TX | evoid T();/T-FYint T1();/Y-*FY | eint F();/F-(E) | iFILE *fp;char cur;/*主函數(shù)*/int main()int len;int m;if(fp=fopen(source.txt,r)=NULL) coutcan not open the source file!endl; exit(1); c
4、ur=fgetc(fp); while(cur!=#) E(); coutendl;coutsuccessendl;return 0;/*/void E() T(); E1();/*/int E1()if(cur=+) cur=fgetc(fp);T();cout+ ;E1();else if(cur=-) cur=fgetc(fp); T(); cout- ; E1();return 0;/*/void T()F();T1();/*/int T1()if(cur=*) cur=fgetc(fp);F();cout* ;T1();else if(cur=/) cur=fgetc(fp); F(
5、); cout/ ; T1();return 0;int F()if(cur=a)|(cur=A)|cur=_) for(int i=0;i20;i+) stri=0; index=0; strindex+=cur; cur=fgetc(fp); while(cur=a)|(cur=A)|cur=_|(cur=0) strindex+=cur; cur=fgetc(fp);coutstr;cout ;return NULL;else if (cur=0) for(int i=0;i20;i+) stri=0; index=0; while(cur=0) strindex+=cur; cur=f
6、getc(fp); if(cur=.) strindex+=cur; cur=fgetc(fp); while(cur=0) strindex+=cur; cur=fgetc(fp); coutstr; cout ; return NULL; else if(cur=a)|(cur=A)|cur=_) printf(error6n); exit(1); else coutstr; cout ; return NULL; else if (cur=() cur=fgetc(fp);E();if(cur=)cur=fgetc(fp);return 0;elseprintf(error3n);exi
7、t (1);elseprintf(error4n);exit(1);return 0; 程序運(yùn)行結(jié)果:(截屏)輸入:Source.txt文本(Aa+Bb)*(88.2/3)#輸出:2) LL(1)#include #include #include #include #include using namespace std;struct Node1char vn;char vt;char s12;MAP22;/存儲(chǔ)分析預(yù)測(cè)表每個(gè)位置對(duì)應(yīng)的終結(jié)符,非終結(jié)符,產(chǎn)生式int k;char token30;int token_index=0;char G1212=E-TR,R-+TR,R-TR,R-e
8、,T-FW,W-*FW,W-/FW,W-e,F-(E),F-i,F-n;/存儲(chǔ)文法中的產(chǎn)生式 ,用R代表E,W代表T,e代表空/char VN6=E,R,T,W,F;/存儲(chǔ)非終結(jié)符/char VT9=i,n,+,-,*,/,(,),#;/存儲(chǔ)終結(jié)符char Select1212=(,i,n,+,-,),#,(,i,n,*,/,+,-,),#,(,i,n;/存儲(chǔ)文法中每個(gè)產(chǎn)生式對(duì)應(yīng)的select集合char Right128=-TR,-+TR,-TR,-e,-FW,-*FW,-/FW,-e,-(E),-i,-n;stack stak,stak1,stak2;char *Find(char vn,
9、char vt)int i;for(i=0;ik;i+)if(MAPi.vn=vn& MAPi.vt=vt)return MAPi.s;return error;char *Analyse(char *token)char p,action10,output10;int i=1,j,k=0,l_act,m;while(!stak.empty()/判斷棧中是否為空,若不空就將棧頂元素與分析表匹配進(jìn)行相應(yīng)操作stak.pop();stak.push(#);/棧底標(biāo)志stak.push(E);/起始符號(hào)先入棧printf( 步驟 棧頂元素 輸入串 推導(dǎo)所用產(chǎn)生式或匹配n);p=stak.top();
10、while(p!=#)/查預(yù)測(cè)分析表將棧頂元素進(jìn)行匹配,若棧頂元素與輸入串匹配成功則向前匹配,否則生成式反序入棧printf(%7d ,i+);p=stak.top();/從棧中彈出一個(gè)棧頂符號(hào),由p記錄并輸出stak.pop();printf(%6c ,p);for(j=0,m=0;j1;j-)stak.push(actionj);return ERROR;int Token() FILE *fp; char cur; int i,j; fp=fopen(source.txt,r); cur=fgetc(fp); while(cur!=EOF)/把用字母數(shù)字表示的輸入串轉(zhuǎn)換為token序列的
11、表示方法if(cur=a)|(cur=A)|cur=_) cur=fgetc(fp); while(cur=a)|(cur=A)|cur=_|(cur=0) cur=fgetc(fp); tokentoken_index+=i; continue; else if (cur=0) while(cur=0) cur=fgetc(fp); if(cur=.) cur=fgetc(fp); while(cur=0) cur=fgetc(fp); tokentoken_index+=n; continue; else tokentoken_index+=cur; cur=fgetc(fp); continue; tokentoken_index=#;cout把文件中字符串用i表示,數(shù)字用n表示,轉(zhuǎn)化后:;for(int index=0;index=token_index;index+) couttokenindex; coutendlendl; return 0;int main ()int i,j,l,m;for(i=0,k=0;i11;i+)/通過(guò)select集合生成預(yù)測(cè)分析表l=strle
溫馨提示
- 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ù)覽,若沒有圖紙預(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 充氣泳池采購(gòu)合同范例
- 個(gè)人廣告合同范例
- 剪輯工作合同范例
- 個(gè)人外墻粉刷合同范本
- 冷庫(kù)設(shè)備供貨合同范例
- 代履行合同范例
- 中國(guó)石化設(shè)備購(gòu)銷合同范例
- 創(chuàng)業(yè)合伙合同范例
- 養(yǎng)殖基地戰(zhàn)略合同范例
- 公司用司機(jī)合同范例
- 2011年比亞迪l3使用手冊(cè)
- 最新固體制空調(diào)凈化系統(tǒng)設(shè)計(jì)確認(rèn)方案
- 《汽車?yán)碚摗窂?fù)習(xí)提綱
- 利用勾股定理作圖計(jì)算(課堂PPT)
- 金合極思軟件快捷鍵
- 對(duì)大型火力發(fā)電廠生產(chǎn)準(zhǔn)備工作的幾點(diǎn)認(rèn)識(shí)
- 園林綠化監(jiān)理月報(bào)001
- 淺議如何當(dāng)好稅務(wù)分局長(zhǎng)
- 交通建設(shè)工程工程量清單計(jì)價(jià)規(guī)范(第1部分公路工程)-解析
- 山西曲沃(或經(jīng)洪洞縣大槐樹)遷徙蘇北魯南曹氏宗系分支
- 干部管理訪談提綱
評(píng)論
0/150
提交評(píng)論