資源描述:
《c語(yǔ)言編譯器設(shè)計(jì)與實(shí)現(xiàn)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、C語(yǔ)言編譯器的設(shè)計(jì)與實(shí)現(xiàn)01計(jì)算機(jī)4班18號(hào)任春妍2號(hào)陳俊我們?cè)O(shè)計(jì)的編譯程序涉及到編譯五個(gè)階段中的三個(gè),即詞法分析器、語(yǔ)法分析器和中間代碼生成器。編譯程序的輸出結(jié)果包括詞法分析后的二元式序列、變量名表、狀態(tài)棧分析過(guò)程顯示及四元式序列程序,整個(gè)編譯程序分為三部分:(1)詞法分析部分(2)語(yǔ)法分析處理及四元式生成部分(3)輸出顯示部分一.詞法分析器設(shè)計(jì)由于我們規(guī)定的程序語(yǔ)句中涉及單詞較少,故在詞法分析階段忽略了單詞輸入錯(cuò)誤的檢查,而將編譯程序的重點(diǎn)放在中間代碼生成階段。詞法分析器的功能是輸入源程序,輸出單詞符號(hào)。我們規(guī)定輸出的單詞符號(hào)格式為如
2、下的二元式:(單詞種別,單詞自身的值)#defineACC-2#definesyl_if0#definesyl_else1#definesyl_while2#definesyl_begin3#definesyl_end4#definea5#definesemicolon6#definee7#definejinghao8#defines9#defineL10#definetempsy11#defineEA12#defineEO13#defineplus14#definetimes15#definebecomes16#defineop_and
3、17#defineop_or18#defineop_not19#definerop20#definelparent21#definerparent22#defineident23#defineintconst24函數(shù)說(shuō)明1.讀取函數(shù)readline()、readch()詞法分析包含從源文件讀取字符的操作,但頻繁的讀文件操作會(huì)影響程序執(zhí)行效率,故實(shí)際上是從源程序文件”source.dat”中讀取一行到輸入緩沖區(qū),而詞法分析過(guò)程中每次讀取一個(gè)字符時(shí)則是通過(guò)執(zhí)行readch()從輸入緩沖區(qū)獲得的;若緩沖區(qū)已被讀空,則再執(zhí)行readline()從
4、source.dat中讀取下一行至輸入緩沖區(qū)。2.掃描函數(shù)scan()掃描函數(shù)scan()的功能是濾除多余空格并對(duì)主要單詞進(jìn)行分析處理,將分析得到的二元式存入二元式結(jié)果緩沖區(qū)。3.變量處理find()變量處理中首先把以字母開(kāi)頭的字母數(shù)字串存到spelling[]數(shù)組中,然后進(jìn)行識(shí)別。識(shí)別過(guò)程是先讓它與保留關(guān)鍵字表中的所有關(guān)鍵字進(jìn)行匹配,若獲得成功則說(shuō)明它為保留關(guān)鍵字,即將其內(nèi)碼值寫(xiě)入二元式結(jié)果緩沖區(qū);否則說(shuō)明其為變量,這時(shí)讓它與變量名表中的變量進(jìn)行匹配(變量匹配函數(shù)find()),如果成功,則說(shuō)明該變量已存在并在二元式結(jié)果緩沖區(qū)中標(biāo)記為此
5、變量(值填為該變量在變量名表中的位置),否則將該變量登記到變量名表中,再將這個(gè)新變量存入二元式緩存數(shù)組中。4.?dāng)?shù)字識(shí)別number()數(shù)字識(shí)別將識(shí)別出的數(shù)字填入二元式結(jié)果緩存數(shù)組。5.顯示函數(shù)顯示函數(shù)的功能在屏幕上輸出詞法分析的結(jié)果(即二元式序列程序),同時(shí)給出二元式個(gè)數(shù)及源程序行數(shù)統(tǒng)計(jì)。二.語(yǔ)法分析器設(shè)計(jì)語(yǔ)法分析器的核心是三張SLR分析表以及針對(duì)這三張SLR分析表進(jìn)行語(yǔ)義加工的語(yǔ)義動(dòng)作。編譯程序中語(yǔ)法分析處理及四元式生成部分主要是以二元式作為輸入,并通過(guò)SLR分析表對(duì)語(yǔ)法分析處理過(guò)程進(jìn)行控制,使四元式翻譯的工作有條不紊的進(jìn)行,同時(shí)識(shí)別語(yǔ)
6、法分析中的語(yǔ)法錯(cuò)誤。在處理if和while語(yǔ)句時(shí),需要進(jìn)行真值或假值的拉鏈和返填工作,以便轉(zhuǎn)移目標(biāo)的正確填入。1.控制語(yǔ)句的SLR分析表1設(shè)計(jì)過(guò)程如下:將擴(kuò)展文法G’0)S’àS1)SàifeSelseS2)SàwhileeS3)Sà{L}4)Sàa;5)LàS6)LàSL用∈_CLOSURE方法構(gòu)造LR(0)項(xiàng)目規(guī)范簇為:I0:S’à·SSà·ifeSelseSSà·whileeSSà·{L}Sà·a;I1:S’àS·I2:Sàif·eSelseSI3:Sàwhile·eSI4:Sà{·L}Là·SLà·SLSà·ifeSelseSSà
7、·whileeSSà·{L}Sà·a;I5:Sàa·;I6:Sàife·SelseSSà·ifeSelseSSà·whileeSSà·{L}Sà·a;I7:Sàwhilee·SSà·ifeSelseSSà·whileeSSà·{L}Sà·a;I8:Sà{L·}I9:LàS·LàS·LLà·SLLà·SSà·ifeSelseSSà·whileeSSà·{L}Sà·a;I10:Sàa;·I11:SàifeS·elseSI12:SàwhileeS·I13:Sà{L}·I14:SàSL·I15:SàifeSelseSSà·ifeSelseSSà·
8、whileeSSà·{L}Sà·a;I16:SàifeSelseS·構(gòu)造文法G’中非終結(jié)符的FOLLOW集如下:0)FOLLOW(S’)={#}0)SàifeSelseS得 FOLLOW(S)