




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、學(xué) 號(hào): 課 程 設(shè) 計(jì)題 目WHILE循環(huán)語(yǔ)句的翻譯程序設(shè)計(jì)學(xué) 院計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院專 業(yè)計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)班 級(jí)計(jì)科1002班姓 名指導(dǎo)教師2013年1月9日課程設(shè)計(jì)任務(wù)書(shū)學(xué)生姓名: 專業(yè)班級(jí): 計(jì)算機(jī) 班 指導(dǎo)教師: 蔡 菁 工作單位:計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 題目: WHILE循環(huán)語(yǔ)句的翻譯程序設(shè)計(jì)(LL(1)法、輸出四式)初始條件:理論:學(xué)完編譯原理課程,掌握一種計(jì)算機(jī)高級(jí)語(yǔ)言的使用。實(shí)踐:計(jì)算機(jī)實(shí)驗(yàn)室提供計(jì)算機(jī)及軟件環(huán)境。如果自己有計(jì)算機(jī)可以其上進(jìn)行設(shè)計(jì)。要求完成的主要任務(wù): (包括課程設(shè)計(jì)工作量及其技術(shù)要求,以及說(shuō)明書(shū)撰寫(xiě)等具體要求)(1) 寫(xiě)出符合給定的語(yǔ)法分析方法的文法及屬性
2、文法。(2) 完成題目要求的中間代碼四元式的描述。(3) 寫(xiě)出給定的語(yǔ)法分析方法的思想,完成語(yǔ)法分析和語(yǔ)義分析程計(jì)。(4) 編制好分析程序后,設(shè)計(jì)若干用例,上機(jī)測(cè)試并通過(guò)所設(shè)計(jì)的分析程序。(5) 設(shè)計(jì)報(bào)告格式按附件要求書(shū)寫(xiě)。課程設(shè)計(jì)報(bào)告書(shū)正文的內(nèi)容應(yīng)包括:1 系統(tǒng)描述(問(wèn)題域描述);2 文法及屬性文法的描述;3 語(yǔ)法分析方法描述及語(yǔ)法分析表設(shè)計(jì);4 按給定的題目給出中間代碼形式的描述及中間代碼序列的結(jié)構(gòu)設(shè)計(jì);5 編譯系統(tǒng)的概要設(shè)計(jì);6 詳細(xì)的算法描述(流程圖或偽代碼);7 軟件的測(cè)試方法和測(cè)試結(jié)果;8 研制報(bào)告(研制過(guò)程,本設(shè)計(jì)的評(píng)價(jià)、特點(diǎn)、不足、收獲與體會(huì)等);9 參考文獻(xiàn)(按公開(kāi)發(fā)表的規(guī)范
3、書(shū)寫(xiě))。時(shí)間安排:設(shè)計(jì)安排一周:周1、周2:完成系統(tǒng)分析及設(shè)計(jì)。周3、周4:完成程序調(diào)試及測(cè)試。周5:撰寫(xiě)課程設(shè)計(jì)報(bào)告。設(shè)計(jì)驗(yàn)收安排:設(shè)計(jì)周的星期五第1節(jié)課開(kāi)始到實(shí)驗(yàn)室進(jìn)行上機(jī)驗(yàn)收。設(shè)計(jì)報(bào)告書(shū)收取時(shí)間:設(shè)計(jì)周的次周星期一上午10點(diǎn)。指導(dǎo)教師簽名: 2013年 1月 9日系主任(或責(zé)任教師)簽名: 2013年 1月 9日WHILE循環(huán)語(yǔ)句的翻譯程序設(shè)計(jì)(LL(1)法、輸出四元式)1. 系統(tǒng)描述(1) 按照課程設(shè)計(jì)的要求,寫(xiě)一個(gè)能識(shí)別while循環(huán)語(yǔ)句的文法,通過(guò)一定的變換使它符合預(yù)測(cè)分析法的要求,然后按照這個(gè)文法編寫(xiě)一個(gè)程序,該程序能識(shí)別輸入的語(yǔ)句是否符合while語(yǔ)句的文法,或者能不能通過(guò)文法
4、的開(kāi)始符號(hào)推導(dǎo)出該語(yǔ)句。(2) 該程序應(yīng)該包括詞法分析器,能對(duì)輸入的語(yǔ)句進(jìn)行詞法分析,然后再對(duì)輸出結(jié)果。詞法分析器應(yīng)能識(shí)別關(guān)鍵字,標(biāo)示符,常量,操作符等。(3) 該程序的語(yǔ)法分析器能對(duì)輸入的語(yǔ)法進(jìn)行分析,判斷輸入語(yǔ)句能否滿足while循環(huán)語(yǔ)句的文法。通過(guò)預(yù)測(cè)分析方法對(duì)語(yǔ)句進(jìn)行分析,看能否由文法開(kāi)始符號(hào)推導(dǎo)出輸入語(yǔ)句。(4) 該程序的語(yǔ)義分析器就是對(duì)分析結(jié)果進(jìn)行輸出,要求輸出結(jié)果是四元式。2 文法及屬性文法的描述: 2.1 文法描述:2.1.1 基本概念:文法是對(duì)語(yǔ)言結(jié)構(gòu)的定義與描述。即從形式上用于描述和規(guī)定語(yǔ)言構(gòu)的稱為“文法”。2.1.2 此設(shè)計(jì)針對(duì)的文法為: 消除左遞歸后的產(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 屬性文法的定義形式: 每個(gè)文法符號(hào)有一組屬性,每個(gè)文法產(chǎn)生式A->有一組產(chǎn)生式b:=f(c1,c2,,ck)的語(yǔ)義規(guī)則,其中f式函數(shù),b和c1,c2,,ck式該產(chǎn)生式文法符號(hào)的屬性。 2.2.2 此設(shè)計(jì)題目的屬性文法為:產(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è)計(jì) 3.1詞法分析定義詞法分析是編制一個(gè)讀單詞的過(guò)程,從輸入的源程序中,識(shí)別出各個(gè)具有獨(dú)立意義的單詞,即基本保留字、標(biāo)識(shí)符、常數(shù)、運(yùn)算符、分隔符五大類(lèi)。并依次輸出各個(gè)單詞的內(nèi)部編碼及單詞符號(hào)自身值。程序語(yǔ)言的單詞符號(hào)一般分為五種:關(guān)鍵字(保留字
9、/基本字)if、while、begin;標(biāo)識(shí)符:常量名、變量名;常數(shù),運(yùn)算符;界限符。 3.2詞法分析輸出形式詞法分析器輸出的單詞符號(hào)常常表示為二元式:(單詞種別,單詞符號(hào)的屬性值)4語(yǔ)法分析方法描述及語(yǔ)法分析表設(shè)計(jì);4.1語(yǔ)法分析方法描述4.1.1 預(yù)測(cè)分析法的基本思想所謂的LL(1)方法是在實(shí)現(xiàn)時(shí)用到一個(gè)LL(1)分析鉅陣和一個(gè)分析棧以及預(yù)測(cè)分析程序。分析鉅陣的元素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時(shí),所應(yīng)該采用的后選式。當(dāng)鉅陣元素為空時(shí),則表示用A往下推導(dǎo)時(shí)遇到了不應(yīng)該出現(xiàn)的符
10、號(hào),即A與a不能匹配,因此應(yīng)該出錯(cuò)處理。在構(gòu)造預(yù)測(cè)分析表時(shí),對(duì)每個(gè)終結(jié)符或“#”號(hào)用a表示,則若aSELECT(A->a)。令MA,a= A->a(一般為了簡(jiǎn)化,取MA,a= a)把所有的無(wú)定義的MA,a標(biāo)上ERROR(一般在表中用空白表示)。4.1.3 簡(jiǎn)單優(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)對(duì)以上產(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ù)測(cè)分析表 w()i=+-*/><>=<=#SW(A)BACDCCDCD><>=<=CEGEGGe+EG-EGeeeeeeEFHFHHeee*FH/FHeeeeeeF(C)iF(C)iBi=C分析模型: 5 中間代碼的描述:5.1中間代碼概述:本此設(shè)計(jì)要求使用的是3地址的中間代碼,3地址代碼是由下面一般形式構(gòu)成的語(yǔ)句序列: x:=y op z;其中x,y,z為名字,常數(shù)或編譯時(shí)產(chǎn)生的臨時(shí)變量;op代
13、表運(yùn)算符號(hào)如標(biāo)點(diǎn),浮點(diǎn)運(yùn)算符號(hào)等等。每個(gè)語(yǔ)句的右邊只能有一個(gè)運(yùn)算符。表達(dá)式x + y * z翻譯成的三地址語(yǔ)句序列是:t1 := y * z t2 := x + t1常用的三地址語(yǔ)句有:賦值語(yǔ)句x := y op z, x := op y, x := y無(wú)條件轉(zhuǎn)移goto L條件轉(zhuǎn)移if x relop y goto L過(guò)程調(diào)用param x 和call p , n過(guò)程返回 return y索引賦值x := yi和 xi := y地址和指針賦值x := &y,x := *y和*x := y5.2本次設(shè)計(jì)的中間代碼:本次程序的中間代碼是根據(jù)一定的語(yǔ)義規(guī)則寫(xiě)出的: 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è)計(jì)最終應(yīng)產(chǎn)生的3地址形如:1 (*,b,c,t1)2 (*,b,d,t2)3 (+,t1,t2,t3)4 (:=,t3,-,t4)6 簡(jiǎn)要的分析與概要設(shè)計(jì)6.1文法的分析設(shè)計(jì)(1) 在這次課程設(shè)計(jì)中,第一步就是要設(shè)計(jì)一個(gè)良好的健壯的文法,這就要求對(duì)簡(jiǎn)單優(yōu)先分析方法要有較深地理解.首先文法應(yīng)該滿足3.1.2目中的文法的限制.(2) 另外要保證文法完全沒(méi)有問(wèn)題是不可能的,我是在建立優(yōu)先關(guān)系矩陣后,選取一個(gè)簡(jiǎn)單的例子按照最初的
15、簡(jiǎn)單優(yōu)先關(guān)系矩陣來(lái)歸約測(cè)試,看看能不能歸約成文法的開(kāi)始符,如果不能則說(shuō)明文法有問(wèn)題再慢慢地修改.不斷完善從而得到最終的文法.6.2詞法的分析設(shè)計(jì)(1) 詞法分析的主要任務(wù)是從左到右一個(gè)字符一個(gè)字符地讀入源程序,對(duì)構(gòu)成源程序的字符流進(jìn)行掃描和分解,從而識(shí)別出一個(gè)個(gè)的單詞.(2) 詞法分析因?yàn)樵谄綍r(shí)實(shí)驗(yàn)已經(jīng)做過(guò),所以實(shí)現(xiàn)較簡(jiǎn)單,但是針對(duì)此次試驗(yàn)是對(duì)while循環(huán)語(yǔ)句的翻譯,我把相應(yīng)的存放關(guān)鍵字和限制符的數(shù)組相應(yīng)的只放與本次實(shí)驗(yàn)有關(guān)的內(nèi)容進(jìn)行稍微的削減,這樣既可以把輸入的while循環(huán)語(yǔ)句分析成為一個(gè)個(gè)具有獨(dú)立意義的單詞并且又相應(yīng)的類(lèi)型說(shuō)明,而且還可以簡(jiǎn)化代碼,從而提高分析效率.6.3語(yǔ)法的分析設(shè)計(jì)
16、(1) 語(yǔ)法分析的任務(wù)就是判斷輸入的符號(hào)串是不是給定文法的一個(gè)句子.在此次課程設(shè)計(jì)中,語(yǔ)法分析的重點(diǎn)是由文法開(kāi)始符號(hào)如何推導(dǎo),就是判斷能否由文法開(kāi)始符號(hào)推導(dǎo)出輸入符號(hào)串.(2) 在設(shè)計(jì)中,按照預(yù)測(cè)分析法的步驟對(duì)文法開(kāi)始符號(hào)進(jìn)行推導(dǎo),如果能夠推導(dǎo)產(chǎn)生輸入符號(hào)串,則說(shuō)明該字符串符合設(shè)計(jì)的文法,否則說(shuō)明輸入的字符串不合法.6.4語(yǔ)義的分析設(shè)計(jì) (1) 語(yǔ)義分析的主要任務(wù)是審查源程序有無(wú)語(yǔ)義錯(cuò)誤,為代碼生成階段收集類(lèi)型信息.對(duì)于本課程設(shè)計(jì)來(lái)說(shuō),就是把輸入的符合文法規(guī)定的字符串轉(zhuǎn)換翻譯成有具體意義的三地址形式輸出來(lái).(2) 在設(shè)計(jì)中,我覺(jué)得這一模塊的實(shí)現(xiàn)相對(duì)要困難一些.while循環(huán)語(yǔ)句由兩種不同的語(yǔ)句
17、翻譯,要分別對(duì)待,即賦值語(yǔ)句的翻譯和布爾表達(dá)式的翻譯.前者的實(shí)現(xiàn)相對(duì)較容易,后者設(shè)計(jì)時(shí)要用到拉鏈算法中的合并和回填(參見(jiàn)23屬性文法的描述).6.5總體的分析設(shè)計(jì)(1) 總體設(shè)計(jì)的主要任務(wù)是把詞法分析、語(yǔ)法分析、語(yǔ)義分析這幾個(gè)模塊有機(jī)的結(jié)合起來(lái)形成一個(gè)完整的while循環(huán)語(yǔ)句的翻譯器.(2) 詞法分析是從一個(gè)文件中讀入字符,經(jīng)過(guò)處理輸出一個(gè)文件內(nèi)容是一個(gè)個(gè)單詞;而語(yǔ)法分析是從詞法分析的輸出結(jié)果中讀出一個(gè)個(gè)單詞并進(jìn)行歸約,如果規(guī)約不成功,則顯示錯(cuò)誤提示,如果歸約成功,輸入的字符串是合法的,那么就由語(yǔ)義分析器來(lái)輸出輸入符號(hào)串的三地址表示形式.從而完成翻譯工作.7 詳細(xì)的算法描述7.1主要程序流程圖
18、7.1.1 程序總流程圖中間代碼短語(yǔ)單詞源程序詞法分析語(yǔ)法分析語(yǔ)義分析圖6.1.1程序總流程圖結(jié)束符“#”界限符開(kāi)始到輸入流中讀下一字符ÞCharChar是什么?初始化標(biāo)識(shí)符和關(guān)鍵字詞法分析子程序字母數(shù)字運(yùn)算符無(wú)符號(hào)數(shù)詞法分析子程序運(yùn)算符詞法分析子程序界限符詞法分析子程序結(jié)束7.1.2 詞法分析流程圖圖6.1.2詞法分析流程圖把單詞存入一個(gè)隊(duì)列中將分析棧元素與目標(biāo)代碼列分析需輸出四元式?輸出四元式是否結(jié)束分析棧中只剩#合法?否是7.1.3 語(yǔ)法語(yǔ)義分析流程圖開(kāi)始圖6.1.3語(yǔ)法語(yǔ)義分析流程圖8.程序偽代碼 8.1詞法分析程序 void lexcal()infile.open(&quo
19、t;input.txt",ios:in);while(infile.fail()顯示出錯(cuò)處理 ;outfile.open("wordoutput.txt",ios:out);先讀一個(gè)字符;while(讀入的字符不為文件結(jié)束符) if(讀入標(biāo)識(shí)符和關(guān)鍵字)對(duì)應(yīng)的詞法分析子程序;if(讀入無(wú)符號(hào)整數(shù))對(duì)應(yīng)的詞法分析子程序;if(讀入運(yùn)算符)對(duì)應(yīng)的詞法分析子程序;if(讀入界限符)對(duì)應(yīng)的詞法分析子程序;if(讀入字符串常量)對(duì)應(yīng)的詞法分析子程序;/while/lexcal8.2語(yǔ)法分析程序建立一個(gè)鏈表strList和分析棧destList,其中strList用來(lái)存放輸入
20、代碼序列,而destList存放待推導(dǎo)的非終結(jié)符串。取strList表頭元素和destList的棧頂元素,查找預(yù)測(cè)分析表,得到要推導(dǎo)得到的產(chǎn)生式右部,然后逆序壓到destList棧中,如果查表為空,則表示出錯(cuò),返回。檢查strList的隊(duì)首元素與destList的棧頂元素是否相同,把相同的元素出隊(duì),出棧。判斷destList棧中是否僅?!?”,是則表示分析完成。8.3輸出四元式采用了兩個(gè)棧,一個(gè)操作符棧optr,一個(gè)操作數(shù)棧opnd事先存儲(chǔ)各運(yùn)算符之間的棧內(nèi)與棧外優(yōu)先級(jí) (1)讀入一個(gè)用中綴表示的簡(jiǎn)單算術(shù)表達(dá)式,為方便起見(jiàn),設(shè)該簡(jiǎn)單算術(shù)表達(dá)式的右端多加上了優(yōu)先級(jí)最低的特殊符號(hào)“#”。(2)從左
21、至右掃描該算術(shù)表達(dá)式,從第一個(gè)字符開(kāi)始判斷,如果該字符是數(shù)字,則分析到該數(shù)字串的結(jié)束并將該數(shù)字串直接壓入opnd棧。(4)如果不是數(shù)字,該字符則是運(yùn)算符,此時(shí)需比較優(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棧中彈出兩個(gè)操作數(shù)a1和a2,調(diào)用Expression(string m,string n,string k,string s),形成四元式。(5)重復(fù)上述操作(1)-(2)直至掃描完整個(gè)簡(jiǎn)單算術(shù)表達(dá)式,確定所有字符都得到正確處理 9
22、 實(shí)驗(yàn)結(jié)果 9.1測(cè)試用例 9.2詞法分析結(jié)果 9.3語(yǔ)法分析和四元式結(jié)果 10.心得體會(huì) 這次的課程設(shè)計(jì)使我無(wú)論在理論基礎(chǔ)知識(shí)上,動(dòng)手實(shí)踐方面,還是在心理素質(zhì)方面都得到了鍛煉和提高。首先是基礎(chǔ)知識(shí)方面,由于授課學(xué)時(shí)的限制和自己學(xué)習(xí)中的疏忽,遺漏了一些比較細(xì)小的知識(shí)點(diǎn),例如:數(shù)組下標(biāo)的問(wèn)題,和棧使用的時(shí)候的棧頂指針指向問(wèn)題,問(wèn)題雖然小,但是在運(yùn)行程序時(shí),這種錯(cuò)誤的確是比較具有隱蔽性的,也比較困擾人的。其次是在上機(jī)實(shí)驗(yàn)方面,在平時(shí)的學(xué)習(xí)中,學(xué)習(xí)的是理論知識(shí),所以在進(jìn)行課程設(shè)計(jì)的時(shí)候,發(fā)現(xiàn)一定的難度,首先是文件的預(yù)定義包含,在程序中用到的函數(shù)不清楚是在哪個(gè)預(yù)定義的函數(shù)中,因此在編譯的時(shí)候總會(huì)出現(xiàn)“
23、未定義的函數(shù)”的錯(cuò)誤提示。 其次是設(shè)計(jì)的思想,由于語(yǔ)句相對(duì)比較多,很多函數(shù)的組合沒(méi)有處理好,經(jīng)常會(huì)出現(xiàn)函數(shù)類(lèi)型不匹配的錯(cuò)誤。由于程序比較長(zhǎng),語(yǔ)句的包含關(guān)系的搞錯(cuò)和匹配問(wèn)題也是編譯時(shí)的瓶頸??傊?,在這次課程設(shè)計(jì)后我的理論知識(shí),動(dòng)手動(dòng)腦能力,和心理素質(zhì)都有了一定的提高,經(jīng)過(guò)這次實(shí)驗(yàn),我基本明白了自己做一個(gè)課題的實(shí)驗(yàn)過(guò)程,從中也學(xué)到很多東西,這是以前按教科書(shū)上照搬照套的實(shí)驗(yàn)得不到的。我明白了自己以后還要繼續(xù)努力,在這里,我也要感謝我的同學(xué)和老師,正是他們幫助我解決了課程設(shè)計(jì)中遇到的一個(gè)又一個(gè)難題。附錄源碼 #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 /存儲(chǔ)四元式 string symbol; /操作符 string num1; /第一個(gè)操作數(shù) string num2; /第二個(gè)操作數(shù) string result; /結(jié)果變量;list<expressio
26、n> expList;void produceExp();long alpha(char c1,long pos)/標(biāo)識(shí)符分析函數(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)鍵字表核對(duì),如果是關(guān)鍵字就設(shè)置j=1*/ if(!(strcmp(opp,sumi)/*比較兩個(gè)字符串*/ fprintf(pWrite,"Wn"); /*識(shí)別關(guān)鍵字*/ j=1; if(j=0) fprintf(pWrite,"%sn",opp); /*識(shí)別標(biāo)識(shí)符*/ return curpos2;long digit(char c1,long pos)/無(wú)符號(hào)數(shù)識(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)代碼隊(duì)列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<<"符號(hào)串的分析過(guò)程如下:"<<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<<"輸入的程序不符合語(yǔ)法規(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<<"語(yǔ)法分析成功!"<<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. 本站所有資源如無(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權(quán)】 ISO/TR 21734-3:2024 EN Intelligent transport systems - Performance testing for connectivity and safety functions of automated driving buses in public transport - Part 3: Ser
- 【正版授權(quán)】 ISO 20553:2025 EN Radiation protection - Monitoring of workers occupationally exposed to a risk of internal contamination with radioactive material
- 2025年度拆遷安置房預(yù)售合同范本(2025版)
- 2025年生物科技產(chǎn)品采購(gòu)合同范本模板
- 2025年度餐廳窗口承包及廣告投放合同
- 2025年度二手商鋪貸款買(mǎi)賣(mài)雙方合作協(xié)議
- 2025年度海洋工程擔(dān)保型買(mǎi)賣(mài)合同
- 2025年低噪聲對(duì)旋式局部通風(fēng)機(jī)項(xiàng)目建議書(shū)
- 保安工作在社區(qū)安全提升中的實(shí)例計(jì)劃
- 促進(jìn)社區(qū)志愿服務(wù)團(tuán)隊(duì)建設(shè)的方案計(jì)劃
- 路橋工程檢測(cè)技術(shù) 課件 1公路工程試驗(yàn)檢測(cè)管理
- NB/T 11459-2023煤礦井下直流電法勘探規(guī)程
- 2025高中物理《課時(shí)作業(yè)》人教版選擇性必修第1冊(cè)課時(shí)分層作業(yè)(八)
- 腦卒中-腦卒中的康復(fù)治療
- 十七個(gè)崗位安全操作規(guī)程手冊(cè)
- 爆花(2023年陜西中考語(yǔ)文試卷記敘文閱讀題及答案)
- 疫情統(tǒng)計(jì)學(xué)智慧樹(shù)知到答案2024年浙江大學(xué)
- 自主簽到培訓(xùn)課件-早安!幼兒園
- 小學(xué)項(xiàng)目化學(xué)習(xí)案例
- 2024住院患者靜脈血栓栓塞癥預(yù)防護(hù)理與管理專家共識(shí)要點(diǎn)(全文)
- 2024-2030年中國(guó)大宗商品行業(yè)市場(chǎng)深度調(diào)研及發(fā)展趨勢(shì)與投資前景研究報(bào)告
評(píng)論
0/150
提交評(píng)論