【正文】
揚(yáng)州大學(xué)編譯原理課程設(shè)計(jì) 學(xué) 號(hào): 091202122 姓 名: 專 業(yè): 計(jì)算機(jī)科學(xué)與技術(shù) 課 程: 編譯原理 指導(dǎo)教師: 陳宏建 目錄一.程序簡(jiǎn)介與分析3二.程序適用范圍3三.詞法分析3四.語(yǔ)法分析4五.語(yǔ)義分析和中間代碼生成10六.代碼生成12七.流程圖13八.實(shí)現(xiàn)14九.程序運(yùn)行結(jié)果14十.總結(jié)18(源程序)18 簡(jiǎn)單的編譯程序設(shè)計(jì)一. 程序簡(jiǎn)介與分析本程序由四個(gè)部分組成:詞法分析子程序,語(yǔ)法分析子程序,語(yǔ)義分析子程序,目標(biāo)代碼生成程序。,然后對(duì)它進(jìn)行詞法,語(yǔ)法,語(yǔ)義分析,并輸出匯編代碼。詞法分析輸入的是c語(yǔ)言源程序,輸出的3是具有獨(dú)立語(yǔ)法意義的單詞符號(hào)。語(yǔ)法分析以詞法分析產(chǎn)生的編碼流為輸入,按照SLR(1)分析方法進(jìn)行語(yǔ)法分析,產(chǎn)生語(yǔ)法樹(shù),輸出移進(jìn)和歸約的動(dòng)作,如果源程序不符合文法,則有“語(yǔ)法分析出錯(cuò)”的提示。語(yǔ)義分析階段,在語(yǔ)法分析的同時(shí),在歸約的時(shí)候,給出相應(yīng)的語(yǔ)義動(dòng)作,最后輸出中間代碼四元式和新的符號(hào)表,如果有未聲明的變量出現(xiàn),則會(huì)提示出出錯(cuò),并顯示出此變量的名稱。代碼生成階段,將語(yǔ)義分析得到的中間代碼四元式轉(zhuǎn)化為匯編語(yǔ)言的目標(biāo)代碼并輸出。二. 程序適用范圍 本程序的使用范圍為:整型常量,四則運(yùn)算(為了簡(jiǎn)化問(wèn)題,本程序只考慮加法運(yùn)算和乘法運(yùn)算)和布爾表達(dá)式以及相應(yīng)的賦值語(yǔ)句,條件轉(zhuǎn)移語(yǔ)句和循環(huán)語(yǔ)句。三. 詞法分析根據(jù)詞法分析的需要,我將源程序中的單詞符號(hào)分為:保留字,字母(標(biāo)識(shí)符),界符三類,統(tǒng)一用一張表表示如下:界符,保留字表單詞=+*:。{}()andifthenwhiledoint標(biāo)志符編碼1234567891031323335363725,并判斷它是不是字母,界符,保留字,空格,換行,結(jié)束符號(hào)或者非法字符。流程圖如下: 詞法分析流程圖四. 語(yǔ)法分析.源程序中涉及的文法G[P]定義如下表:說(shuō)明語(yǔ)句表達(dá)式布爾表達(dá)式句法0、P’→PP→id () L。RL→L。DL→DD→id:intE→E+TE→TT→T*FT→FF→(E)F→id1B→B and B1B→idid1M→id=E1S→if B then M1S→while B do M1S→M1N→N。S1N→S1R→{N}.上述文法的每個(gè)非終結(jié)符的FIRST 集和FOLLOW集如下表: FIRST 集 FOLLOW 集P { id } { }L { id } { 。 }D { id } { 。 }E {(,id } { },。,+,),}T {(,id } { },。,+,),*,}F {(,id } { },。,+,),*,}B { id } {then,do,and}M { id } { },。} S {id,while,if} { },。} N {id,while,if} { },。} R { { } { }.文法G[P]的項(xiàng)目集部分如下:0. P’→.P 1. P’→P.2. P→.id()L。R 3. P→id.()L。R 4. P→id(.)L。R 5. P→id().L。R 6. P→id()L.。R 7. P→id()L。.R 8. P→id()L。R. 9. L→.L。D→L.。D 11. L→L。.D 12. L→L。D. →.id:int 14. D→id .:int 15. D→id: .int 16. D→id:int. →.E+T 18. E→E.+T 19. E→E+.T 20. E→E+T. 21. E→.T 22. E→T. 23. T→.T*F 24. T→T.*F 25. T→T*.F 26. T→T*F. 27. T→.F 28. T→F. 29. F→ (E) 30. F→ (.E) 31. F→ (E.) 32. F→ (E). 33. F→.id 34. F→id. .再由項(xiàng)目集構(gòu)造文法的DFA活前綴。為了方便,省去了項(xiàng)目族集的每個(gè)狀態(tài)的項(xiàng)目,直接在狀態(tài)轉(zhuǎn)換的箭頭上標(biāo)明終結(jié)符或非終結(jié)符。對(duì)于有規(guī)約動(dòng)作和接受的狀態(tài),將其特別標(biāo)明。文法G[P]的DFA圖如下: 有歸約動(dòng)作812765 : int 說(shuō)明語(yǔ)句接受狀態(tài) D id D id3021491011R 。 L ) ( id P26252423 { if B then M271430292028191718222113 id and id 句法S id = } if idM N 。 S id M while while B do M id and353431 id B 布爾表達(dá)式 and3233 id1536 T id38 id ( F E3716 * (403941 F ( id F id + E ( 表達(dá)式4342 + ) T4445 *G[P]:SLR(1)分析表Actiongotoid()。:*+={}intandifthenwhiledo$PDRETFBMSLN012345678910111213141516170123456789100s211acc2s33s44s5895s66s77r48r39s1010s5s13121111r112r213s14s23s2722211714s15