武漢理工大學(xué)-編譯原理課程設(shè)計(jì)-中國(guó)好學(xué)長(zhǎng)系列之小灰灰的爸爸教材_第1頁(yè)
武漢理工大學(xué)-編譯原理課程設(shè)計(jì)-中國(guó)好學(xué)長(zhǎng)系列之小灰灰的爸爸教材_第2頁(yè)
武漢理工大學(xué)-編譯原理課程設(shè)計(jì)-中國(guó)好學(xué)長(zhǎng)系列之小灰灰的爸爸教材_第3頁(yè)
已閱讀5頁(yè),還剩20頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、武漢理工大學(xué)編譯原理課程設(shè)計(jì)說(shuō)明書(shū)學(xué) 號(hào):課程設(shè)計(jì)題目布爾表達(dá)式翻譯為逆波蘭式的算法實(shí)現(xiàn)學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院專(zhuān)業(yè)軟件工程班級(jí)中國(guó)好學(xué)長(zhǎng)系列姓名小灰灰的爸爸指導(dǎo)教師何九周2014 年 1 月 2 日武漢理工大學(xué)編譯原理課程設(shè)計(jì)說(shuō)明書(shū)課程設(shè)計(jì)任務(wù)書(shū)目錄錯(cuò). 誤!未定義書(shū)簽1 引言 22 概述 32.1設(shè)計(jì)題目 32.2設(shè)計(jì)目的 32.3設(shè)計(jì)任務(wù)內(nèi)容 33 設(shè)計(jì)環(huán)境與工具 44 設(shè)計(jì)原則 44.1基本方法 44.2屬性文法 45 簡(jiǎn)要的分析與概要設(shè)計(jì) 46 詳細(xì)的算法描述,框圖 56.1主要數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì) 56.2全局變量設(shè)計(jì) 76.3遞歸下降得到推導(dǎo)過(guò)程 76.4 遞歸下降得到四元式序列 1.

2、16.5分析四元式序列生成逆波蘭式 147軟件的測(cè)試方法和測(cè)試結(jié)果 168 設(shè)計(jì)的特點(diǎn)、不足收獲與體會(huì) 168.1設(shè)計(jì)的特點(diǎn) 168.2設(shè)計(jì)的不足 168.3收獲與體會(huì) 169 參考文獻(xiàn) 16附錄:本科生課程設(shè)計(jì)成績(jī)?cè)u(píng)定表武漢理工大學(xué)編譯原理課程設(shè)計(jì)說(shuō)明書(shū)課程設(shè)計(jì)任務(wù)書(shū)學(xué)生姓名: 專(zhuān)業(yè)班級(jí):指導(dǎo)教師: 何九周 工作單位:計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 題 目 : 布爾表達(dá)式翻譯為逆波蘭式的算法實(shí)現(xiàn)初始條件:程序設(shè)計(jì)語(yǔ)言 : 主要使用 C語(yǔ)言的開(kāi)發(fā)工具,或者采用 LEX、YACC等工具,也可利用其他 熟悉的開(kāi)發(fā)工具。算法:可以根據(jù)編譯原理課程所講授的算法進(jìn)行設(shè)計(jì)。要求完成的主要任務(wù) : (包括課程設(shè)計(jì)工作

3、量及其技術(shù)要求,說(shuō)明書(shū)撰寫(xiě)等具體要求)1. 明確課程設(shè)計(jì)的目的和重要性,認(rèn)真領(lǐng)會(huì)課程設(shè)計(jì)的題目,讀懂課程設(shè)計(jì)指導(dǎo)書(shū)的要求, 學(xué)會(huì)設(shè)計(jì)的基本方法與步驟, 學(xué)會(huì)如何運(yùn)用前修知識(shí)與收集、 歸納相關(guān)資料解決具體問(wèn)題的方 法。嚴(yán)格要求自己,要獨(dú)立思考, 按時(shí)、獨(dú)立 完成課程設(shè)計(jì)任務(wù)。2. 主要功能包括:利用 LR 分析法編制、調(diào)試其語(yǔ)法及語(yǔ)義分析程序,生成的中間代碼為逆波 蘭式。編制好分析程序后,設(shè)計(jì)若干用例,上機(jī)測(cè)試并通過(guò)所設(shè)計(jì)的分析程序。3. 進(jìn)行總體設(shè)計(jì),詳細(xì)設(shè)計(jì):包括算法的設(shè)計(jì)和數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)。系統(tǒng)實(shí)施、調(diào)試,合理使用 出錯(cuò)處理程序。4. 設(shè)計(jì)報(bào)告:要求層次清楚、整潔規(guī)范、不得相互抄襲。正文字?jǐn)?shù)不

4、少于 0.3 萬(wàn)字。包含內(nèi) 容: 課程設(shè)計(jì)的題目。 目錄。 正文:包括引言、需求分析、總體設(shè)計(jì)及開(kāi)發(fā)工具的選擇,設(shè)計(jì)原則(給出語(yǔ)法分析方法 及中間代碼形式的描述、文法和屬性文法的設(shè)計(jì)) ,數(shù)據(jù)結(jié)構(gòu)與模塊說(shuō)明(功能與流程圖) 、詳細(xì)的 算法設(shè)計(jì)、軟件調(diào)試、軟件的測(cè)試方法和結(jié)果、有關(guān)技術(shù)的討論、收獲與體會(huì)等。 結(jié)束語(yǔ)。 參考文獻(xiàn)。 附錄:軟件清單(或者附盤(pán)) 。時(shí)間安排:消化資料、系統(tǒng)調(diào)查、形式描述1 天系統(tǒng)分析、總體設(shè)計(jì)、實(shí)施計(jì)劃3 天撰寫(xiě)課程設(shè)計(jì)報(bào)告書(shū)1 天指導(dǎo)教師簽名:2014 年 1 月 2 日系主任(或責(zé)任教師)簽名: 2014 年 1 月 2 日武漢理工大學(xué)編譯原理課程設(shè)計(jì)說(shuō)明書(shū)布爾表

5、達(dá)式翻譯為逆波蘭式的算法實(shí)現(xiàn)1 引言實(shí)踐離不開(kāi)理論,而理論是為了實(shí)踐,這一點(diǎn)在軟件設(shè)計(jì)的學(xué)習(xí)過(guò)程中顯得尤為重 要。而編譯原理是一門(mén)研究設(shè)計(jì)和構(gòu)造編譯程序原理和方法的課程,是計(jì)算機(jī)各專(zhuān) 業(yè)的一門(mén)重要的專(zhuān)業(yè)基礎(chǔ)課。編譯原理這門(mén)課程蘊(yùn)含著計(jì)算機(jī)學(xué)科中解決問(wèn)題的思路、 形式化問(wèn)題和解決問(wèn)題的方法, 對(duì)應(yīng)用軟件和系統(tǒng)軟件的設(shè)計(jì)與開(kāi)發(fā)有一定的啟發(fā)和指 導(dǎo)作用。“編譯原理”是一門(mén)實(shí)踐性較強(qiáng)的課程,要掌握這門(mén)課程中的思想,就必須要 把所學(xué)到的知識(shí)付諸實(shí)踐。而課程設(shè)計(jì)是將理論與實(shí)踐相互聯(lián)系的一種重要方式。本文 是編譯原理中的“布爾表達(dá)式翻譯為逆波蘭式的算法實(shí)現(xiàn)”課程設(shè)計(jì)的說(shuō)明書(shū)。 2 概述2.1 設(shè)計(jì)題目布爾表

6、達(dá)式翻譯為逆波蘭式的算法實(shí)現(xiàn)2.2 設(shè)計(jì)目的課程設(shè)計(jì)是將理論加以實(shí)踐較好的方法,也對(duì)學(xué)生的一種全面綜合訓(xùn)練,是與課堂 聽(tīng)講、自學(xué)和練習(xí)相輔相成的必不可少的一個(gè)教學(xué)環(huán)節(jié)。通常,設(shè)計(jì)題中的問(wèn)題比平時(shí) 的練習(xí)題要復(fù)雜,也更接近實(shí)際。編譯原理這門(mén)課程安排的課程設(shè)計(jì)的目的是旨在要求 學(xué)生進(jìn)一步鞏固課堂上所學(xué)的理論知識(shí),深化理解和靈活掌握教學(xué)內(nèi)容,選擇合適的數(shù) 據(jù)邏輯結(jié)構(gòu)表示問(wèn)題,然后編制算法和程序完成設(shè)計(jì)要求,從而進(jìn)一步培養(yǎng)學(xué)生獨(dú)立思 考問(wèn)題、分析問(wèn)題、解決實(shí)際問(wèn)題的動(dòng)手能力。2.3 設(shè)計(jì)任務(wù)內(nèi)容針對(duì)布爾表達(dá)式的二義性文法:B B and B | B or B | not B | ( B ) | tru

7、e false | i rop i將文法拓廣為 G'B' :(0) B ' B(1) BB and B(2) BB or B(3) Bnot B(4) B( B )(5) Btrue(6) Bfalse武漢理工大學(xué)編譯原理課程設(shè)計(jì)說(shuō)明書(shū)(7) Bi rop i利用 LR 分析法編制、調(diào)試其語(yǔ)法及語(yǔ)義分析程序,生成的中間代碼為逆波蘭式編制好分析程序后,設(shè)計(jì)若干用例,上機(jī)測(cè)試并通過(guò)所設(shè)計(jì)的分析程序。3 設(shè)計(jì)環(huán)境與工具Visual C+4 設(shè)計(jì)原則4.1 基本方法在本程序中,要求利用 LR 分析法編制、調(diào)試其語(yǔ)法及語(yǔ)義分析程序,生成的中間代 碼為逆波蘭式。編制好分析程序后,

8、設(shè)計(jì)若干用例,上機(jī)測(cè)試并通過(guò)所設(shè)計(jì)的分析程序4.2 屬性文法B TB B' .in=T.typeB and T B B ' .in=T.typeaddtype(and,entry,B.in)B B ' .val= T FTT.in=F.type.T or FT T ' .in=F.typeaddtype(or,entry,B.in)T T' val= F not FF.val= not.F.valF trueF.val=trueF falseF.val=falseF ( B)F.val=B.valF i rop iF.val=i.lexvalrop i.

9、lexval addtype(i5 簡(jiǎn)要的分析與概要設(shè)計(jì),entry ,l.in)該程序共包括 3 個(gè)模塊, 第一個(gè)模塊是對(duì)輸入的布爾語(yǔ)句進(jìn)行遞歸下降的分 析,從而得出從文法到該布爾語(yǔ)句的推導(dǎo)過(guò)程,第二個(gè) 模塊是使用遞歸下降的 方法,該布爾語(yǔ)句的四元式序列,第三個(gè) 模塊對(duì)四元式序列進(jìn)行掃描并分析每 個(gè)四元式的結(jié)構(gòu)特點(diǎn),并據(jù)此將四元式轉(zhuǎn)化為逆波蘭式。main 函數(shù)的流程圖如下:武漢理工大學(xué)編譯原理課程設(shè)計(jì)說(shuō)明書(shū)開(kāi)始遞歸下降分析得到推導(dǎo)過(guò)程并輸出遞歸下降分析得到四元式序列并輸出讀四元式并得到逆波蘭式并輸出結(jié)束在開(kāi)始進(jìn)行本次實(shí)驗(yàn)中,本來(lái)計(jì)劃在遞歸下降分析的過(guò)程中就得到逆波蘭式,但是經(jīng)過(guò)多次嘗 試之后

10、總是存在錯(cuò)誤,所以采用先得到四元式序列,再根據(jù)四元式序列生成逆波蘭式這種效率比較 低的方法。6 詳細(xì)的算法描述,框圖6.1 主要數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)逆波蘭式結(jié)構(gòu)體這個(gè)結(jié)構(gòu)體的對(duì)象用來(lái)存儲(chǔ)逆波蘭式,它的成員是一個(gè)word 數(shù)組struct nipolanword nibolan100; n;四元式類(lèi)在該類(lèi)中,要包含四元式中的四個(gè)元素,運(yùn)算結(jié)果,兩個(gè)運(yùn)算數(shù)以及一個(gè)運(yùn)算符號(hào)class quad武漢理工大學(xué)編譯原理課程設(shè)計(jì)說(shuō)明書(shū)public:char result8;char arg18;char op8;char arg28;void print()/ 輸出該四元式 cout<<result&

11、lt;<"="<<arg1<<" "<<op<<" "<<arg2<<endl;q20;Word結(jié)構(gòu)體這個(gè)結(jié)構(gòu)體的對(duì)要用來(lái)存儲(chǔ)單個(gè)單詞,包括一個(gè)字符串成員 struct wordchar w10;void print()cout<<w<<":"wr200;翻譯器類(lèi)用來(lái)存儲(chǔ)翻譯過(guò)程中的各個(gè)變量以及聲明主要的函數(shù): class interpreterprivate:ifstream SourceFile;武漢理工大學(xué)編

12、譯原理課程設(shè)計(jì)說(shuō)明書(shū)char buffercode200;/ 存放源碼的緩沖區(qū)int syn;int current;/buffercode中當(dāng)前讀到的字符下標(biāo)char token8;/ 記錄當(dāng)前讀到的單詞public:void scaner();void B();void B1();void T();void F();void T1();void run();void read();void bolon();void toword();char *factor();char *expression();char *term();void bolan();void reset()current

13、=0;void run1()scaner();expression();6.2 全局變量設(shè)計(jì)int tear=51;/ 逆波蘭式尾部int head=50;/ 逆波蘭是首部int numberoftemp=0;/ 臨時(shí)變量個(gè)數(shù)int numberofquad=0;/ 四元式個(gè)數(shù)6.3 遞歸下降得到推導(dǎo)過(guò)程根據(jù)遞歸下降的思想,對(duì)于文法中的每個(gè)非終結(jié)符編寫(xiě)一個(gè)函數(shù),每個(gè)函數(shù)的功能 是識(shí)別由該非終結(jié)符所表示的語(yǔ)法成分。由于描述語(yǔ)言的文法常常是遞歸定義的,因此 相應(yīng)的這組函數(shù)必然以相互遞歸的方式進(jìn)行調(diào)用。 該過(guò)程的基本思想為每執(zhí)行一個(gè)非終 結(jié)符對(duì)應(yīng)的函數(shù)就根據(jù)讀入的單詞符號(hào)來(lái)寫(xiě)入該非終結(jié)符對(duì)應(yīng)的推出式

14、。該功能的入口函數(shù) run1 的流程圖如下:武漢理工大學(xué)編譯原理課程設(shè)計(jì)說(shuō)明書(shū)開(kāi)始結(jié)束非終結(jié)符 B 對(duì)應(yīng)的函數(shù) B() 該函數(shù)首先要寫(xiě)入 B=>TB',然后執(zhí)行 T()與 B1() 流程圖為開(kāi)始寫(xiě)入非終結(jié)符 B 的推出式T()B1()結(jié)束非終結(jié)符 T 對(duì)應(yīng)的函數(shù) T()該函數(shù)首先要寫(xiě)入 T=>FT',然后執(zhí)行 F()與 T1()武漢理工大學(xué)編譯原理課程設(shè)計(jì)說(shuō)明書(shū)流程圖為:開(kāi)始結(jié)束非終結(jié)符 B'對(duì)應(yīng)的函數(shù) B1()在該函數(shù)中如果讀入的下一個(gè)單詞是“and”則寫(xiě)入 B'=>and T B'. 否則,要寫(xiě)入B'推出了空串流程圖為:開(kāi)始

15、YN寫(xiě)入非終結(jié)符B'的推導(dǎo)式T()寫(xiě)入 B '推出空串B1()9結(jié)束武漢理工大學(xué)編譯原理課程設(shè)計(jì)說(shuō)明書(shū)非終結(jié)符 T'對(duì)應(yīng)的函數(shù) T1() 在該函數(shù)中如果讀入的下一個(gè)單詞是“ or ”則寫(xiě)入 T'=>or FT'. 否則,要寫(xiě)入 T' 推出了空串。流程圖為:開(kāi)始讀入“ or”Y寫(xiě)入非終結(jié)符T'的推導(dǎo)式寫(xiě)入 T'推出空串結(jié)束非終結(jié)符 F 對(duì)應(yīng)的函數(shù) F()由于非終結(jié)符 F 對(duì)應(yīng)的推出式比較多,所以該函數(shù)的分支也比較多,當(dāng)讀入“ not 時(shí),則寫(xiě)入 F=>not F 并執(zhí)行 F()函數(shù) , 當(dāng)讀入” true ”或者” fa

16、lse ”時(shí),則要寫(xiě)入 F=>true 或者 F=>false 當(dāng)讀入的字符為” ( ”時(shí),則寫(xiě)入 F=>(B), 并執(zhí)行 B()函數(shù), 當(dāng)讀入的單詞為 i 時(shí),要寫(xiě)入 F=>i rop i.流程圖為:10武漢理工大學(xué)編譯原理課程設(shè)計(jì)說(shuō)明書(shū)開(kāi)始讀入下一字符nottruefalsei寫(xiě)入 F=>true寫(xiě)入 F=>i rop iF()B()寫(xiě)入 F=>not F寫(xiě)入 F=>false寫(xiě)入 F=>(B)結(jié)束在完成該功能時(shí),推到過(guò)程存入到 tuidao 類(lèi)生成的對(duì)象數(shù)組中 。6.4 遞歸下降得到四元式序列生成四元式必須分析布爾語(yǔ)句, and 語(yǔ)句

17、以及最小的分析單元三個(gè)部分 expression () 函數(shù)分析布爾語(yǔ)句, term ()分析 and 語(yǔ)句, unit ()分析最小單元 該過(guò)程的入口函數(shù) run1 ()流程圖如下:開(kāi)始結(jié)束11武漢理工大學(xué)編譯原理課程設(shè)計(jì)說(shuō)明書(shū)expression ()函數(shù)該函數(shù)首先調(diào)用了一個(gè) term 函數(shù),如果下一個(gè)讀到單詞是“ or ”則分析 or 后面的 一個(gè) term 并將 or 和兩個(gè) term 寫(xiě)入到四元式序列中, 如果讀到的不是“ or ”則只把 term 返回到四元式序列中。流程圖如下:開(kāi)始Token=orY NSacaner;term();寫(xiě)入四元式return結(jié)束term() 函數(shù)該函

18、數(shù)首先調(diào)用了一個(gè) factor 函數(shù),如果下一個(gè)讀到單詞是“ and”則分析 and 后 面的一個(gè) factor 并將 or 和兩個(gè) factor 寫(xiě)入到四元式序列中,如果讀到的不是“ and” 則只把 factor 返回到四元式序列中。12武漢理工大學(xué)編譯原理課程設(shè)計(jì)說(shuō)明書(shū)流程圖為:開(kāi)始Token=andY NSacaner;unit(); 寫(xiě)入四元式return結(jié)束unit() 函數(shù)在該函數(shù)中, 分析了優(yōu)先級(jí)最高的運(yùn)算或者是單個(gè)終結(jié)符, 如果讀入的是 true 或者 false 則直接返回 token ,如果讀入的是 i 則把 i rop i 寫(xiě)入到四元式序列中,如果讀 入的是 not ,

19、則分析 not 后面的 expression (),并將 not 以及 expression ()寫(xiě)入 到四元式中,返回生成的 newtemp 流程圖:13武漢理工大學(xué)編譯原理課程設(shè)計(jì)說(shuō)明書(shū)開(kāi)始tokentrue|falsei(not寫(xiě)入 i rop iscanerfplace<-token;scaner();scaner();fplace<-experssion()fplace<-newtemp()fplace<-tokenfplace<-newtemp()寫(xiě)入四元式 expression();Fplace<-newtemp()return fplace開(kāi)

20、始該過(guò)程結(jié)束后,布爾語(yǔ)句對(duì)應(yīng)的四元式存放在 quad類(lèi)生成的對(duì)象數(shù)組 q 中.6.5 分析四元式序列生成逆波蘭式本過(guò)程根據(jù)四元式序列以及每一個(gè)四元式的類(lèi)型,將四元式中的信息按照一定規(guī)則 寫(xiě)入到逆波蘭式中,主要函數(shù)為 bolan ()函數(shù), bolan 函數(shù)將四元式序列從頭到尾掃 描一遍,對(duì)于每一個(gè)四元式序列根據(jù)其操作數(shù)是臨時(shí)變量還是終結(jié)符將終結(jié)符以及操作 符按照逆波蘭式規(guī)則寫(xiě)入到逆波蘭式類(lèi)生成的對(duì)象 n 中。當(dāng)當(dāng)前四元式類(lèi)型為 臨時(shí)變量 =臨時(shí)變量 OP 臨時(shí)變量是,則直接將 op 插入到逆波14武漢理工大學(xué)編譯原理課程設(shè)計(jì)說(shuō)明書(shū)蘭式尾部。當(dāng)當(dāng)前四元式類(lèi)型為 臨時(shí)便令 =arg1 op arg

21、2 時(shí)則按照 arg1, arg2,op 的順序?qū)?他們插入逆波蘭式的尾部。當(dāng)當(dāng)前四元式類(lèi)型為 臨時(shí)便令 =臨時(shí)變量 op arg1 時(shí)則按照 arg1 , op的順序?qū)⑺?們插入逆波蘭式的尾部。當(dāng)當(dāng)前四元式類(lèi)型為 臨時(shí)便令 =arg1 op 臨時(shí)變量時(shí)則將 op 的順序?qū)⑺麄儾迦肽娌?蘭式的尾部,將 arg1 插入到逆波蘭式的首部。bolan 函數(shù)的流程圖為:開(kāi)始將第一個(gè)四元式依次寫(xiě)入逆波蘭式i=0i四元式數(shù)T=T op T 型T=a op a 型T=T op a 型T=a op T 型Y第i 個(gè)四元式類(lèi)型在隊(duì)列尾部插入 op在隊(duì)列尾部插入在隊(duì)列尾部插入arg1,arg2,oparg2,op

22、在隊(duì)列尾部插入 op在隊(duì)列尾部插入 arg1T 為臨時(shí)變量 a 為終結(jié)符結(jié)束15武漢理工大學(xué)編譯原理課程設(shè)計(jì)說(shuō)明書(shū)本過(guò)程結(jié)束之后,逆波蘭式存放在 nibolan 類(lèi)定義的對(duì)象 n 中。7 軟件的測(cè)試方法和測(cè)試結(jié)果輸入一個(gè)字符串,執(zhí)行改程序,觀察產(chǎn)生的四元式以及逆波蘭式是否正確。8 設(shè)計(jì)的特點(diǎn)、不足收獲與體會(huì)8.1 設(shè)計(jì)的特點(diǎn)該程序不僅按照題目要求的到了翻譯的逆波蘭式,而且還求出了布爾語(yǔ)句的推導(dǎo)過(guò) 程和四元式,實(shí)現(xiàn)的功能比較多,對(duì)翻譯的過(guò)程和結(jié)果有一個(gè)比較全面的描述。程序的 邏輯明確,易于理解。8.2 設(shè)計(jì)的不足在本次課程設(shè)計(jì)的程序中存在著兩個(gè)主要問(wèn)題是沒(méi)有在遞歸下降的過(guò)程中直接求出 逆波蘭式,

23、而是根據(jù)生成的四元式序列產(chǎn)生的逆波蘭式,雖然可以達(dá)到題目的要求,但 是程序的效率比較低。另外,在遞歸下降生成逆波蘭式的過(guò)程中,由于最小單元函數(shù)中 讀入” not ”以及” ( ”的分支中出現(xiàn)了問(wèn)題, 導(dǎo)致了在調(diào)試過(guò)程中 not 語(yǔ)句以及括號(hào)中 語(yǔ)句必須放在最后,否則在分析完該單元之后程序不再繼續(xù)向后掃描。導(dǎo)致了布爾語(yǔ)句 分析不全。8.3 收獲與體會(huì)通過(guò)本次課程設(shè)計(jì),我學(xué)會(huì)了將理論知識(shí)運(yùn)用到實(shí)際編碼中,同時(shí)也知道嚴(yán)謹(jǐn)細(xì)心 對(duì)于一個(gè)程序員來(lái)說(shuō)有多么重要。這次課程設(shè)計(jì)在讓我對(duì)編譯原理更加熟悉的同時(shí) 也訓(xùn)練了我的耐心和毅力。雖然程序?qū)懙煤芤话?,有的地方甚至有些小錯(cuò)誤,但是我仍 然收獲了很多平時(shí)學(xué)習(xí)中沒(méi)

24、有學(xué)到的知識(shí),鍛煉了平時(shí)學(xué)習(xí)中沒(méi)有的學(xué)習(xí)和實(shí)踐能力。 9 參考文獻(xiàn)編譯原理(第二版) , 主編:呂映芝、張素琴、蔣維杜 , 出版社:清華大學(xué)出版社 , 出 版時(shí)間: 2004年 11 月編譯原理 ,主編:張幸兒 ,出版社:科學(xué)出版社 ,出版時(shí)間: 1999年 4月16武漢理工大學(xué)編譯原理課程設(shè)計(jì)說(shuō)明書(shū)本科生課程設(shè)計(jì)成績(jī)?cè)u(píng)定表班級(jí): 姓名: 學(xué)號(hào):序號(hào)評(píng)分項(xiàng)目滿分實(shí)得分1學(xué)習(xí)態(tài)度認(rèn)真、遵守紀(jì)律102設(shè)計(jì)分析合理性103設(shè)計(jì)方案正確性、 可行性、 創(chuàng)造性204設(shè)計(jì)結(jié)果正確性405設(shè)計(jì)報(bào)告的規(guī)范性106設(shè)計(jì)驗(yàn)收10總得分 /等級(jí)評(píng)語(yǔ):注:最終成績(jī)以五級(jí)分制記。優(yōu)( 90-100分)、良( 80-89

25、 分)、中( 70-79分)、 及格( 60-69分)、60 分以下為不及格指導(dǎo)教師簽名:2014 年 1 月 日武漢理工大學(xué)編譯原理課程設(shè)計(jì)說(shuō)明書(shū)附錄:代碼不要求加入實(shí)驗(yàn)報(bào)告,上傳時(shí)考慮到如果分成多個(gè)文檔可能會(huì)讓大家難以找到,就 貼在后面了。#include <iostream.h>#include <string.h>#include <fstream.h>int kk;int tear=51;int head=50;int numberoftemp=0;int numberofquad=0;class quadpublic:char result8;c

26、har arg18;char op8;char arg28;void print()cout<<result<<"="<<arg1<<" "<<op<<" "<<arg2<<endl;q20;void qemit(char a,char b,char c,char d)strcpy(qnumberofquad.result,a);strcpy(qnumberofquad.arg1,b);strcpy(qnumberofquad.op,c);

27、strcpy(qnumberofquad.arg2,d); numberofquad+;char* newtemp()char *p;int temp=numberoftemp;p=new char8;p0='t'for(int i=0;i+)p+i=char(temp%10+48); temp=temp/10;if (temp=0) pi+1='0' break;武漢理工大學(xué)編譯原理課程設(shè)計(jì)說(shuō)明書(shū)numberoftemp+;return p;struct wordchar w10;void print() cout<<w<<"

28、:" wr200; struct nipolan word nibolan100; n;int tcount=0;int wcount=0;char *rwtab9="true","not","false","(",")","rop","i","or","and" class tuidaopublic:char a10;char b10;char c10;char d10;void emit(char *m

29、,char *n,char *p,char *q);void print() cout<<a<<"=>"<<b<<c<<d<<endl; t100;void tuidao:emit(char *m,char *n,char *p,char *q)strcpy(a,m);strcpy(b,n);strcpy(c,p);strcpy(d,q);class interpreterprivate: ifstream SourceFile; char buffercode200; int syn; int

30、current;武漢理工大學(xué)編譯原理課程設(shè)計(jì)說(shuō)明書(shū)char token8;public:void scaner();void B();void B1();void T();void F();void T1();void run();void read();void bolon();void toword();char *unit();char *expression();char *term();void bolan();void reset()current=0;void run1()scaner(); expression();void bolan() strcpy(n.nibolante

31、ar.w,q0.arg1);tear+; strcpy(n.nibolantear.w,q0.arg2);tear+; strcpy(n.nibolantear.w,q0.op);tear+; for(int i=0;i<numberofquad;i+)for (int j=i-1;j>=0;j-)if (strcmp(qi.arg1,qj.result)=0)if (strcmp(qi.arg2,qj+1.result)=0) strcpy(n.nibolantear.w,qi.op);tear+;break;else strcpy(n.nibolantear.w,qi.arg2

32、);tear+; strcpy(n.nibolantear.w,qi.op);tear+; break;武漢理工大學(xué)編譯原理課程設(shè)計(jì)說(shuō)明書(shū)if (strcmp(qi.arg1,qj.result)!=0)&&(strcmp(qi.arg2,qj+1.result)=0)strcpy(n.nibolantear.w,qi.op);tear+;strcpy(n.nibolanhead.w,qi.arg1);head-;break;if (strcmp(qi.arg1,qj.result)!=0)&&(strcmp(qi.arg2,qj.result)!=0)strc

33、py(n.nibolantear.w,qi.arg1);tear+;strcpy(n.nibolantear.w,qi.arg2);tear+;strcpy(n.nibolantear.w,qi.op);tear+;break;void interpreter:toword()current=0;int i=0;while (buffercodecurrent!='#')scaner();strcpy(wrwcount.w,token);wcount+;i+;void interpreter:read()cin.getline(buffercode,200);cout<&

34、lt;buffercode<<endl;void interpreter:run()current=0;scaner();B();武漢理工大學(xué)編譯原理課程設(shè)計(jì)說(shuō)明書(shū)void interpreter:B()ttcount.emit("B"," ","T","B'");tcount+;T();B1();void interpreter:B1()if (strcmp(token,rwtab8)=0)ttcount.emit("B'","and",&quo

35、t;T","B'");tcount+;scaner();T();B1();s caner();else ttcount.emit("B'","empty","","");void interpreter:T()ttcount.emit("T","","F","T'");tcount+;F();T1();void interpreter:T1()if (strcmp(token,rwt

36、ab7)=0)ttcount.emit("T'","or","F","T''");tcount+;scaner();F();T1();else ttcount.emit("T'","empty","","");/ F not F |truefalse |( B)| i rop ivoid interpreter:F()if(strcmp(token,rwtab1)=0)ttcount.emit("

37、;F","not","F","");tcount+;scaner();F() ;else if(strcmp(token,rwtab0)=0)ttcount.emit("F","","true","");tcount+;scaner();else if(strcmp(token,rwtab2)=0) ttcount.emit("F","","false","");tc

38、ount+;scaner();else if(strcmp(token,rwtab3)=0)ttcount.emit("F","(","B",")");tcount+;scaner();B();else if(strcmp(token,rwtab6)=0)ttcount.emit("F","i","rop","i");tcount+;scaner();scaner();sca ner();武漢理工大學(xué)編譯原理課程設(shè)計(jì)說(shuō)明書(shū)void in

39、terpreter:scaner()int m=0;for(int i=0;i<8;i+) tokeni=' 'while (buffercodecurrent=' ') current+;if(buffercodecurrent>='a')&&(buffercodecurrent<='z')|(buffercodecurrent>=' A')&&(buffercodecurrent<='Z') while (buffercodecurr

40、ent>='a')&&(buffercodecurrent<='z')|(buffercodecurrent>='A')&&(b uffercodecurrent<='Z')|(buffercodecurrent>='0')&&(buffercodecurrent<='9') tokenm=buffercodecurrent;m+; current+;tokenm+='0'else if (buffe

41、rcodecurrent='(') token0='('token1='0'current+;else if (buffercodecurrent=')') token0=')'token1='0'current+; char*interpreter:expression()char *tp,*ep2,*eplace,*tt;tp=new char8;ep2=new char8;eplace=new char8;tt=new char8;strcpy(eplace,term(); while(str

42、cmp(token,"or")=0)strcpy(tt,token); scaner(); strcpy(ep2,term(); strcpy(tp,newtemp(); qemit(tp,eplace,tt,ep2); strcpy(eplace,tp);return eplace; char*interpreter:term()char *tp,*ep2,*eplace,*tt;武漢理工大學(xué)編譯原理課程設(shè)計(jì)說(shuō)明書(shū)tp=new char8;ep2=new char8;eplace=new char8;tt=new char8;strcpy(eplace,unit();while (strcmp(token,"and

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論