版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 課程設(shè)計(jì)任務(wù)書</b></p><p> 學(xué)生姓名:_____ 專業(yè)班級(jí):</p><p> 指導(dǎo)教師:_ 工作單位:計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 </p><p> 題目: IF-ELSE條件語(yǔ)句的翻譯程序設(shè)計(jì)(簡(jiǎn)單優(yōu)先法、輸出四元式)</p><p><b> 初始
2、條件:</b></p><p> 理論:學(xué)完編譯課程,掌握一種計(jì)算機(jī)高級(jí)語(yǔ)言的使用。</p><p> 實(shí)踐:計(jì)算機(jī)實(shí)驗(yàn)室提供計(jì)算機(jī)及軟件環(huán)境。如果自己有計(jì)算機(jī)可以在其上進(jìn)行設(shè)計(jì)。</p><p> 要求完成的主要任務(wù): (包括課程設(shè)計(jì)工作量及其技術(shù)要求,以及說(shuō)明書撰寫等具體要求)</p><p> 寫出符合給定的語(yǔ)法分析
3、方法的文法及屬性文法。</p><p> 完成題目要求的中間代碼四元式的描述。</p><p> 寫出給定的語(yǔ)法分析方法的思想,完成語(yǔ)法分析和語(yǔ)義分析程序設(shè)計(jì)。</p><p> 編制好分析程序后,設(shè)計(jì)若干用例,上機(jī)測(cè)試并通過(guò)所設(shè)計(jì)的分析程序。</p><p> 設(shè)計(jì)報(bào)告格式按附件要求書寫。課程設(shè)計(jì)報(bào)告書正文的內(nèi)容應(yīng)包括:</p
4、><p> 1 系統(tǒng)描述(問(wèn)題域描述);</p><p> 2 文法及屬性文法的描述;</p><p> 3 語(yǔ)法分析方法描述及語(yǔ)法分析表設(shè)計(jì);</p><p> 4 按給定的題目給出中間代碼形式的描述及中間代碼序列的結(jié)構(gòu)設(shè)計(jì);</p><p> 5 編譯系統(tǒng)的概要設(shè)計(jì);</p><p>
5、 6 詳細(xì)的算法描述(流程圖或偽代碼);</p><p> 7 軟件的測(cè)試方法和測(cè)試結(jié)果;</p><p> 8 研制報(bào)告(研制過(guò)程,本設(shè)計(jì)的評(píng)價(jià)、特點(diǎn)、不足、收獲與體會(huì)等);</p><p> 9 參考文獻(xiàn)(按公開發(fā)表的規(guī)范書寫)。</p><p><b> 時(shí)間安排:</b></p><
6、p> 設(shè)計(jì)安排一周:周1、周2:完成系統(tǒng)分析及設(shè)計(jì)。</p><p> 周3、周4:完成程序調(diào)試及測(cè)試。</p><p> 周5:撰寫課程設(shè)計(jì)報(bào)告。</p><p> 設(shè)計(jì)驗(yàn)收安排:設(shè)計(jì)周的星期五第1節(jié)課開始到實(shí)驗(yàn)室進(jìn)行上機(jī)驗(yàn)收。</p><p> 設(shè)計(jì)報(bào)告書收取時(shí)間:設(shè)計(jì)周的次周星期一上午10點(diǎn)。</p>&l
7、t;p> 指導(dǎo)教師簽名: 2012年 10月 23日</p><p> 系主任(或責(zé)任教師)簽名: 2012年 10月 23日</p><p> IF-ELSE條件語(yǔ)句的翻譯程序設(shè)計(jì)</p><p> (簡(jiǎn)單優(yōu)先法、輸出四元式)</p><p>
8、<b> 1系統(tǒng)描述</b></p><p><b> 1.1實(shí)驗(yàn)?zāi)康?lt;/b></p><p> 對(duì)條件語(yǔ)句:IF <布爾表達(dá)式> THEN <賦值語(yǔ)句> ELSE <賦值語(yǔ)句></p><p> 按給定的題目寫出符合語(yǔ)法分析方法要求的文法和屬性文法描述。</p>
9、<p> 按給定的題目給出語(yǔ)法分析方法的思想及分析表的設(shè)計(jì)。</p><p> 按給定題目給出中間代碼序列的結(jié)構(gòu)設(shè)計(jì)。</p><p> 完成相應(yīng)的詞法分析、語(yǔ)法分析和語(yǔ)義分析程序設(shè)計(jì)。</p><p> 編制好分析程序后,設(shè)計(jì)若干用例,上機(jī)測(cè)試并通過(guò)所設(shè)計(jì)的分析程序。</p><p><b> 1.2開發(fā)平臺(tái)&
10、lt;/b></p><p> Visual C++ 6.0、Windows XP</p><p> 2文法及屬性文法的描述</p><p><b> 2.1文法描述</b></p><p> (1) S->if E then B else B</p><p> (2) E-
11、>(A>A)</p><p> (3) E->(A<A)</p><p> (4) E->(A)</p><p><b> (5) A->d</b></p><p> (6) A->num</p><p> (7) B->{d=C}<
12、/p><p> (8) C->A+A</p><p> (9) C->A-A</p><p> (10) C->A*A</p><p> (11) C->A/A</p><p><b> (12) C->A</b></p><p> 其
13、中,d代表變量,num代表常量(這里僅限數(shù)字),E布爾表達(dá)式,B為賦值表達(dá)式,C為算術(shù)表達(dá)式</p><p><b> 2.2屬性文法描述</b></p><p> (1)E->A rop A’{E.true=nextstat;</p><p> E.codebegin=nextstat;</p><p>
14、 E.false=nextstat+1;</p><p> emit(“if” A.place “rop” A’.place “goto” -);</p><p> emit(“goto” -)}</p><p> (2)E->(A){E.place=A.place}</p><p> ?。?)A->id{p=loo
15、kup(id.name);</p><p> if p!=null then</p><p><b> A.place=p</b></p><p> else error}</p><p> ?。?)B->{d=C}{d.place=C.place}</p><p> ?。?)C-
16、>A op A’{C.place=newtemp;</p><p> emit(C.place “=” A.place “op” A’.place)}</p><p> ?。?)C->A{C.place=A.place}</p><p> 注:rop為>或<;op為+、-、*或/</p><p> 3語(yǔ)義分
17、析方法的描述及分析表設(shè)計(jì)</p><p><b> 3.1優(yōu)先關(guān)系定義</b></p><p> X=Y表示X和Y的優(yōu)先關(guān)系相等</p><p> X>Y表示X的優(yōu)先性比Y的優(yōu)先性大</p><p> X<Y表示X的優(yōu)先性比Y的優(yōu)先性小</p><p> ?。?)X=Y
18、當(dāng)且僅當(dāng)G中存在產(chǎn)生式規(guī)則A->…XY…</p><p> ?。?)X>Y當(dāng)且僅當(dāng)G中存在產(chǎn)生式規(guī)則A->…XB…,B=>Y…,B≠Y</p><p> ?。?)X<Y當(dāng)且僅當(dāng)G中存在產(chǎn)生式規(guī)則A->…BD…,B=>…X,B≠X,D=>Y…</p><p> 3.2簡(jiǎn)單優(yōu)先文法定義</p><
19、p> 若一個(gè)文法是簡(jiǎn)單優(yōu)先文法必須滿足以下條件:</p><p> 在文法符號(hào)集V中,任意兩個(gè)符號(hào)之間最多只有一種優(yōu)先關(guān)系成立</p><p> 在文法中任意兩個(gè)產(chǎn)生式?jīng)]有相同的右部</p><p> 其中第一條是必須滿足的,第二條若不滿足則會(huì)導(dǎo)致規(guī)約不唯一。</p><p> 3.3簡(jiǎn)單優(yōu)先文法的算法步驟</p>
20、<p> 首先根據(jù)已知優(yōu)先文法構(gòu)造相應(yīng)優(yōu)先關(guān)系矩陣,并將文法的產(chǎn)生式保存,設(shè)置符號(hào)棧S,算法步驟如下:</p><p> 將輸入符號(hào)串a(chǎn)1,a2…aN#依次逐個(gè)存入符號(hào)棧S中,直到遇到棧頂符號(hào)ai的優(yōu)先性>下一個(gè)帶輸入符號(hào)aj時(shí)為止。</p><p> 棧頂當(dāng)前符號(hào)ai為句柄尾,由此向左在棧中找句柄的頭符號(hào)ak,即找到ak-1<ak為止。</p>
21、<p> 由句柄ak…ai在文法產(chǎn)生式中查找右部為ak…ai的產(chǎn)生式,若找到則用相應(yīng)左部代替句柄,若找不到則為出錯(cuò),這是可以判定輸入串不是該文法的句子。</p><p> 重復(fù)上述(1)(2)(3)步驟直到規(guī)約完輸入符號(hào)串,棧中只剩下文法的開始符號(hào)為止。</p><p> 3.4語(yǔ)義分析方法描述</p><p> 語(yǔ)義分析采用基于屬性文法的翻譯
22、方案,即,在語(yǔ)法分析過(guò)程中每進(jìn)行一次規(guī)約操作則對(duì)對(duì)應(yīng)產(chǎn)生式進(jìn)行語(yǔ)義計(jì)算。</p><p><b> 3.5分析表構(gòu)造</b></p><p> 3.5.1優(yōu)先關(guān)系的計(jì)算</p><p> 3.5.1.1 定義集合</p><p> FA(S)={a|S=>a…,S≠a,a為文法符號(hào)}</p>
23、<p> LA(S)={a|S=>…a,S≠a,a為文法符號(hào)}</p><p> 3.5.1.2 改造后的優(yōu)先關(guān)系計(jì)算</p><p> 當(dāng)文法中存在A->…XY…時(shí),X=Y</p><p> 當(dāng)文法中存在A->…XB…時(shí),X<FA(B)</p><p> 當(dāng)文法中存在A->…BD…時(shí),LA(
24、B)>D且LA(B)>FA(D)</p><p> 3.5.2分析表結(jié)構(gòu)</p><p> 分析表采用二維數(shù)組存儲(chǔ)方式,文法中的每一個(gè)符號(hào)對(duì)應(yīng)數(shù)組a中的一個(gè)位置,</p><p> 而a[i][j]代表第i個(gè)和第j個(gè)的優(yōu)先關(guān)系:</p><p> ?。?)a[i][i]=0無(wú)優(yōu)先關(guān)系</p><p>
25、; (2)a[i][i]=1i對(duì)應(yīng)元素優(yōu)先級(jí)小于j的</p><p> ?。?)a[i][i]=2i對(duì)應(yīng)元素優(yōu)先級(jí)大于j的</p><p> ?。?)a[i][i]=3i對(duì)應(yīng)元素優(yōu)先級(jí)等于j的</p><p> 而在分析過(guò)程中規(guī)約產(chǎn)生式的選擇則在語(yǔ)法分析過(guò)程中,在語(yǔ)法分析過(guò)程中實(shí)現(xiàn)。分析表最終結(jié)果如下:</p><p> int
26、anltable[22][22]={</p><p> /*S*/{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2},</p><p> /*if*/{0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},</p><p> /*E*/{0,0,0,3,0,0,0,0,0,0,0
27、,0,0,0,0,0,0,0,0,0,0,0},</p><p> /*then*/{0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0},</p><p> /*B*/{0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2},</p><p> /*else*/{0,0,0,0,3,0,
28、0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0},</p><p> /*(*/{0,0,0,0,0,0,0,0,0,0,0,3,1,1,0,0,0,0,0,0,0,0},</p><p> /*)*/{0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},</p><p> /*>*/{0,0,
29、0,0,0,0,0,0,0,0,0,3,1,1,0,0,0,0,0,0,0,0},</p><p> /*<*/{0,0,0,0,0,0,0,0,0,0,0,3,1,1,0,0,0,0,0,0,0,0},</p><p> /*=*/{0,0,0,0,0,0,0,0,0,0,0,1,1,1,3,0,0,0,0,0,0,0},</p><p> /*A
30、*/{0,0,0,0,0,0,0,3,3,3,0,0,0,0,0,0,2,3,3,3,3,0},</p><p> /*d*/{0,0,0,0,0,0,0,2,2,2,3,0,0,0,0,0,2,2,2,2,2,0},</p><p> /*num*/{0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,2,2,2,2,2,0},</p><p>
31、; /*C*/{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0},</p><p> /*{*/{0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0},</p><p> /*}*/{0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2},</p><
32、;p> /*+*/{0,0,0,0,0,0,0,0,0,0,0,3,1,1,0,0,0,0,0,0,0,0},</p><p> /*_*/{0,0,0,0,0,0,0,0,0,0,0,3,1,1,0,0,0,0,0,0,0,0},</p><p> /***/{0,0,0,0,0,0,0,0,0,0,0,3,1,1,0,0,0,0,0,0,0,0},</p>
33、<p> /*/*/{0,0,0,0,0,0,0,0,0,0,0,3,1,1,0,0,0,0,0,0,0,0},</p><p> /*#*/{1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},</p><p> };//0-error ,1=<, 2=> ,3==</p><p> 4中
34、間代碼形式描述及結(jié)構(gòu)設(shè)計(jì)</p><p> 四元式是一種比較普遍采用的中間代碼形式。四元式的四個(gè)組成成分是:算符op,第一和第二運(yùn)算對(duì)象ARG1和ARG2及運(yùn)算結(jié)果RESULT。運(yùn)算對(duì)象和運(yùn)算結(jié)果有時(shí)指用戶自己定義的變量,有時(shí)指編譯程序引進(jìn)的臨時(shí)變量。</p><p> 例如:a=b*c+b*d的四元式表示如下:</p><p> ?。?)(*,b,c,t1)&
35、lt;/p><p> ?。?)(*,b,d,t2)</p><p> ?。?)(+,t1,t2,t3)</p><p> ?。?)(=,t3,-,a)</p><p> 四元式和三元式的主要不同在于,四元式對(duì)中間結(jié)果的引用必須通過(guò)給定的名字,而三元式是通過(guò)產(chǎn)生中間結(jié)果的三元式編號(hào)。也就是說(shuō),四元式之間的聯(lián)系是通過(guò)臨時(shí)變量實(shí)現(xiàn)的。</p&g
36、t;<p> 5編譯系統(tǒng)的概要設(shè)計(jì)</p><p> 系統(tǒng)主要分為兩個(gè)模塊:詞法分析和語(yǔ)法分析(包括語(yǔ)義分析)。并且在分析過(guò)程中將詞法分析產(chǎn)生的單詞輸出到文件,語(yǔ)法分析過(guò)程中分析棧的變化情況輸出到文件。</p><p> 系統(tǒng)設(shè)計(jì)采用過(guò)程化的設(shè)計(jì)方法,將詞法分析、語(yǔ)法分析等功能模塊在獨(dú)立的過(guò)程中實(shí)現(xiàn)。</p><p><b> 系統(tǒng)概
37、要結(jié)構(gòu)如下:</b></p><p><b> 預(yù)定義模塊</b></p><p><b> 詞法分析模塊</b></p><p><b> 語(yǔ)法分析模塊</b></p><p><b> 其他輔助模塊</b></p>&
38、lt;p> 主程序模塊(主要指程序入口函數(shù)main())</p><p> 各模塊調(diào)用關(guān)系如下:</p><p><b> 6算法描述</b></p><p><b> 6.1預(yù)定義模塊</b></p><p> 預(yù)定義模塊主要包括宏定義、常量定義、類型定義以及全局變量定義等。具體如
39、下:</p><p><b> ?。?)宏定義</b></p><p> #define OK 1 //正常</p><p> #define ERROR -1 //出錯(cuò)</p><p> #define FAILURE -1 //分析失敗</p><p><b> ?。?)類型定
40、義</b></p><p> struct att</p><p><b> {//名字表類型</b></p><p> string sname;</p><p> char select;</p><p> char addre;</p><p>
41、<b> };</b></p><p> typedef struct SqStack </p><p><b> { </b></p><p> char *base; </p><p> char *top; </p><p>
42、 int stacksize; </p><p> }SqStack;//棧定義</p><p><b> ?。?)全局變量</b></p><p> int lineno = 1;//輸出時(shí)的當(dāng)前行號(hào)</p><p> char ch ; //當(dāng)前字符</p><p> char
43、 allname[30][30];//單詞全名</p><p> char out[30][30];//保存單詞簡(jiǎn)稱</p><p> att attname[40];//名字表</p><p> ?。?)優(yōu)先關(guān)系表初始化(見(jiàn)3.5.2)</p><p><b> 6.2詞法分析</b></p>&l
44、t;p> 詞法分析主要為analysis(ifstream &fin,ofstream &fout)函數(shù),其中fin為輸入文件流,fout為單詞輸出文件流。輔助函數(shù)為judge(char *string),判斷單詞是否為關(guān)鍵字。</p><p><b> 分析算法如下描述:</b></p><p> while(true)</p>
45、;<p><b> {</b></p><p> 字符串存放臨時(shí)數(shù)組temp;</p><p> if(到文件末尾) break;</p><p> 讀取一個(gè)字符到ch;</p><p> if(ch是換行) {lineno+=1;}</p><p> else if(c
46、h是字符)</p><p><b> {</b></p><p> while(ch是字符或數(shù)字)</p><p><b> {</b></p><p><b> ch存入temp;</b></p><p><b> 讀取下一個(gè)字符;
47、</b></p><p><b> }</b></p><p> 判斷temp是否為關(guān)鍵字,并根據(jù)判斷結(jié)果使temp入名字表并設(shè)置正確的屬性。</p><p><b> }</b></p><p> else if(ch是數(shù)字)</p><p><b
48、> {</b></p><p> while(ch是數(shù)字)</p><p><b> {</b></p><p><b> ch存入temp;</b></p><p><b> 讀取下一個(gè)字符;</b></p><p><
49、;b> }</b></p><p> temp入名字表并設(shè)置正確的屬性。</p><p><b> }</b></p><p> else if(ch為其他合法字符(如:>,<,=等等)) 填入名字表。</p><p> else 輸出錯(cuò)誤,無(wú)法識(shí)別的字符。</p>
50、<p><b> }</b></p><p><b> 6.3語(yǔ)法分析</b></p><p> 語(yǔ)法分析主要為laynax(ofstream &f)函數(shù),其中,f為棧變化情況輸出文件。其他輔助函數(shù)為除judge(char *string)外的其他所有輔助函數(shù)。語(yǔ)法分析的過(guò)稱描述如下:</p><p&g
51、t;<b> 初始化分析棧;</b></p><p> while(還有單詞)</p><p><b> {</b></p><p> 判斷當(dāng)前棧頂單詞與輸入單詞的優(yōu)先級(jí);</p><p> if(<||=) 當(dāng)前符號(hào)入棧</p><p> else if(
52、>)</p><p><b> {</b></p><p> while(棧頂元素優(yōu)先級(jí)等于輸入單詞)</p><p><b> {</b></p><p><b> 保存輸入單詞;</b></p><p> 置輸入單詞為棧頂單詞;<
53、;/p><p><b> 棧頂元素出棧;</b></p><p><b> }</b></p><p> 判斷保存單詞串是否為句柄;</p><p><b> if(是句柄)</b></p><p><b> {</b><
54、;/p><p><b> 進(jìn)行規(guī)約;</b></p><p><b> 進(jìn)行語(yǔ)義規(guī)則計(jì)算;</b></p><p><b> 輸出棧的變化情況;</b></p><p> 使規(guī)約后單詞為新的輸入符號(hào);</p><p><b> }<
55、/b></p><p><b> else</b></p><p><b> {</b></p><p><b> 輸出規(guī)約出錯(cuò);</b></p><p><b> }</b></p><p><b> }
56、</b></p><p><b> else</b></p><p><b> {</b></p><p><b> 輸出輸入單詞錯(cuò)誤;</b></p><p><b> }</b></p><p><b&
57、gt; }</b></p><p><b> 6.4其他模塊</b></p><p><b> 其他模塊描述如下:</b></p><p><b> ?。?)棧操作模塊</b></p><p> void InitStack (SqStack &S)
58、 </p><p><b> {//棧初始化</b></p><p> S.base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));//分配存儲(chǔ)空間 </p><p> if(!S.base) </p><p> exit(OVERFLOW); //為棧S
59、分配存儲(chǔ)空間失敗 </p><p> S.top=S.base; </p><p> S.stacksize=STACK_INIT_SIZE; </p><p><b> } </b></p><p> int push(SqStack &S,char ch)//將元素e插入到棧S中,成
60、為新的棧頂元素 </p><p><b> { </b></p><p> if(S.top-S.base >S.stacksize) //判定棧是否滿</p><p><b> { </b></p><p> S.base=(char*)realloc(S.base,
61、(S.stacksize+STACKINCREMENT *sizeof(char))); </p><p> if(!S.base) </p><p><b> { </b></p><p> printf("分配存儲(chǔ)單元失敗.\n"); //存儲(chǔ)單元分配失敗 </p><p&
62、gt; exit(OVERFLOW); </p><p><b> } </b></p><p> S.top=S.base+S.stacksize; //指明棧頂指針的基址 </p><p> S.stacksize+=STACKINCREMENT; //指明棧的空間大小 </p><p&g
63、t;<b> } </b></p><p> *S.top++=ch; //先將e送入棧頂指針?biāo)赶虻膯卧?,再將棧頂指針?</p><p> return(OK); </p><p><b> } </b></p><p> int pop(SqStack &
64、S,char &ch) </p><p><b> {//棧頂元素出棧</b></p><p> if(S.top==S.base) </p><p><b> { </b></p><p> printf("溢出"); </p>
65、;<p> return (ERROR); </p><p><b> } </b></p><p> ch=*--S.top; </p><p> return(OK); </p><p><b> } </b></p><p&
66、gt; char gettop(SqStack S)</p><p> { //返回棧頂元素</p><p> if(S.top==S.base) cout<<"??眨鲥e(cuò)"<<endl;</p><p><b> char e; </b></p><p> e =
67、*(S.top-1); </p><p> return e; </p><p><b> }</b></p><p> void printstack(SqStack &S,int naa,int ty,ofstream &fout)</p><p> {//輸出棧當(dāng)前情況</p>
68、<p> char temp[40][20];</p><p> for(int k=0;k<40;k++)</p><p><b> {</b></p><p> for(int t=0;t<20;t++)</p><p> temp[k][t]=NULL;</p>&l
69、t;p><b> }</b></p><p><b> int te=0;</b></p><p> int i=0,j=0;</p><p><b> int nu=0;</b></p><p><b> char *ku;</b><
70、;/p><p> ku=S.base;</p><p><b> i=naa+1;</b></p><p> char *contrl;</p><p> contrl=S.base;</p><p> while(contrl!=S.top)</p><p>&l
71、t;b> {</b></p><p> if(*contrl!='1')</p><p><b> {</b></p><p> if(*contrl=='i')</p><p> {fout<<"if";nu=nu+2;}<
72、;/p><p> else if(*contrl=='t')</p><p> {fout<<"then";nu=nu+4;}</p><p> else if(*contrl=='e')</p><p> {fout<<"else";nu=n
73、u+4;}</p><p><b> else</b></p><p> {fout<<*contrl;nu++;}</p><p><b> }</b></p><p><b> contrl++;</b></p><p><
74、b> }</b></p><p> fout<<"\t\t\t";</p><p> for(i;i<=length;i++)</p><p><b> {</b></p><p> if(gettop(S)=='S')</p>
75、<p> fout<<"#";</p><p><b> else</b></p><p> fout<<attname[i].select;</p><p><b> }</b></p><p> if(gettop(S)==&
76、#39;S')</p><p> fout<<"#";</p><p><b> else</b></p><p> fout<<temp[te];</p><p><b> te++;</b></p><p>
77、fout<<endl;</p><p><b> }</b></p><p><b> ?。?)其他</b></p><p> int getnum(char cc)</p><p> {//返回元素在優(yōu)先表中的位置</p><p> switch(cc)
78、</p><p><b> {</b></p><p><b> case 'S':</b></p><p> return 0;break;</p><p><b> case 'i':</b></p><p>
79、 return 1;break;</p><p><b> case 'E':</b></p><p> return 2;break;</p><p><b> case 't':</b></p><p> return 3;break;</p>
80、;<p><b> case 'B':</b></p><p> return 4;break;</p><p><b> case 'e':</b></p><p> return 5;break;</p><p><b> cas
81、e '(':</b></p><p> return 6;break;</p><p><b> case ')':</b></p><p> return 7;break;</p><p><b> case '>':</b>
82、;</p><p> return 8;break;</p><p><b> case '<':</b></p><p> return 9;break;</p><p><b> case '=':</b></p><p>
83、 return 10;break;</p><p><b> case 'A':</b></p><p> return 11;break;</p><p><b> case 'd':</b></p><p> return 12;break;</p&
84、gt;<p><b> case 'n':</b></p><p> return 13;break;</p><p><b> case 'C':</b></p><p> return 14;break;</p><p><b>
85、 case '{':</b></p><p> return 15;break;</p><p><b> case '}':</b></p><p> return 16;break;</p><p><b> case '+':</b
86、></p><p> return 17;break;</p><p><b> case '-':</b></p><p> return 18;break;</p><p><b> case '*':</b></p><p>
87、; return 19;break;</p><p><b> case '/':</b></p><p> return 20;break;</p><p><b> case '#':</b></p><p> return 21;break;</
88、p><p><b> default:</b></p><p> return 88;</p><p><b> }</b></p><p><b> }</b></p><p> int judge(char *string) </p>
89、;<p> {//判斷是否是關(guān)鍵字</p><p> char *keywords[1000]={"if","then","else"};</p><p> for(int i = 0;i <= 2;i++) </p><p><b> {</b></
90、p><p> if (!strcmp(string,*(keywords+i)))</p><p><b> {</b></p><p><b> return 1;</b></p><p><b> }</b></p><p><b>
91、 }</b></p><p> return 0; </p><p><b> }</b></p><p><b> 6.5主程序</b></p><p> 主程序主要負(fù)責(zé),用戶界面的初始化,以及程序執(zhí)行控制。程序如下:</p><p> int mai
92、n()</p><p><b> {</b></p><p> int test=0;</p><p> cout<<"==============================================================================="<<endl;&
93、lt;/p><p> cout<<"= IF-ELSE條件語(yǔ)句的翻譯程序設(shè)計(jì)(簡(jiǎn)單優(yōu)先法、輸出四元式) ="<<endl;</p><p> cout<<"==================================================================
94、============="<<endl;</p><p> char inFile[100],wordOutFile[100],stackFile[100];</p><p> ifstream *fin;</p><p> ofstream *wordOut,*stackOut;</p><p> while
95、(true)</p><p><b> {</b></p><p> printf("輸入源文件名(包括路徑):");</p><p> cin>>inFile;</p><p> fin=new ifstream(inFile);</p><p> if
96、(fin==NULL)</p><p><b> {</b></p><p> printf("輸入源文件名錯(cuò)誤!\n");</p><p><b> continue;</b></p><p><b> }</b></p><p
97、><b> break;</b></p><p><b> }</b></p><p> while(true)</p><p><b> {</b></p><p> printf("輸入單詞輸出文件(包括路徑):");</p>
98、<p> cin>>wordOutFile;</p><p> wordOut=new ofstream(wordOutFile);</p><p> if(wordOut==NULL)</p><p><b> {</b></p><p> printf("輸入文件名錯(cuò)誤!
99、\n");</p><p><b> continue;</b></p><p><b> }</b></p><p><b> break;</b></p><p><b> }</b></p><p> wh
100、ile(true)</p><p><b> {</b></p><p> printf("輸入棧情況輸出文件(包括路徑):");</p><p> cin>>stackFile;</p><p> stackOut=new ofstream(stackFile);</p&g
101、t;<p> if(stackOut==NULL)</p><p><b> {</b></p><p> printf("輸入文件名錯(cuò)誤!\n");</p><p><b> continue;</b></p><p><b> }</b
102、></p><p><b> break;</b></p><p><b> }</b></p><p> getchar();</p><p> test=analysis(*fin ,*wordOut);</p><p> if(test==1)</
103、p><p><b> {</b></p><p> test=laynax(*stackOut);</p><p><b> }</b></p><p><b> else</b></p><p><b> return 0;</b
104、></p><p> if(test==1)</p><p><b> {</b></p><p> printfou();</p><p><b> }</b></p><p> return 0;</p><p><b>
105、; }</b></p><p><b> 7測(cè)試方法和結(jié)果</b></p><p><b> 7.1測(cè)試方法</b></p><p> ?。?)程序設(shè)計(jì)過(guò)程中采用單步測(cè)試的方法,每完成一個(gè)獨(dú)立的功能模塊則對(duì)其進(jìn)行單獨(dú)測(cè)試。各模塊測(cè)試成功之后,則對(duì)程序整體進(jìn)行測(cè)試。</p><p>
106、 ?。?)程序整體測(cè)試時(shí),利用多種變化的輸入數(shù)據(jù)進(jìn)行測(cè)試,以驗(yàn)證程序的正確性,并且提供錯(cuò)誤的輸入來(lái)觀察程序的反應(yīng)。</p><p><b> 7.2測(cè)試結(jié)果</b></p><p> 7.2.1程序運(yùn)行界面</p><p> 7.2.2測(cè)試一(正確數(shù)據(jù))</p><p><b> ?。?)輸入數(shù)據(jù)<
107、/b></p><p><b> ?。?)輸出結(jié)果</b></p><p><b> 單詞輸出(部分):</b></p><p> 分析棧輸出(部分):</p><p><b> 四元式輸出:</b></p><p> 7.2.3測(cè)試二(不
108、正確數(shù)據(jù))</p><p><b> 輸入數(shù)據(jù):</b></p><p><b> 輸出結(jié)果:</b></p><p><b> 8設(shè)計(jì)總結(jié)</b></p><p><b> 8.1設(shè)計(jì)優(yōu)點(diǎn)</b></p><p> ?。?
109、)簡(jiǎn)單優(yōu)先分析法是一種規(guī)范規(guī)約。具有準(zhǔn)確、規(guī)范等優(yōu)點(diǎn)。</p><p> ?。?)四元式為普遍的中間代碼形式。</p><p> ?。?)程序結(jié)構(gòu)清晰,功能模塊劃分合理。</p><p> (4)程序具有堅(jiān)實(shí)的基礎(chǔ),可擴(kuò)展性強(qiáng)。</p><p><b> 8.2設(shè)計(jì)缺點(diǎn)</b></p><p>
110、; (1)規(guī)范規(guī)約本身具有效率低的缺點(diǎn)。</p><p> (2)分析表結(jié)構(gòu)龐大,占據(jù)大量?jī)?nèi)存空間,但其中卻有好多冗余。</p><p> ?。?)程序只能進(jìn)行簡(jiǎn)單的if-else語(yǔ)句進(jìn)行翻譯,功能有限。</p><p> ?。?)程序容錯(cuò)能力較差,遇到輸入錯(cuò)誤時(shí),只能進(jìn)行簡(jiǎn)單處理,即,終止程序。在極端情況下可能導(dǎo)致不可預(yù)知錯(cuò)誤。</p><
111、p><b> 8.3考慮改進(jìn)</b></p><p> ?。?)使用算符優(yōu)先分析法代替簡(jiǎn)單優(yōu)先分析方法。</p><p> (2)采用優(yōu)先鏈的方式存儲(chǔ)優(yōu)先表,代替數(shù)組。</p><p> ?。?)提高程序的容錯(cuò)能力。例如:遇到錯(cuò)誤時(shí),將錯(cuò)誤文法盡可能補(bǔ)全為正確文法,使分析能夠繼續(xù)進(jìn)行。</p><p> ?。?
112、)增強(qiáng)程序的功能,使其能適應(yīng)復(fù)雜的源程序輸入。</p><p><b> 9收獲與體會(huì)</b></p><p> 本次課程設(shè)計(jì)可以說(shuō)是對(duì)編譯原理課程本學(xué)期所學(xué)內(nèi)容的一次綜合應(yīng)用,雖然稱不上一個(gè)完整的編譯程序,但已經(jīng)展現(xiàn)了一個(gè)完整編譯程序的雛形。通過(guò)本次課程設(shè)計(jì),不僅進(jìn)一步熟悉了編譯程序所涉及的各方面知識(shí),更掌握了一個(gè)編譯程序的整體架構(gòu)方式以及編譯程序構(gòu)造的整體流程
113、。并且,從中認(rèn)識(shí)到,編譯程序模塊化(詞法分析、語(yǔ)法分析、語(yǔ)義分析等)的重要,更是程序設(shè)計(jì)模塊化的重要。但,在其過(guò)程中也暴漏了自身知識(shí)的匱乏,包括,編譯原理知識(shí)學(xué)習(xí)不扎實(shí),不能很好的運(yùn)用;編程語(yǔ)言運(yùn)用不熟練,導(dǎo)致頻繁因查找編程語(yǔ)言語(yǔ)法知識(shí)耗費(fèi)大量時(shí)間等等。但總的來(lái)說(shuō),本次編程還是收獲不少,不僅僅是實(shí)現(xiàn)了課程設(shè)計(jì)所要求的內(nèi)容,更為以后深入的學(xué)習(xí)(包括課程相關(guān)與不相關(guān))打下了堅(jiān)實(shí)的基礎(chǔ)。</p><p><b&g
114、t; 10參考文獻(xiàn)</b></p><p> 張素琴、呂映芝、蔣維杜、戴桂蘭等.編譯原理(第二版).清華大學(xué)出版社.2005</p><p> 閔聯(lián)營(yíng)、何克右. C++程序設(shè)計(jì)教程. 武漢理工大學(xué)出版社. 2005</p><p> Stanley B.Lippman、Josee Lajoie、Barbara E.Moo著,李師賢、蔣愛(à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ù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 編譯課程設(shè)計(jì)報(bào)告---for循環(huán)語(yǔ)句的翻譯程序設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)報(bào)告說(shuō)明書--- do-while循環(huán)語(yǔ)句的翻譯程序設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)-while循環(huán)語(yǔ)句的翻譯程序設(shè)計(jì)(lr方法、輸出四元式)
- 編譯原理課程設(shè)計(jì)---賦值語(yǔ)句的解釋程序設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)---小型程序設(shè)計(jì)語(yǔ)言編譯器的設(shè)計(jì)與實(shí)現(xiàn)
- 編譯原理課程設(shè)計(jì)報(bào)告-編譯程序構(gòu)造
- 編譯原理課程設(shè)計(jì)--- 詞法分析程序
- 課程設(shè)計(jì)---編譯原理實(shí)現(xiàn)對(duì)for語(yǔ)句處理的功能
- 編譯原理課程設(shè)計(jì)報(bào)告-預(yù)測(cè)分析程序的設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)報(bào)告-預(yù)測(cè)分析程序的設(shè)計(jì)
- for循環(huán)語(yǔ)句的翻譯程序設(shè)計(jì)(遞歸下降法、輸出三地址表示
- 編譯原理課程設(shè)計(jì)
- 編譯原理課程設(shè)計(jì)
- 微機(jī)原理課程設(shè)計(jì)----進(jìn)制轉(zhuǎn)換程序設(shè)計(jì)
- 組成原理課程設(shè)計(jì)報(bào)告---微程序設(shè)計(jì)
- 微機(jī)原理課程設(shè)計(jì)--代碼轉(zhuǎn)換程序設(shè)計(jì)
- 微機(jī)原理課程設(shè)計(jì)--加密解密程序設(shè)計(jì)
- 微機(jī)原理-課程設(shè)計(jì)電風(fēng)扇程序設(shè)計(jì)
- 編譯原理遞歸下降子程序課程設(shè)計(jì)報(bào)告
- 編譯原理課程設(shè)計(jì)--算術(shù)表達(dá)式的語(yǔ)法分析及語(yǔ)義分析程序設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論