![江蘇大學編譯課程設計_第1頁](http://file4.renrendoc.com/view/3a61e3cba2b1f55695fbed1f919b17f4/3a61e3cba2b1f55695fbed1f919b17f41.gif)
![江蘇大學編譯課程設計_第2頁](http://file4.renrendoc.com/view/3a61e3cba2b1f55695fbed1f919b17f4/3a61e3cba2b1f55695fbed1f919b17f42.gif)
![江蘇大學編譯課程設計_第3頁](http://file4.renrendoc.com/view/3a61e3cba2b1f55695fbed1f919b17f4/3a61e3cba2b1f55695fbed1f919b17f43.gif)
![江蘇大學編譯課程設計_第4頁](http://file4.renrendoc.com/view/3a61e3cba2b1f55695fbed1f919b17f4/3a61e3cba2b1f55695fbed1f919b17f44.gif)
![江蘇大學編譯課程設計_第5頁](http://file4.renrendoc.com/view/3a61e3cba2b1f55695fbed1f919b17f4/3a61e3cba2b1f55695fbed1f919b17f45.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第19頁編譯技術(shù)課程設計班級學號姓名指導老師2015年6月
目錄TOC\o"1-3"\h\u20597一、目的 218106二﹑題目 215979三、要求 217037四、實驗環(huán)境 217532五、系統(tǒng)實現(xiàn) 3255621.詞法分析 3260262.語法分析 746573.中間代碼 8168104.錯誤處理 1329508六、程序運行結(jié)果 14165961.成功用例 1424902.出錯處理用例 1520537七、總結(jié) 18
一、目的<<編譯技術(shù)>>是理論與實踐并重的課程,而其課程設計要綜合運用一、二年級所學的多門課程的內(nèi)容,用來完成一個小型編譯程序。從而鞏固和加強對詞法分析、語法分析、語義分析、代碼生成和報錯處理等理論的認識和理解;培養(yǎng)學生對完整系統(tǒng)的獨立分析和設計的能力,進一步培養(yǎng)學生的獨立編程能力。二﹑題目表達式的小型編譯器三、要求表達式的小型編譯器:詞法分析產(chǎn)生語言的單詞序列語法分析能識別由加+乘*括號()操作數(shù)(變量或常數(shù))所組成的算術(shù)表達式,其文法如下:E→E+T|TT→T*F|FF→(E)|i使用的分析方法可以是:遞歸下降分析法或LR分析法。中間代碼生成產(chǎn)生上述算術(shù)表達式的中間代碼錯誤處理給出錯誤信息輸入:算術(shù)表達式輸出:符號表,常數(shù)表。遞歸下降分析法:遞歸調(diào)用過程/LR分析法:語義棧和符號棧四元式序列四、實驗環(huán)境操作系統(tǒng):Win8.1實驗軟件:VisualStudio2013五、系統(tǒng)實現(xiàn)1.詞法分析(1)單詞符號表單詞符號種別編碼助記符內(nèi)碼值while1while--if2if--Else3else--switch4switch--case5case--標識符6idid在符號表中的位置常數(shù)7numnum在常數(shù)表中的位置+8+9*10*--<=11relopLE<11relopLT==11relopEQ=12=--;13;--(14(--)15)--#16#--狀態(tài)轉(zhuǎn)換圖(只畫出算數(shù)表達式需要部分)數(shù)據(jù)結(jié)構(gòu)單詞二元式:(單詞種別,單詞自身的值)符號表:(表序號,符號表自身的值)常數(shù)表:(表序號,常數(shù)表自身的值)函數(shù)說明//判斷是否為字母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];}//掃描指針回退一個字符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.語法分析(1)分析方法說明LR分析法指從左至右掃描和自底向上的語法分析,且在分析的每一步,只須根據(jù)分析棧當前已移進和歸約出的全部文法符號,并至多再向前查看K個輸入符號,就能確定相對于某一產(chǎn)生式左部符號的句柄是否已在分析棧的頂部形成,從而也就可以確定當前所應采取的分析動作(是移進還是按某一產(chǎn)生式進行歸約等)。每一項ACTION[s,a]所規(guī)定的動作是以下四種情況之一:(1)移進:使(s,a)的下一狀態(tài)s'=ACTION[s,a]和輸入符號a進棧(注:對終結(jié)符a來說,下一狀態(tài)s'=GOTO[s,a]的值實際上是放在ACTION[s,a]中的),下一輸入符號變成現(xiàn)行輸入符號。(2)歸約:指用某一產(chǎn)生式A→β進行歸約。假若β的長度為γ,則歸約的動作是去掉棧頂?shù)摩脗€項,即使狀態(tài)sm-γ變成棧頂狀態(tài),然后使(sm-γ,A)的下一狀態(tài)s'=GOTO[sm-γ,A]和文法符號(非終結(jié)符)A進棧。歸約的動作不改變現(xiàn)行輸入符號,執(zhí)行歸約的動作意味著呈現(xiàn)于棧頂?shù)姆柎甔m-γ+1…Xm是一個相對于A的句柄。(3)接受:宣布分析成功,停止分析器的工作。(4)報錯:報告發(fā)現(xiàn)源程序含有錯誤,調(diào)用出錯處理程序。LR分析器的總控程序本身的工作十分簡單,它的任何一步只需按分析棧的棧頂狀態(tài)s和現(xiàn)行輸入符號a執(zhí)行ACTION[s,a]所規(guī)定的動作即可。文法LR分析表如下:狀態(tài)ACTIONGOTOi+*()#E0S3S211S4S5acc2S3S263r4r4r4r44S3S275S3S286S4S5S97r1S5r1r18r2r2r2r29r3r3r3r3狀態(tài)轉(zhuǎn)換圖如下:(3)數(shù)據(jù)結(jié)構(gòu)stack<int>status; //狀態(tài)棧stack<char>sign;//符號棧函數(shù)說明voidshowLR()//棧遍歷3.中間代碼(1)屬性文法 產(chǎn)生式 語義規(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;//語義棧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ù)說明voidyffxSolve()//規(guī)約和移進處理,以及四元式的輸出{ stack<string>tempYuyiPush; showLR(); inti=-1; if(cifa[m][0]=="6"||cifa[m][0]=="7"){//標識符或數(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<<"輸入了錯誤的種別編碼"<<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 { //移進 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<<"個單詞錯誤:"<<"\t"<<showErr[err+12]<<endl; system("pause"); m++; } lrNum++;}流程圖4.錯誤處理(1)數(shù)據(jù)結(jié)構(gòu)在分析表的空格中分別確定各種不同的錯誤類型stringshowErr[12]={ "+前缺少變量或常量", "*前缺少變量或常量", ")前缺少對應(", "連續(xù)的變量或常量,缺少+/*", "(前缺少+/*", "(后缺少常量或變量", "()內(nèi)無表達式", "+后缺少變量或常量", "*后缺少變量或常量", "算數(shù)表達式為空", "缺少對應)", "語法分析錯誤" };(2)函數(shù)說明staticintaction[10][7]={//在分析表的數(shù)組中插入出錯的序列 {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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年倉庫管理合同正式樣本
- 2025年海綿城市項目提案報告
- 2025年工程建材跨區(qū)域物流合同
- 2025年冷凍食品物流協(xié)調(diào)協(xié)議書
- 2025年合伙事業(yè)策劃協(xié)議書樣本
- 標準文本2025年獨家房產(chǎn)中介代理合同
- 2025年個人消費質(zhì)押擔保短期借款合同
- 2025年物業(yè)經(jīng)理合同聘用標準
- 2025年標準軟件策劃保密協(xié)議指南
- 2025年保密合同書范本重訂協(xié)議
- LY/T 3400-2024荒漠與荒漠化防治術(shù)語
- 2025年春季學期學校全面工作安排表
- 幼兒園開學前的廚房人員培訓
- 《幼兒教育政策與法規(guī)》教案-單元6 幼兒園的工作人員
- 油漆工培訓試題
- 2024年四川綿陽初中學業(yè)水平考試英語試卷真題(含答案詳解)
- 光伏施工安全培訓課件
- 2025年閥門和龍頭項目發(fā)展計劃
- 快手信息流廣告優(yōu)化師(初級)認證考試題庫(附答案)
- 園林景觀綠化工程施工組織設計方案
- 消防員證考試題庫2000題中級
評論
0/150
提交評論