![江蘇大學(xué)編譯課程設(shè)計(jì)_第1頁(yè)](http://file4.renrendoc.com/view/3a61e3cba2b1f55695fbed1f919b17f4/3a61e3cba2b1f55695fbed1f919b17f41.gif)
![江蘇大學(xué)編譯課程設(shè)計(jì)_第2頁(yè)](http://file4.renrendoc.com/view/3a61e3cba2b1f55695fbed1f919b17f4/3a61e3cba2b1f55695fbed1f919b17f42.gif)
![江蘇大學(xué)編譯課程設(shè)計(jì)_第3頁(yè)](http://file4.renrendoc.com/view/3a61e3cba2b1f55695fbed1f919b17f4/3a61e3cba2b1f55695fbed1f919b17f43.gif)
![江蘇大學(xué)編譯課程設(shè)計(jì)_第4頁(yè)](http://file4.renrendoc.com/view/3a61e3cba2b1f55695fbed1f919b17f4/3a61e3cba2b1f55695fbed1f919b17f44.gif)
![江蘇大學(xué)編譯課程設(shè)計(jì)_第5頁(yè)](http://file4.renrendoc.com/view/3a61e3cba2b1f55695fbed1f919b17f4/3a61e3cba2b1f55695fbed1f919b17f45.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第19頁(yè)編譯技術(shù)課程設(shè)計(jì)班級(jí)學(xué)號(hào)姓名指導(dǎo)老師2015年6月
目錄TOC\o"1-3"\h\u20597一、目的 218106二﹑題目 215979三、要求 217037四、實(shí)驗(yàn)環(huán)境 217532五、系統(tǒng)實(shí)現(xiàn) 3255621.詞法分析 3260262.語(yǔ)法分析 746573.中間代碼 8168104.錯(cuò)誤處理 1329508六、程序運(yùn)行結(jié)果 14165961.成功用例 1424902.出錯(cuò)處理用例 1520537七、總結(jié) 18
一、目的<<編譯技術(shù)>>是理論與實(shí)踐并重的課程,而其課程設(shè)計(jì)要綜合運(yùn)用一、二年級(jí)所學(xué)的多門(mén)課程的內(nèi)容,用來(lái)完成一個(gè)小型編譯程序。從而鞏固和加強(qiáng)對(duì)詞法分析、語(yǔ)法分析、語(yǔ)義分析、代碼生成和報(bào)錯(cuò)處理等理論的認(rèn)識(shí)和理解;培養(yǎng)學(xué)生對(duì)完整系統(tǒng)的獨(dú)立分析和設(shè)計(jì)的能力,進(jìn)一步培養(yǎng)學(xué)生的獨(dú)立編程能力。二﹑題目表達(dá)式的小型編譯器三、要求表達(dá)式的小型編譯器:詞法分析產(chǎn)生語(yǔ)言的單詞序列語(yǔ)法分析能識(shí)別由加+乘*括號(hào)()操作數(shù)(變量或常數(shù))所組成的算術(shù)表達(dá)式,其文法如下:E→E+T|TT→T*F|FF→(E)|i使用的分析方法可以是:遞歸下降分析法或LR分析法。中間代碼生成產(chǎn)生上述算術(shù)表達(dá)式的中間代碼錯(cuò)誤處理給出錯(cuò)誤信息輸入:算術(shù)表達(dá)式輸出:符號(hào)表,常數(shù)表。遞歸下降分析法:遞歸調(diào)用過(guò)程/LR分析法:語(yǔ)義棧和符號(hào)棧四元式序列四、實(shí)驗(yàn)環(huán)境操作系統(tǒng):Win8.1實(shí)驗(yàn)軟件:VisualStudio2013五、系統(tǒng)實(shí)現(xiàn)1.詞法分析(1)單詞符號(hào)表單詞符號(hào)種別編碼助記符內(nèi)碼值while1while--if2if--Else3else--switch4switch--case5case--標(biāo)識(shí)符6idid在符號(hào)表中的位置常數(shù)7numnum在常數(shù)表中的位置+8+9*10*--<=11relopLE<11relopLT==11relopEQ=12=--;13;--(14(--)15)--#16#--狀態(tài)轉(zhuǎn)換圖(只畫(huà)出算數(shù)表達(dá)式需要部分)數(shù)據(jù)結(jié)構(gòu)單詞二元式:(單詞種別,單詞自身的值)符號(hào)表:(表序號(hào),符號(hào)表自身的值)常數(shù)表:(表序號(hào),常數(shù)表自身的值)函數(shù)說(shuō)明//判斷是否為字母boolletter(){ if((('a'<=character)&&(character<='z'))||(('A'<=character)&&(character<='Z'))) returntrue; else returnfalse;}//判斷是否為數(shù)字booldigit(){ if(('0'<=character)&&(character<='9')) returntrue; else returnfalse;}//將token中的字符串與character的字符連接voidconcatenation(){ token[a]=character; a++; p++; character=in[p];}//掃描指針回退一個(gè)字符voidretract(){ p--;}//將token中的字符串與關(guān)鍵字比較intreserve(){ stringTo=token; for(intj=0;j<5;j++){ if(To==keyword[j]){ returnj+1; break; } } return0;}//變量表去重intvarilist(stringtoken){ inti; for(i=0;i<a1;i++) { if(token==blmb[i]) { break; } } if(i==a1) { blmb[a1]=token; a1++; } return0;}//常數(shù)表去重intconslist(){ inti; for(i=0;i<b;i++) { if(token==csb[i]) { break; } } if(i==b) { csb[b]=token; b++; } return0;}//顯示變量名表voidshowVari(){ cout<<endl; cout<<"變量名表"<<endl; for(inti=0;i<a1;i++) { cout<<i<<""<<blmb[i]<<endl; }}//顯示常量名表voidshowCons(){ cout<<endl; cout<<"常數(shù)表"<<endl; for(inti=0;i<b;i++) { cout<<i<<""<<csb[i]<<endl; }}2.語(yǔ)法分析(1)分析方法說(shuō)明LR分析法指從左至右掃描和自底向上的語(yǔ)法分析,且在分析的每一步,只須根據(jù)分析棧當(dāng)前已移進(jìn)和歸約出的全部文法符號(hào),并至多再向前查看K個(gè)輸入符號(hào),就能確定相對(duì)于某一產(chǎn)生式左部符號(hào)的句柄是否已在分析棧的頂部形成,從而也就可以確定當(dāng)前所應(yīng)采取的分析動(dòng)作(是移進(jìn)還是按某一產(chǎn)生式進(jìn)行歸約等)。每一項(xiàng)ACTION[s,a]所規(guī)定的動(dòng)作是以下四種情況之一:(1)移進(jìn):使(s,a)的下一狀態(tài)s'=ACTION[s,a]和輸入符號(hào)a進(jìn)棧(注:對(duì)終結(jié)符a來(lái)說(shuō),下一狀態(tài)s'=GOTO[s,a]的值實(shí)際上是放在ACTION[s,a]中的),下一輸入符號(hào)變成現(xiàn)行輸入符號(hào)。(2)歸約:指用某一產(chǎn)生式A→β進(jìn)行歸約。假若β的長(zhǎng)度為γ,則歸約的動(dòng)作是去掉棧頂?shù)摩脗€(gè)項(xiàng),即使?fàn)顟B(tài)sm-γ變成棧頂狀態(tài),然后使(sm-γ,A)的下一狀態(tài)s'=GOTO[sm-γ,A]和文法符號(hào)(非終結(jié)符)A進(jìn)棧。歸約的動(dòng)作不改變現(xiàn)行輸入符號(hào),執(zhí)行歸約的動(dòng)作意味著呈現(xiàn)于棧頂?shù)姆?hào)串Xm-γ+1…Xm是一個(gè)相對(duì)于A的句柄。(3)接受:宣布分析成功,停止分析器的工作。(4)報(bào)錯(cuò):報(bào)告發(fā)現(xiàn)源程序含有錯(cuò)誤,調(diào)用出錯(cuò)處理程序。LR分析器的總控程序本身的工作十分簡(jiǎn)單,它的任何一步只需按分析棧的棧頂狀態(tài)s和現(xiàn)行輸入符號(hào)a執(zhí)行ACTION[s,a]所規(guī)定的動(dòng)作即可。文法LR分析表如下:狀態(tài)ACTIONGOTOi+*()#E0S3S211S4S5acc2S3S263r4r4r4r44S3S275S3S286S4S5S97r1S5r1r18r2r2r2r29r3r3r3r3狀態(tài)轉(zhuǎn)換圖如下:(3)數(shù)據(jù)結(jié)構(gòu)stack<int>status; //狀態(tài)棧stack<char>sign;//符號(hào)棧函數(shù)說(shuō)明voidshowLR()//棧遍歷3.中間代碼(1)屬性文法 產(chǎn)生式 語(yǔ)義規(guī)則 (1)?S→E print(E.val) (2)?E→E(1)+T E.val=E(1).val+T.val (3)?E→T E.val=T.val (4)?T→T(1)*F T.val=T(1).val*F.val (5)?T→T(1) T.val=T(1).val (6)?F→(E) F.val=E.val (7)?F→i F.val=i.lexval數(shù)據(jù)結(jié)構(gòu)stack<string>yuyi;//語(yǔ)義棧yuyi.push();//入棧yuyi.pop();//出棧stringv1,v2,v3,v4;//四元式v1="+"/"*"http://四元式第一位顯示操作符v2=tempYuyiPush.top();//四元式第二位顯示操作數(shù)v3=tempYuyiPush.top();//四元式第三位顯示操作數(shù)v4=intToStr(strToInt(v2)+strToInt(v3));//四元式第四位顯示結(jié)果函數(shù)說(shuō)明voidyffxSolve()//規(guī)約和移進(jìn)處理,以及四元式的輸出{ stack<string>tempYuyiPush; showLR(); inti=-1; if(cifa[m][0]=="6"||cifa[m][0]=="7"){//標(biāo)識(shí)符或數(shù)字 i=0; } if(cifa[m][0]=="8"){//+ i=1; } if(cifa[m][0]=="10"){//* i=2; } if(cifa[m][0]=="14"){//( i=3; } if(cifa[m][0]=="15"){//) i=4; } if(cifa[m][0]=="16"){//# i=5; } if(i==-1){ cout<<"輸入了錯(cuò)誤的種別編碼"<<endl; m++; return; } if(action[status.top()-48][i]>0) { if(action[status.top()-48][i]>100) { if(action[status.top()-48][i]==1000) { cout<<"acc"<<endl; system("pause"); exit(0); } //規(guī)約 ints=action[status.top()-48][i]-100; for(intj=0;j<gyLen[s-1];j++) { if(s!=4) { tempYuyiPush.push(yuyi.top()); yuyi.pop(); } status.pop(); sign.pop(); } intcurrent=status.top(); status.push(action[current-48][6]+48); sign.push('E'); if(s==4) { } else{ v2=tempYuyiPush.top(); tempYuyiPush.pop(); stringv2plus5=tempYuyiPush.top(); tempYuyiPush.pop(); v3=tempYuyiPush.top(); tempYuyiPush.pop(); if(isdigit(v2)&&isdigit(v3)) { if(s==1) { v4=intToStr(strToInt(v2)+strToInt(v3)); } if(s==2) { v4=intToStr(strToInt(v2)*strToInt(v3)); } yuyi.push(v4); } else{ if(v2=="_"&&isdigit(v2plus5)&&v3=="_") { v4=v2plus5; yuyi.push(v4); } else{ stringtempNum=intToStr(yuyiNum); stringtempS="T"+tempNum; yuyiNum++; yuyi.push(tempS); v4=tempS; } } if(s==1) { v1="+"; } if(s==2) { v1="*"; } } } else { //移進(jìn) status.push(action[status.top()-48][i]+48); sign.push(inputSign[i]); if(cifa[m][0]=="6"||cifa[m][0]=="7") { if(cifa[m][0]=="6") { yuyi.push(cifa[m][1]); } else{ stringstreams1; s1<<cifa[m][1]; stringtempVal; s1>>tempVal; yuyi.push(tempVal); } } else{ yuyi.push("_"); } m++; } } else { interr=action[status.top()-48][i]; cout<<"第"<<m+1<<"個(gè)單詞錯(cuò)誤:"<<"\t"<<showErr[err+12]<<endl; system("pause"); m++; } lrNum++;}流程圖4.錯(cuò)誤處理(1)數(shù)據(jù)結(jié)構(gòu)在分析表的空格中分別確定各種不同的錯(cuò)誤類型stringshowErr[12]={ "+前缺少變量或常量", "*前缺少變量或常量", ")前缺少對(duì)應(yīng)(", "連續(xù)的變量或常量,缺少+/*", "(前缺少+/*", "(后缺少常量或變量", "()內(nèi)無(wú)表達(dá)式", "+后缺少變量或常量", "*后缺少變量或常量", "算數(shù)表達(dá)式為空", "缺少對(duì)應(yīng))", "語(yǔ)法分析錯(cuò)誤" };(2)函數(shù)說(shuō)明staticintaction[10][7]={//在分析表的數(shù)組中插入出錯(cuò)的序列 {3,-12,-11,2,-10,-3,1}, {-9,4,5,-8,-10,1000,-1}, {3,-7,-7,2,-6,-2,6}, {-9,104,104,-8,104,104,-1}, {3,-5,-5,2,-10,-5,7}, {3,-
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 電商平臺(tái)物流配送外包協(xié)議
- 新一代智慧城市物流規(guī)劃與建設(shè)方案研究
- 遙控?zé)o人機(jī)航拍合同
- 建筑工地施工安全責(zé)任與風(fēng)險(xiǎn)免責(zé)協(xié)議
- 五保戶照料協(xié)議書(shū)
- 基金投資行業(yè)保密協(xié)議
- 合作居間費(fèi)的合同
- 天然氣工程施工合同
- 物流園區(qū)投資開(kāi)發(fā)合同
- 人教版五年級(jí)下冊(cè)數(shù)學(xué)求最大公因數(shù)練習(xí)200題及答案
- 紅樓夢(mèng)英文版(楊憲益譯)
- 初三開(kāi)學(xué)第一課家長(zhǎng)會(huì)優(yōu)秀課件兩篇
- 馬工程教材《公共財(cái)政概論》PPT-第十四章 國(guó)際財(cái)政
- 獅子王1中英文臺(tái)詞
- 《大學(xué)俄語(yǔ)》教學(xué)大綱
- 清淤工程施工記錄表
- 2022年涉農(nóng)領(lǐng)域涉嫌非法集資風(fēng)險(xiǎn)專項(xiàng)排查工作總結(jié)
- 起重裝卸機(jī)械操作工國(guó)家職業(yè)技能標(biāo)準(zhǔn)(2018年版)
- 五年級(jí)下冊(cè)美術(shù)課件-第2課 新街古韻丨贛美版
- 秦荻輝科技英語(yǔ)寫(xiě)作教程練習(xí)答案(共42頁(yè))
- GB∕T 41168-2021 食品包裝用塑料與鋁箔蒸煮復(fù)合膜、袋
評(píng)論
0/150
提交評(píng)論