WHILE循環(huán)語句的翻譯程序設(shè)計_第1頁
WHILE循環(huán)語句的翻譯程序設(shè)計_第2頁
WHILE循環(huán)語句的翻譯程序設(shè)計_第3頁
WHILE循環(huán)語句的翻譯程序設(shè)計_第4頁
WHILE循環(huán)語句的翻譯程序設(shè)計_第5頁
已閱讀5頁,還剩21頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、學(xué) 號: 課 程 設(shè) 計題 目WHILE循環(huán)語句的翻譯程序設(shè)計學(xué) 院計算機(jī)科學(xué)與技術(shù)學(xué)院專 業(yè)計算機(jī)科學(xué)與技術(shù)專業(yè)班 級計科1002班姓 名指導(dǎo)教師2013年1月9日課程設(shè)計任務(wù)書學(xué)生姓名: 專業(yè)班級: 計算機(jī) 班 指導(dǎo)教師: 蔡 菁 工作單位:計算機(jī)科學(xué)與技術(shù)學(xué)院 題目: WHILE循環(huán)語句的翻譯程序設(shè)計(LL(1)法、輸出四式)初始條件:理論:學(xué)完編譯原理課程,掌握一種計算機(jī)高級語言的使用。實(shí)踐:計算機(jī)實(shí)驗室提供計算機(jī)及軟件環(huán)境。如果自己有計算機(jī)可以其上進(jìn)行設(shè)計。要求完成的主要任務(wù): (包括課程設(shè)計工作量及其技術(shù)要求,以及說明書撰寫等具體要求)(1) 寫出符合給定的語法分析方法的文法及屬性

2、文法。(2) 完成題目要求的中間代碼四元式的描述。(3) 寫出給定的語法分析方法的思想,完成語法分析和語義分析程計。(4) 編制好分析程序后,設(shè)計若干用例,上機(jī)測試并通過所設(shè)計的分析程序。(5) 設(shè)計報告格式按附件要求書寫。課程設(shè)計報告書正文的內(nèi)容應(yīng)包括:1 系統(tǒng)描述(問題域描述);2 文法及屬性文法的描述;3 語法分析方法描述及語法分析表設(shè)計;4 按給定的題目給出中間代碼形式的描述及中間代碼序列的結(jié)構(gòu)設(shè)計;5 編譯系統(tǒng)的概要設(shè)計;6 詳細(xì)的算法描述(流程圖或偽代碼);7 軟件的測試方法和測試結(jié)果;8 研制報告(研制過程,本設(shè)計的評價、特點(diǎn)、不足、收獲與體會等);9 參考文獻(xiàn)(按公開發(fā)表的規(guī)范

3、書寫)。時間安排:設(shè)計安排一周:周1、周2:完成系統(tǒng)分析及設(shè)計。周3、周4:完成程序調(diào)試及測試。周5:撰寫課程設(shè)計報告。設(shè)計驗收安排:設(shè)計周的星期五第1節(jié)課開始到實(shí)驗室進(jìn)行上機(jī)驗收。設(shè)計報告書收取時間:設(shè)計周的次周星期一上午10點(diǎn)。指導(dǎo)教師簽名: 2013年 1月 9日系主任(或責(zé)任教師)簽名: 2013年 1月 9日WHILE循環(huán)語句的翻譯程序設(shè)計(LL(1)法、輸出四元式)1. 系統(tǒng)描述(1) 按照課程設(shè)計的要求,寫一個能識別while循環(huán)語句的文法,通過一定的變換使它符合預(yù)測分析法的要求,然后按照這個文法編寫一個程序,該程序能識別輸入的語句是否符合while語句的文法,或者能不能通過文法

4、的開始符號推導(dǎo)出該語句。(2) 該程序應(yīng)該包括詞法分析器,能對輸入的語句進(jìn)行詞法分析,然后再對輸出結(jié)果。詞法分析器應(yīng)能識別關(guān)鍵字,標(biāo)示符,常量,操作符等。(3) 該程序的語法分析器能對輸入的語法進(jìn)行分析,判斷輸入語句能否滿足while循環(huán)語句的文法。通過預(yù)測分析方法對語句進(jìn)行分析,看能否由文法開始符號推導(dǎo)出輸入語句。(4) 該程序的語義分析器就是對分析結(jié)果進(jìn)行輸出,要求輸出結(jié)果是四元式。2 文法及屬性文法的描述: 2.1 文法描述:2.1.1 基本概念:文法是對語言結(jié)構(gòu)的定義與描述。即從形式上用于描述和規(guī)定語言構(gòu)的稱為“文法”。2.1.2 此設(shè)計針對的文法為: 消除左遞歸后的產(chǎn)生式: S-&g

5、t;while(A)B A->CDC D-> =|>|<|>=|<=C->EG G->+EG|-EG|e E->FH H->*FH|/FH|e F->(C)|i B->i=C 其中e代表為空 2.2 屬性文法的描述: 2.2.1 屬性文法的定義形式: 每個文法符號有一組屬性,每個文法產(chǎn)生式A->有一組產(chǎn)生式b:=f(c1,c2,,ck)的語義規(guī)則,其中f式函數(shù),b和c1,c2,,ck式該產(chǎn)生式文法符號的屬性。 2.2.2 此設(shè)計題目的屬性文法為:產(chǎn)生式屬性文法S -> id := Ep := lookup(id

6、.name);If p != nil thenemit(p “:=” E.place)else errorE -> E1 + E2E.place := newtemp;emit(E.place “:=” E1.place “+” E2.place)E -> E1 - E2E.place := newtemp;emit(E.place “:=” E1.place “-” E2.place)E -> E1 * E2E.place := newtemp;emit(E.place “:=” E1.place “*” E2.place)E -> E1 / E2E.place :=

7、 newtemp;emit(E.place “:=” E1.place “/” E2.place)E -> ( E1 )E.place:=E1.place;E -> idp := lookup();If p != nil thenE.place := pelse errorE -> E1 or E2E.place := newtemp;emit(E.place“:=”E1.place“or”E2.place) E -> E1 and E2E.place := newtemp;emit(E.place “:=” E1.place “and” E2.place

8、)E -> id1 rop id2E.place := newtemp;emit(“if” id1.place “rop” id2.place “goto” nextstat+3);emit(E.place := “0”);emit(“goto” nextstat+2);emit(E.place := “1”); 3 詞法分析方法描述及詞法分析表設(shè)計 3.1詞法分析定義詞法分析是編制一個讀單詞的過程,從輸入的源程序中,識別出各個具有獨(dú)立意義的單詞,即基本保留字、標(biāo)識符、常數(shù)、運(yùn)算符、分隔符五大類。并依次輸出各個單詞的內(nèi)部編碼及單詞符號自身值。程序語言的單詞符號一般分為五種:關(guān)鍵字(保留字

9、/基本字)if、while、begin;標(biāo)識符:常量名、變量名;常數(shù),運(yùn)算符;界限符。 3.2詞法分析輸出形式詞法分析器輸出的單詞符號常常表示為二元式:(單詞種別,單詞符號的屬性值)4語法分析方法描述及語法分析表設(shè)計;4.1語法分析方法描述4.1.1 預(yù)測分析法的基本思想所謂的LL(1)方法是在實(shí)現(xiàn)時用到一個LL(1)分析鉅陣和一個分析棧以及預(yù)測分析程序。分析鉅陣的元素MA,a中的下標(biāo)A為非終結(jié)符,a為終結(jié)符或句子的結(jié)束標(biāo)記“#”,鉅陣元素MA,a的內(nèi)容為一條關(guān)于A的產(chǎn)生式。它表明當(dāng)用非終結(jié)符A向下推而當(dāng)輸入符a時,所應(yīng)該采用的后選式。當(dāng)鉅陣元素為空時,則表示用A往下推導(dǎo)時遇到了不應(yīng)該出現(xiàn)的符

10、號,即A與a不能匹配,因此應(yīng)該出錯處理。在構(gòu)造預(yù)測分析表時,對每個終結(jié)符或“#”號用a表示,則若aSELECT(A->a)。令MA,a= A->a(一般為了簡化,取MA,a= a)把所有的無定義的MA,a標(biāo)上ERROR(一般在表中用空白表示)。4.1.3 簡單優(yōu)先文法的操作步驟求SELECT (A->a)的算法:(1) 若FIRST(a);()(2) 若FIRST(a),則令SELECT(A->a)=FIRST(a),否則求FOLLOW(A),并令SELECT (A->a)= FIRST(a)FOLLOW(A)對以上產(chǎn)生式求select集合為:SELECT(S_&

11、gt;w(A)B)=wSELECT(A->CDC)=i,CSELECT( D->>|<|=|>=|<= ) = >|<|=|>=|<=SELECT(C->EG)=(,iSELECT(G->+EG)=+ SELECT(G->-EG)=- SELECT(G->e)= ),>=,<=,>,<,= SELECT(E->FH)=(,iSELECT(H->*FH)=* SELECT(H->/FH)=/ SELECT(H->e)= +,-,),>=,<=,>,

12、<,= SELECT(F->(C))=(SELECT(F->i)=i SELECT(B->i=C)=i 根據(jù)select集得到預(yù)測分析表 w()i=+-*/><>=<=#SW(A)BACDCCDCD><>=<=CEGEGGe+EG-EGeeeeeeEFHFHHeee*FH/FHeeeeeeF(C)iF(C)iBi=C分析模型: 5 中間代碼的描述:5.1中間代碼概述:本此設(shè)計要求使用的是3地址的中間代碼,3地址代碼是由下面一般形式構(gòu)成的語句序列: x:=y op z;其中x,y,z為名字,常數(shù)或編譯時產(chǎn)生的臨時變量;op代

13、表運(yùn)算符號如標(biāo)點(diǎn),浮點(diǎn)運(yùn)算符號等等。每個語句的右邊只能有一個運(yùn)算符。表達(dá)式x + y * z翻譯成的三地址語句序列是:t1 := y * z t2 := x + t1常用的三地址語句有:賦值語句x := y op z, x := op y, x := y無條件轉(zhuǎn)移goto L條件轉(zhuǎn)移if x relop y goto L過程調(diào)用param x 和call p , n過程返回 return y索引賦值x := yi和 xi := y地址和指針賦值x := &y,x := *y和*x := y5.2本次設(shè)計的中間代碼:本次程序的中間代碼是根據(jù)一定的語義規(guī)則寫出的: T while A do

14、 E F 代碼結(jié)構(gòu): Sbegin : Ecode to E.tureE.ture : Acode to E.falsegoto S.beginto E.false : 本次設(shè)計最終應(yīng)產(chǎn)生的3地址形如:1 (*,b,c,t1)2 (*,b,d,t2)3 (+,t1,t2,t3)4 (:=,t3,-,t4)6 簡要的分析與概要設(shè)計6.1文法的分析設(shè)計(1) 在這次課程設(shè)計中,第一步就是要設(shè)計一個良好的健壯的文法,這就要求對簡單優(yōu)先分析方法要有較深地理解.首先文法應(yīng)該滿足3.1.2目中的文法的限制.(2) 另外要保證文法完全沒有問題是不可能的,我是在建立優(yōu)先關(guān)系矩陣后,選取一個簡單的例子按照最初的

15、簡單優(yōu)先關(guān)系矩陣來歸約測試,看看能不能歸約成文法的開始符,如果不能則說明文法有問題再慢慢地修改.不斷完善從而得到最終的文法.6.2詞法的分析設(shè)計(1) 詞法分析的主要任務(wù)是從左到右一個字符一個字符地讀入源程序,對構(gòu)成源程序的字符流進(jìn)行掃描和分解,從而識別出一個個的單詞.(2) 詞法分析因為在平時實(shí)驗已經(jīng)做過,所以實(shí)現(xiàn)較簡單,但是針對此次試驗是對while循環(huán)語句的翻譯,我把相應(yīng)的存放關(guān)鍵字和限制符的數(shù)組相應(yīng)的只放與本次實(shí)驗有關(guān)的內(nèi)容進(jìn)行稍微的削減,這樣既可以把輸入的while循環(huán)語句分析成為一個個具有獨(dú)立意義的單詞并且又相應(yīng)的類型說明,而且還可以簡化代碼,從而提高分析效率.6.3語法的分析設(shè)計

16、(1) 語法分析的任務(wù)就是判斷輸入的符號串是不是給定文法的一個句子.在此次課程設(shè)計中,語法分析的重點(diǎn)是由文法開始符號如何推導(dǎo),就是判斷能否由文法開始符號推導(dǎo)出輸入符號串.(2) 在設(shè)計中,按照預(yù)測分析法的步驟對文法開始符號進(jìn)行推導(dǎo),如果能夠推導(dǎo)產(chǎn)生輸入符號串,則說明該字符串符合設(shè)計的文法,否則說明輸入的字符串不合法.6.4語義的分析設(shè)計 (1) 語義分析的主要任務(wù)是審查源程序有無語義錯誤,為代碼生成階段收集類型信息.對于本課程設(shè)計來說,就是把輸入的符合文法規(guī)定的字符串轉(zhuǎn)換翻譯成有具體意義的三地址形式輸出來.(2) 在設(shè)計中,我覺得這一模塊的實(shí)現(xiàn)相對要困難一些.while循環(huán)語句由兩種不同的語句

17、翻譯,要分別對待,即賦值語句的翻譯和布爾表達(dá)式的翻譯.前者的實(shí)現(xiàn)相對較容易,后者設(shè)計時要用到拉鏈算法中的合并和回填(參見23屬性文法的描述).6.5總體的分析設(shè)計(1) 總體設(shè)計的主要任務(wù)是把詞法分析、語法分析、語義分析這幾個模塊有機(jī)的結(jié)合起來形成一個完整的while循環(huán)語句的翻譯器.(2) 詞法分析是從一個文件中讀入字符,經(jīng)過處理輸出一個文件內(nèi)容是一個個單詞;而語法分析是從詞法分析的輸出結(jié)果中讀出一個個單詞并進(jìn)行歸約,如果規(guī)約不成功,則顯示錯誤提示,如果歸約成功,輸入的字符串是合法的,那么就由語義分析器來輸出輸入符號串的三地址表示形式.從而完成翻譯工作.7 詳細(xì)的算法描述7.1主要程序流程圖

18、7.1.1 程序總流程圖中間代碼短語單詞源程序詞法分析語法分析語義分析圖6.1.1程序總流程圖結(jié)束符“#”界限符開始到輸入流中讀下一字符ÞCharChar是什么?初始化標(biāo)識符和關(guān)鍵字詞法分析子程序字母數(shù)字運(yùn)算符無符號數(shù)詞法分析子程序運(yùn)算符詞法分析子程序界限符詞法分析子程序結(jié)束7.1.2 詞法分析流程圖圖6.1.2詞法分析流程圖把單詞存入一個隊列中將分析棧元素與目標(biāo)代碼列分析需輸出四元式?輸出四元式是否結(jié)束分析棧中只剩#合法?否是7.1.3 語法語義分析流程圖開始圖6.1.3語法語義分析流程圖8.程序偽代碼 8.1詞法分析程序 void lexcal()infile.open(&quo

19、t;input.txt",ios:in);while(infile.fail()顯示出錯處理 ;outfile.open("wordoutput.txt",ios:out);先讀一個字符;while(讀入的字符不為文件結(jié)束符) if(讀入標(biāo)識符和關(guān)鍵字)對應(yīng)的詞法分析子程序;if(讀入無符號整數(shù))對應(yīng)的詞法分析子程序;if(讀入運(yùn)算符)對應(yīng)的詞法分析子程序;if(讀入界限符)對應(yīng)的詞法分析子程序;if(讀入字符串常量)對應(yīng)的詞法分析子程序;/while/lexcal8.2語法分析程序建立一個鏈表strList和分析棧destList,其中strList用來存放輸入

20、代碼序列,而destList存放待推導(dǎo)的非終結(jié)符串。取strList表頭元素和destList的棧頂元素,查找預(yù)測分析表,得到要推導(dǎo)得到的產(chǎn)生式右部,然后逆序壓到destList棧中,如果查表為空,則表示出錯,返回。檢查strList的隊首元素與destList的棧頂元素是否相同,把相同的元素出隊,出棧。判斷destList棧中是否僅?!?”,是則表示分析完成。8.3輸出四元式采用了兩個棧,一個操作符棧optr,一個操作數(shù)棧opnd事先存儲各運(yùn)算符之間的棧內(nèi)與棧外優(yōu)先級 (1)讀入一個用中綴表示的簡單算術(shù)表達(dá)式,為方便起見,設(shè)該簡單算術(shù)表達(dá)式的右端多加上了優(yōu)先級最低的特殊符號“#”。(2)從左

21、至右掃描該算術(shù)表達(dá)式,從第一個字符開始判斷,如果該字符是數(shù)字,則分析到該數(shù)字串的結(jié)束并將該數(shù)字串直接壓入opnd棧。(4)如果不是數(shù)字,該字符則是運(yùn)算符,此時需比較優(yōu)先關(guān)系。做法如下:將該字符與運(yùn)算符棧頂?shù)倪\(yùn)算符的優(yōu)先關(guān)系相比較。如果該字符優(yōu)先關(guān)系高于此運(yùn)算符棧頂?shù)倪\(yùn)算符,則將該運(yùn)算符入棧。倘若不是的話,則將此運(yùn)算符棧頂?shù)倪\(yùn)算符從棧中彈出,將該字符入棧。從opnd棧中彈出兩個操作數(shù)a1和a2,調(diào)用Expression(string m,string n,string k,string s),形成四元式。(5)重復(fù)上述操作(1)-(2)直至掃描完整個簡單算術(shù)表達(dá)式,確定所有字符都得到正確處理 9

22、 實(shí)驗結(jié)果 9.1測試用例 9.2詞法分析結(jié)果 9.3語法分析和四元式結(jié)果 10.心得體會 這次的課程設(shè)計使我無論在理論基礎(chǔ)知識上,動手實(shí)踐方面,還是在心理素質(zhì)方面都得到了鍛煉和提高。首先是基礎(chǔ)知識方面,由于授課學(xué)時的限制和自己學(xué)習(xí)中的疏忽,遺漏了一些比較細(xì)小的知識點(diǎn),例如:數(shù)組下標(biāo)的問題,和棧使用的時候的棧頂指針指向問題,問題雖然小,但是在運(yùn)行程序時,這種錯誤的確是比較具有隱蔽性的,也比較困擾人的。其次是在上機(jī)實(shí)驗方面,在平時的學(xué)習(xí)中,學(xué)習(xí)的是理論知識,所以在進(jìn)行課程設(shè)計的時候,發(fā)現(xiàn)一定的難度,首先是文件的預(yù)定義包含,在程序中用到的函數(shù)不清楚是在哪個預(yù)定義的函數(shù)中,因此在編譯的時候總會出現(xiàn)“

23、未定義的函數(shù)”的錯誤提示。 其次是設(shè)計的思想,由于語句相對比較多,很多函數(shù)的組合沒有處理好,經(jīng)常會出現(xiàn)函數(shù)類型不匹配的錯誤。由于程序比較長,語句的包含關(guān)系的搞錯和匹配問題也是編譯時的瓶頸??傊谶@次課程設(shè)計后我的理論知識,動手動腦能力,和心理素質(zhì)都有了一定的提高,經(jīng)過這次實(shí)驗,我基本明白了自己做一個課題的實(shí)驗過程,從中也學(xué)到很多東西,這是以前按教科書上照搬照套的實(shí)驗得不到的。我明白了自己以后還要繼續(xù)努力,在這里,我也要感謝我的同學(xué)和老師,正是他們幫助我解決了課程設(shè)計中遇到的一個又一個難題。附錄源碼 #include <string>#include <fstream>

24、#include <iostream>#include <list>#include <iomanip>#include <stdio.h> #include "ctype.h"#include<cmath>using namespace std;char save20;int total=1;char *sum10="int","char","bool","do","while","if",&q

25、uot;else","for","switch","case"FILE *pWrite=fopen("cout.txt","w");FILE *pRead=fopen("cpp.txt","r"); struct expression /存儲四元式 string symbol; /操作符 string num1; /第一個操作數(shù) string num2; /第二個操作數(shù) string result; /結(jié)果變量;list<expressio

26、n> expList;void produceExp();long alpha(char c1,long pos)/標(biāo)識符分析函數(shù) int i,j=0; long curpos2; char *opp,ch; i=0; memset(save,0,20); savei+=c1; fseek(pRead, pos, SEEK_SET); while(fgets(&ch,2,pRead)&&!feof(pRead)&&isalnum(ch) savei+=ch; opp=save; curpos2= ftell(pRead); for(i=0;i<

27、;10;i+)/*把字母與關(guān)鍵字表核對,如果是關(guān)鍵字就設(shè)置j=1*/ if(!(strcmp(opp,sumi)/*比較兩個字符串*/ fprintf(pWrite,"Wn"); /*識別關(guān)鍵字*/ j=1; if(j=0) fprintf(pWrite,"%sn",opp); /*識別標(biāo)識符*/ return curpos2;long digit(char c1,long pos)/無符號數(shù)識別函數(shù)long curpos3;int N=0,P=0,j=0,isint=1;int e=1,d;float t;char ch;fseek(pRead, po

28、s-1, SEEK_SET); while(fgets(&ch,2,pRead)&&!feof(pRead)&&isdigit(ch)d=atoi(&ch);N=N*10+d;curpos3=ftell(pRead);if(ch='.')fseek(pRead, curpos3, SEEK_SET); fgets(&ch,2,pRead);isint=0;if(!isdigit(ch) cout<<"數(shù)字輸入有誤!"<<endl; return -1;elsefseek(pRea

29、d, curpos3, SEEK_SET);while(fgets(&ch,2,pRead)&&isdigit(ch)d=atoi(&ch);N=N*10+d;j+;curpos3=ftell(pRead);if(ch='e')fseek(pRead, curpos3, SEEK_SET); fgets(&ch,2,pRead);if(ch='-')e=-1;if(ch='+'|ch='-')fseek(pRead, curpos3+1, SEEK_SET); fgets(&ch,2

30、,pRead);curpos3=ftell(pRead);if(isdigit(ch)d=atoi(&ch);P=P*10+d;fseek(pRead, curpos3, SEEK_SET);while(fgets(&ch,2,pRead)&&!feof(pRead)&&isdigit(ch)d=atoi(&ch);P=P*10+d;curpos3=ftell(pRead);t=N*pow(10,e*P-j);fprintf(pWrite,"%0.2fn",t); else t=N*pow(10,e*P-j);fpri

31、ntf(pWrite,"%0.2fn",t); return curpos3;int cifafenxi()char ch;long curpos;if(pRead=NULL)cout<<"Can't open input file!n"return -1;while(fgets(&ch,2,pRead)&&!feof(pRead)if(ch=' '|ch='n'|ch='t')continue;if(isalpha(ch)curpos = ftell(pRead

32、);curpos=alpha(ch,curpos);fseek(pRead, curpos-1, SEEK_SET); else if(ch='')fprintf(pWrite,"%cn",ch);else if(ch='/')fprintf(pWrite,"%cn",ch); else if(ch='*') fprintf(pWrite,"%cn",ch); else if(ch='(') fprintf(pWrite,"%cn",ch); else

33、 if(ch=')') fprintf(pWrite,"%cn",ch); else if(ch='') fprintf(pWrite,"%cn",ch); else if(ch='') fprintf(pWrite,"%cn",ch); else if(ch='=') fgets(&ch,2,pRead); if(ch='=') fprintf(pWrite,"=n"); else fprintf(pWrite,"=

34、n");curpos = ftell(pRead);fseek(pRead, curpos-1, SEEK_SET); else if(ch='+') fprintf(pWrite,"%cn",ch); else if(ch='-') fprintf(pWrite,"%cn",ch); else if(ch='>') fgets(&ch,2,pRead); if(ch='=') fprintf(pWrite,">=n"); else fpri

35、ntf(pWrite,"<n");curpos = ftell(pRead);fseek(pRead, curpos-1, SEEK_SET); else if(ch='<') fgets(&ch,2,pRead); if(ch='=') fprintf(pWrite,"<=n"); else fprintf(pWrite,"<n");curpos = ftell(pRead);fseek(pRead, curpos-1, SEEK_SET); else if(isdig

36、it(ch) curpos = ftell(pRead); curpos=digit(ch,curpos); if(curpos=-1) return -1; fseek(pRead, curpos-1, SEEK_SET); total+; cout<<"詞法分析完成!"<<endl; fclose(pWrite); fclose(pRead); string getAction(string ter,string nonter)/cout<<ter<<nonter<<endl;string terminal18

37、="W","(",")","i","=","+","-","*","/",">","<",">=","<=","=","","","#",""string nonterminal9="S",&qu

38、ot;A","D","C","G","E","H","F","B"string action179;action00="W(A)B"action11=action13="CDC"action29=">" action210="<" action211=">=" action212="<=" action2

39、13="="action31=action33="EG"action42=action49=action410=action411=action412=action413=action415="e"action45="+EG"action46="-EG"action51=action53="FH"action62=action65=action66=action69=action610=action611=action612=action613=action615="

40、;e" action67="*FH" action68="/FH"action71="(C)" action73="i"action83="i=C;"action417="e"action617="e" for(int i=0;i<18;i+)if(terminali=ter) break;for(int j=0;j<9;j+)if(nonterminalj=nonter) break;/cout<<j<<i&

41、lt;<endl;/cout<<actionji<<endl;return actionji;int main()int status=cifafenxi();if(status=-1) cout<<"詞法分析失敗!"<<endl;return -1; ifstream fin;fin.open("cout.txt");if(!fin)cout<<"Can not Open the file!"<<endl;list<string> strLis

42、t;/目標(biāo)代碼隊列l(wèi)ist<string> destList;/分析棧string front,actor;while(!fin.eof()string str;fin>>str;if(str!="+"&&str!="-"&&str!="*"&&str!="/"&&str!=">"&&str!="<"&&str!=">="

43、;&&str!="<="&&str!="="&&str!="W"&&str!="("&&str!=")"&&str!=""&&str!=""&&str!=""&&str!="="&&str!="")str="i"i

44、f(str!="")strList.push_back(str);fin.close();destList.push_back("#"); destList.push_back("S");int count=0;cout<<"符號串的分析過程如下:"<<endl;cout<<"-"<<endl;cout<<"步驟"<<setw(20)<<"分析棧"<<setw(

45、35)<<"剩余輸入串"<<endl; while(destList.back()!="#")cout<<setw(2)<<count+;list<string>:iterator it;cout<<setw(18);for(it=destList.begin();it!=destList.end();it+)cout<<*it;cout<<setw(15); for(it=strList.begin();it!=strList.end();it+)cout&

46、lt;<*it;cout<<endl;front=strList.front() ;/cout<<front<<destList.back();string mid;actor=getAction(front,destList.back();destList.pop_back();if(actor="")cout<<"輸入的程序不符合語法規(guī)則!"<<endl;return -1;else if(actor!="<=" && actor!="

47、;>=" && actor!="="&&actor!="e")for(int i=actor.length()-1;i>=0;i-)mid=actori;destList.push_back(mid);else if(actor!="e")destList.push_back(actor);while(!strList.empty()&&destList.back()=strList.front()cout<<setw(2)<<count+;

48、 list<string>:iterator it; cout<<setw(18); for(it=destList.begin();it!=destList.end();it+)cout<<*it;cout<<setw(15); for(it=strList.begin();it!=strList.end();it+)cout<<*it;cout<<endl;destList.pop_back();strList.pop_front();cout<<"語法分析成功!"<<end

49、l;produceExp();return 0;int CompareOpertor(string Istack,string Ostack) string Operator7="+" , "-", "*" , "/" , "(" , ")","#"int Judge77=1,1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,1,1,1,1,1,1,-1,1,1,-1,-1,-1,-1,-1,0,-2,1,1,1,1,-

50、2,1,1,-1,-1,-1,-1,-1,-2,0; int j=-1,k=-1; int i;while(j=-1|k=-1) for(i=0;i<7;i+) if(Operatori=Istack) j=i; if(Operatori=Ostack) k=i; return Judgejk;void Expression(string m,string n,string k,string s)expression *temp=new expression;temp->num1=m;temp->num2=n;temp->result=s;temp->symbol

51、=k;expList.push_back(*temp);void produceExp()list<string> List;list<string> opnd;/操作符list<string> optr;/操作數(shù)optr.push_back("#");ifstream fin;fin.open("cout.txt");string str1,str,str2;while(!fin.eof()fin>>str1;List.push_back(str1);List.pop_front();int count=0;/*list<string>:iterator i; for(i

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論