




已閱讀5頁,還剩26頁未讀, 繼續免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
編譯技術課程設計班 級 學 號 姓 名 指導老師 2015年 6月目錄一、目的2二、題目2三、要求21.詞法分析22.語法分析23.代碼生成24.錯誤處理2四、實驗環境31.開發環境:32.程序語言:3五、系統實現31.詞法分析32.語法分析43.中間代碼64.錯誤處理7六、程序運行結果81.連乘82.連加93.加乘混合94.帶括號105.常數106.錯誤的算術表達式11七、總結12一、目的是理論與實踐并重的課程,而其課程設計要綜合運用一、二年級所學的多門課程的內容,用來完成一個小型編譯程序。從而鞏固和加強對詞法分析、語法分析、語義分析、代碼生成和報錯處理等理論的認識和理解;培養學生對完整系統的獨立分析和設計的能力,進一步培養學生的獨立編程能力。二、題目題目1 表達式的小型編譯器三、要求1.詞法分析產生語言的單詞序列 2.語法分析能識別由加+ 乘* 括號()操作數(變量或常數)所組成的算術表達式,其文法如下:EE+T|TTT*F|FF(E)|i 使用的分析方法可以是:遞歸下降分析法或LR分析法。 3.代碼生成 產生上述算術表達式的中間代碼4.錯誤處理給出錯誤信息輸入:算術表達式輸出:符號表,常數表。 歸下降分析法:遞歸調用過程/ LR分析法:語義棧和符號棧四元式序列四、實驗環境1.開發環境: Visual Studio 20132.程序語言: C+五、系統實現1.詞法分析(1)單詞符號表(2)狀態轉換圖 (3)數據結構 (4)函數說明void getonechar() /*從輸入的算數表達式中讀取一個字符*/void concatenation()/*將token中的字符串與character中的字符并作為token中新的字符串*/bool letter() /*判斷character中的字符是否為字母的布爾函數,是則返回true,否側返回false*/bool digit()/*判斷character中的字符是否為數字的布爾函數,是則返回true,否側返回false */void retract()/*掃描指針回退一個字符,同時將character置為空白*/int reserve() /*將token中的字符查找保留字數組,若是保留字就返回它的種別編碼,否則返回0*/void buildlist1()/*將標識符登錄到符號表中(value2)*/void buildlist2()/*將常數登錄到常數表中(value1)*/void resolve()/*詞法分析的主要函數,每次識別一個單詞,將種別編碼放入cf中,填入對應的value1和value*/void cffx()/*詞法分析,讀入輸入的算數表達式,循環執行resolve(),直到所有單詞識別完畢*/2.語法分析(1)分析方法說明 本程序采用LR分析法,存在4種動作:移進:使(s,a)的下一個狀態s= ACTIONs,a和輸入符號a進棧,下一輸入符號變成現行輸入符號.規約: 指用某一產生式A進行規約,假若的長度為,則規約動作是去掉棧頂的個棧,即是狀態Sm-變成棧頂狀態,然后使(Sm-,A)的下一狀態s=GOTOSm-,A和文法符號A進棧.規約的動作不改變現行輸入符號,執行規約的動作意味著呈現于棧頂的符號串Xm-+1Xm是一個相對于A的句柄.接受: 宣布分析成功,停止分析器工作.報錯: 報告發現源程序含有錯誤,調用錯誤處理程序.(2)文法(3)數據結構#include /*引入c+標準庫*/stack status;/*狀態棧*/stack sign; /*符號棧*/(4)函數說明Void initYffx() /*語法分析初始化,狀態棧放0,符號棧放#,語義棧放_*/Void showLR()/*遍歷狀態棧,符號棧,語義棧,并顯示出來*/Void yffxSolve() /*查action二維數組,進行移進,規約處理*/Void yyfx()/*循環執行yffxSolve(),直到分析成功或出現錯誤*/Void showBlm()/*顯示變量名表*/Void showCsb()/*顯示常數表*/3.中間代碼(1)屬性文法 移進時: 如果輸入的是終結符,語義棧就移進”_”,如果是非終結符,則語義棧移進對應的常數或變量名.規約時: 如果規約對應的文法是(4)Ei時語義棧不變,對應其他文法時,先pop出棧頂3個元素,再如果是(3)E(E)文法時,語義棧push剛才出棧的第二個元素,如果是(1)EE+E文法時,判斷剛才出棧的第一個和第三個元素是否是常數,是則push兩個常數的和,否則push臨時變量Tn;如果是(1)EE*E文法時,判斷剛才出棧的第一個和第三個元素是否是常數,是則push兩個常數的積,否則push臨時變量Tn;(2)數據結構#include /*引入c+標準庫*/stack yuyi;/*語義棧*/string v1,v2,v3,v4;/*分別表示四元式的參數1,參數2,參數3,參數4*/(3)函數說明語義棧和四元式的產生是在語法分析一起的,在yffxSolve().void yffxSolve()stack tempYuyiPush;showLR();int i = -1;if (cfm = 6 | cfm = 7)i = 0;if (cfm = 8)i = 1;if (cfm = 10)i = 2;if (cfm = 14)i = 3;if (cfm = 15)i = 4;if (cfm = 16)i = 5;if (i = -1) cout 輸入了錯誤的種別編碼 0)if (actionstatus.top()i 100)if (actionstatus.top()i = 1000)cout acc endl;system(pause);exit(0);/*規約*/cout gy endl;int s = actionstatus.top()i - 100;for (int j = 0; j gyLens - 1; j+)if (s != 4)tempYuyiPush.push(yuyi.top();yuyi.pop();status.pop();sign.pop();status.push(actionstatus.top()6);sign.push(E);if (s = 4)else v2 = tempYuyiPush.top();tempYuyiPush.pop();string v2plus5 = 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) & v2 = _)v4 = v2plus5;yuyi.push(v4);else string tempNum = intToStr(yuyiNum);string tempS = T + tempNum;yuyiNum+;yuyi.push(tempS);v4 = tempS;if (s = 1)v1 = +;if (s = 2)v1 = *;else/*移近*/cout yj endl;status.push(actionstatus.top()i);sign.push(inputSigni);if (cfm = 6 | cfm = 7)if (cfm = 6)yuyi.push(value2m);else string tempVal = intToStr(value1m);yuyi.push(tempVal);else yuyi.push(_);m+;elseint err = actionstatus.top()i;cout 第 m 個單詞后 showErrerr + 12endl;system(pause);exit(0);lrNum+;(4)流程圖4.錯誤處理(1)數據結構string showErr12 = FOUND ERROR: +前缺少變量或常量 ,/*0,e1*/ FOUND ERROR: *前缺少變量或常量 ,/*1,e2*/ FOUND ERROR: )前缺少對應( ,/*2,e3*/ FOUND ERROR: 連續的變量或常量,缺少+/* ,/*3,e4*/ FOUND ERROR: (前缺少+/* ,/*4,e5*/ FOUND ERROR: (后缺少常量或變量 ,/*5,e6*/ FOUND ERROR: ()內無表達式 ,/*6,e7*/ FOUND ERROR: +后缺少變量或常量 ,/*7,e8*/ FOUND ERROR: *后缺少變量或常量 ,/*8,e9*/ FOUND ERROR: 算數表達式為空 ,/*9,e10*/ FOUND ERROR: 缺少對應) ,/*10,e11*/ FOUND ERROR: 語法分析錯誤 /*11,e12*/; (2)函數說明yffxSolve()中,查action數組時,遇到e時輸出錯誤位置和錯誤信息,跳過此單詞,繼續進行語法分析.六、程序運行結果1.連乘2.連加3.加乘混合4.帶括號5.常數6.錯誤的算術表達式1)缺少操作符2)缺少操作數3)不完整的()七、總結通過課程設計更加深入地理解了LR分析法對算數表達式處理的過程,熟悉了編譯的四個階段:詞法分析,語法分析,語義分析和中間代碼,以及錯誤處理.在運用c+編寫程序時,也熟悉了c+標準庫中stack的使用.程序是一段一段寫下來的,整個程序沒有整體的規劃,定義的變量又多又亂,造成許多變量需要不斷的修改,而且不利于程序的理解.在對棧處理的時候,發現標準庫定義的stack的函數太少,只有pop,push,empty,top,size,沒有遍歷,需要自己寫.程序需要不斷修改才能完成.檢查時發現:顯示錯誤處理時沒有給出錯誤位置;當出現多個錯誤時,只能顯示第一個錯誤.完整代碼:#include #include #include #include #include using namespace std;string str;/*源程序*/char character;/*源程序當前字符*/int p = -1;/*源程序游標*/string token = ;string blz5 = while, if, else, switch, case ;int c; /*標示符種類編碼*/int length;/*輸入源程序的長度*/int statue = 0;/*判斷詞法分析完成*/int cf50;/*詞法分析后的種類編碼數組*/int value150;/*cf對應常數*/string value250;/*cf對應變量名*/int q = 0;/*cf創建的游標*/int m = 0;/*cf語法分析的游標*/string blmb50;/*變量名表*/int a = 0;/*變量名表的游標*/string csb50;/*常數表*/int b = 0;/*常數表的游標*/static int action107 = 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, -4, -4, 2, -10, -4, 8 , -9, 4, 5, -9, 9, -2, -1 , -9, 101, 5, -9, 101, 101, -1 , -9, 102, 102, -9, 102, 102, -1 , -9, 103, 103, -9, 103, 103, -1 ;stack status;stack sign;stack yuyi;int lrNum = 0;/*分析表步驟號*/char inputSign7 = i, +, *, (, ), #, E ;/*進棧符號*/int gyLen4 = 3, 3, 3, 1 ;int yuyiNum = 1;/*語義臨時變量序號*/string v1, v2, v3, v4;string showErr12 = 發現錯誤: +前缺少變量或常量 ,/*0,e12*/ 發現錯誤: *前缺少變量或常量 ,/*1,e11*/ 發現錯誤: )前缺少對應( ,/*2,e10*/ 發現錯誤: 連續的變量或常量,缺少+/* ,/*3,e9*/ 發現錯誤: (前缺少+/* ,/*4,e8*/ 發現錯誤: (后缺少常量或變量 ,/*5,e7*/ 發現錯誤: ()內無表達式 ,/*6,e6*/ 發現錯誤: +后缺少變量或常量 ,/*7,e5*/ 發現錯誤: *后缺少變量或常量 ,/*8,e4*/ 發現錯誤: 算數表達式為空 ,/*9,e3*/ 發現錯誤: 缺少對應) ,/*10,e2*/ 發現錯誤: 語法分析錯誤 /*11,e1*/;void getonechar()/*if (p = length)system(pause);exit(0);*/p+;while (strp = & strp + 1 = )p+;character = (char)strp;void concatenation()token += character;bool letter()if (character = a & character = A & character = 0 & character = 9)return true;elsereturn false;int reserve()for (int i = 0; i 5; i+)if (token = blzi)return i + 1;return 0;void retract()p-;/*變量名表*/void buildlist1(string token)int i;for (i = 0; i a; i+)if (token = blmbi)break;if (i = a)blmba = token;a+;value2q = token;/*常數表*/void buildlist2(string token)int i;for (i = 0; i b; i+)if (token = csbi)break;if (i = b)csbb = token;b+;stringstream ss;ss num;value1q = num;void resolve()token = ;getonechar();switch (character)case a:case b:case c:case d:case e:case f:case g:case h:case i:case j:case k:case l:case m:case n:case o:case p:case q:case r:case s:case t:case u:case v:case w:case x:case y:case z:while (letter() | digit()concatenation();getonechar();retract();c = reserve();if (c = 0)buildlist1(token);cout (6, token ) endl;cfq = 6;q+;elsecout ( c , blzc - 1 ) endl;cfq = c;q+;break;case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:while (digit()concatenation();getonechar();retract();buildlist2(token);cfq = 7;q+;cout (7, token ) endl;break;case +:cfq = 8;q+;cout (8, +) endl;break;case -:cfq = 9;q+;cout (9, -) endl;break;case (:cfq = 14;q+;cout (14, () endl;break;case ):cfq = 15;q+;cout (15, ) endl;break;case *:cfq = 10;q+;cout (10, *) endl;break;case :getonechar();if (character = =)cfq = 11;q+;cout (11, LE) endl;elseretract();cfq = 11;q+;cout (11, LT) endl;break;case =:getonechar();if (character = =)cfq = 11;q+;cout (11, EQ) endl;elseretract();cfq = 12;q+;cout (12, =) endl;break;case ;:cfq = 12;q+;cout (13, ;) endl;break;case #:cfq = 16;statue = 1;break;case 0:statue = 1;break;case :break;default:cfq = 16;q+;cout 詞法分析 FOUND ERROR endl;break;void cffx()cout 請輸入源程序: endl;statue = 0;getline(cin, str);cout *詞法分析結果* endl;while (true)if (statue = 1)break;resolve();void initYffx()sign.push(#);status.push(0);yuyi.push(_);void showLR()/*棧遍歷 先pop再push*/string tempSign;string tempStatus;string tempYuyi;string tempFour;stack tempSi;stack tempSt;stack tempYu;int tempLen1 = sign.size();int tempLen2 = status.size();int tempLen3 = yuyi.size();for (int i = 0; i tempLen1; i+)tempSign = tempSign + sign.top();tempSi.push(sign.top();sign.pop();for (int i = 0; i tempLen2; i+)tempStatus = tempStatus + (char)(status.top()+48);tempSt.push(status.top();status.pop();for (int i = 0; i tempLen3; i+)tempYuyi = tempYuyi + yuyi.top();tempYu.push(yuyi.top();yuyi.pop();if (v1 = )tempFour = ;else tempFour = ( + v1 + , + v2 + , + v3 + , + v4 + );cout setw(2) lrNum setw(15) tempSign setw(15) tempStatus setw(15) tempYuyi setw(15) tempFour endl;for (int i = 0; i tempLen1; i+)sign.push(tempSi.top();tempSi.pop();for (int i = 0; i tempLen2; i+)status.push(tempSt.top();tempSt.pop();for (int i = 0; i tempLen3; i+)yuyi.push(tempYu.top();tempYu.pop();v1 = ;bool isdigit(string str)for (int i = 0; i 9) | (str.at(i) 0)return false;return true;int strToInt(string str)stringstream s;s tempInt;return tempInt;string intToStr(int inter)stringstream s;s tempStr;return tempStr;void yffxSolve()stack tempYuyiPush;showLR();int i = -1;if (cfm = 6 | cfm = 7)i = 0;if (cfm = 8)i = 1;if (cfm = 10)i = 2;if (cfm = 14)i = 3;if (cfm = 15)i = 4;if (cfm = 16)i = 5;if (i = -1) cout 輸入了錯誤的種別編碼 0)if (actionstatus.top()i 100)if (actionstatus.top()i = 1000)cout acc endl;system(pause);exit(0);/*規約*/cout gy endl;int s = actionstatus.top()i - 100;for (int j = 0; j gyLens - 1; j+)if (s != 4)tempYuyiPush.push(yuyi.top();yuyi.pop();status.pop();sign.pop();status.push(actionstatus.top()6);sign.push(E);if (s = 4)else v2 = tempYuyiPush.top();tempYuyiPush.pop();string v2plus5 = tempYuyiPush.top();tempYuyiPush.pop
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中國縮宮素注射液行業市場競爭格局及發展趨勢與投資前景研究報告2025-2028版
- 和聲與旋律互動試題及答案
- 2024年江蘇連云港農業農村局招聘真題
- 2024年首都醫科大學附屬北京天壇醫院招聘筆試真題
- 中國白廠絲絲織品行業市場發展前景及發展趨勢與投資戰略研究報告2025-2028版
- 中國電熱杯行業發展趨勢與投資戰略研究報告2025-2028版
- 2025年大學化學全線復習試題及答案
- 中國烽火輪動輪行業市場發展前景及發展趨勢與投資戰略研究報告2025-2028版
- 商務英語方案制定試題及答案
- 中國格子布拉桿箱行業市場發展前景及發展趨勢與投資戰略研究報告2025-2028版
- 鏟車裝載機知識培訓課件
- 2025年遼寧省葫蘆島市綏中縣中考一模語文試題含答案
- 家政經理培訓課件
- 2024-2025學年高一下學期期中考試化學試卷
- 四川省南充市高級中學2024-2025學年高二下學期期中考試 化學(含答案)
- 科學管理之父:弗雷德里克·溫斯洛·泰勒
- 國際教育規劃合同8篇
- 浙江國企招聘2025寧波鎮海區國資系統招聘33人筆試參考題庫附帶答案詳解
- 自動化競聘試題及答案
- 2025至2030年中國軍用仿真(軟件)行業發展戰略規劃及投資方向研究報告
- 整裝定制合同協議
評論
0/150
提交評論