資源描述:
《編譯原理課設(shè)實(shí)驗(yàn)報(bào)告》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、編譯技術(shù)課程設(shè)計(jì)報(bào)告《編譯技術(shù)》課程設(shè)計(jì)報(bào)告實(shí)驗(yàn)名稱編譯器設(shè)計(jì)姓名學(xué)號(hào)班級(jí)35/35編譯技術(shù)課程設(shè)計(jì)報(bào)告本課設(shè)的任務(wù)是完成一個(gè)完整的編譯器,處理用戶提交的符合所定文法的源程序代碼,生成四元式中間代碼,進(jìn)而翻譯成等價(jià)的X86平臺(tái)上匯編語(yǔ)言的目標(biāo)程序。編譯程序的工作過(guò)程劃分為下列5個(gè)過(guò)程:詞法分析,語(yǔ)法分析,語(yǔ)義分析和中間代碼生成,代碼優(yōu)化,目標(biāo)代碼生成。其中,詞法分析階段的基本任務(wù)是從以字符串表示的源程序中識(shí)別出具有獨(dú)立意義的單詞符號(hào),并以二元組的形式輸出,以作為語(yǔ)法分析階段的輸入。語(yǔ)法分析階段的基本任務(wù)是將詞法分析階段產(chǎn)生的二元組作為輸入,
2、根據(jù)語(yǔ)言的語(yǔ)法規(guī)則,識(shí)別出各種語(yǔ)法成分,并判斷該單詞符號(hào)序列是否是該語(yǔ)言的一個(gè)句子。語(yǔ)義分析的任務(wù)是首先對(duì)每種語(yǔ)法單位進(jìn)行靜態(tài)的語(yǔ)義審查,然后分析其含義,并用另一種語(yǔ)言形式(本課設(shè)采用四元式)來(lái)描述這種語(yǔ)義。代碼優(yōu)化的任務(wù)是對(duì)前階段產(chǎn)生的中間代碼進(jìn)行等價(jià)變換或改造,以期獲得更為高效即省時(shí)間和空間的目標(biāo)代碼。目標(biāo)代碼生成的任務(wù)是將中間代碼變換成特定機(jī)器上的絕對(duì)指令代碼或可重定位的指令代碼或匯編指令代碼(本課設(shè)生成匯編指令代碼)。在詞法分析階段,通過(guò)DOS環(huán)境手動(dòng)輸入字符串序列(以’#’作為結(jié)束標(biāo)志)作為帶分析的源程序,調(diào)用詞法掃描子程序?qū)⒆址?/p>
3、串以二元組的形式輸出(若有不屬于該語(yǔ)言單詞符號(hào)出現(xiàn),則進(jìn)行出錯(cuò)處理),詞法掃描子程序包括了對(duì)源程序的預(yù)處理(忽略多余空格、回車(chē)換行符等空白字符),以及對(duì)單詞的識(shí)別和分類(lèi),以形成(單詞種別,單詞自身的值)形式的二元組,并將用戶自定義變量信息存入程序變量信息表。在語(yǔ)法分析階段,采用自上而下的遞歸下降分析法,從文法的開(kāi)始符號(hào)出發(fā),根據(jù)文法規(guī)則正向推導(dǎo)出給定句子。根據(jù)遞歸下降分析函數(shù)編寫(xiě)規(guī)則來(lái)編寫(xiě)相應(yīng)的函數(shù),在各個(gè)函數(shù)的分析過(guò)程中調(diào)用詞法分析程序中的掃描程序,發(fā)出“取下一個(gè)單詞符號(hào)”的命令,以取得下一個(gè)單詞符號(hào)作語(yǔ)法分析。在語(yǔ)義分析和中間代碼生成階
4、段,采用語(yǔ)法制導(dǎo)翻譯法,使用屬性文法為工具來(lái)描述程序設(shè)計(jì)語(yǔ)言的語(yǔ)義35/35編譯技術(shù)課程設(shè)計(jì)報(bào)告。首先審查詞法分析得到的每個(gè)語(yǔ)法結(jié)構(gòu)的靜態(tài)語(yǔ)義,如果靜態(tài)語(yǔ)義正確再生成中間代碼(本課設(shè)中采用四元式)。使用屬性文法作為描述程序設(shè)計(jì)語(yǔ)言語(yǔ)義的工具,采用語(yǔ)法制導(dǎo)翻譯法完成對(duì)語(yǔ)法成分的翻譯工作,即在語(yǔ)法分析過(guò)程中,依隨分析的過(guò)程,根據(jù)每個(gè)產(chǎn)生式所對(duì)應(yīng)的語(yǔ)義子程序(或語(yǔ)義規(guī)則描述的語(yǔ)義處理的加工動(dòng)作)進(jìn)行翻譯。目標(biāo)代碼生成是編譯程序的最后一個(gè)階段,根據(jù)符號(hào)表等信息,將中間代碼轉(zhuǎn)化為等價(jià)的目標(biāo)代碼。為減少訪問(wèn)計(jì)算機(jī)內(nèi)存的次數(shù),應(yīng)盡可能把基本塊內(nèi)還要被引用
5、的變量放到寄存器中,而把基本塊內(nèi)不用的變量所占的寄存器釋放。為了隨時(shí)掌握寄存器的使用情況和變量的存放情況,以便生成適當(dāng)?shù)啬繕?biāo)代碼,可以建立寄存器描述表和變量地址描述表。在編譯程序的各個(gè)階段中都要涉及到表格管理和錯(cuò)誤處理。編譯程序在工作過(guò)程中需要建立一些表格,以登記源程序中所提供的或在編譯過(guò)程中所產(chǎn)生的一些信息,編譯各個(gè)階段的工作都涉及到構(gòu)造、查找、修改或存取有關(guān)表格中的信息(本課設(shè)中建立了程序變量信息表,變量地址描述表,寄存器描述表)。一個(gè)好的編譯程序在編譯過(guò)程中,應(yīng)具有廣泛的程序查錯(cuò)能力,并能準(zhǔn)確地報(bào)告錯(cuò)誤的種類(lèi)及出錯(cuò)位置,以便用戶查找和
6、糾正,因此,在編譯程序中還必須有一個(gè)出錯(cuò)處理程序。實(shí)驗(yàn)的整體設(shè)計(jì)思想可由以下圖示表示:編譯器基本模塊設(shè)計(jì)35/35編譯技術(shù)課程設(shè)計(jì)報(bào)告詞法分析的任務(wù)是對(duì)字符串表示的源程序從左到右地進(jìn)行掃描和分解,根據(jù)語(yǔ)言的詞法規(guī)則識(shí)別出一個(gè)一個(gè)具有獨(dú)立意義的單詞符號(hào),包括關(guān)鍵字,標(biāo)識(shí)符,常數(shù),運(yùn)算l
7、d非l非d其他=!31129301;,}{281271261251)(*24123221211非==<20119118非==>非===1611711514113112dd-+eedd.dd-+1011198765432l1035/35編譯技術(shù)課程設(shè)計(jì)報(bào)告a)
8、語(yǔ)法分析器(遞歸下降法)采用自上而下的遞歸下降分析法,從文法的開(kāi)始符號(hào)出發(fā),根據(jù)文法規(guī)則正向推導(dǎo)出給定句子。對(duì)文法中的每個(gè)非終結(jié)符編寫(xiě)一個(gè)函數(shù)(或子程序),每個(gè)函數(shù)(或子程序)的功能是識(shí)別由該非終結(jié)符所表示的語(yǔ)法成分。描述語(yǔ)言的文法常常是遞歸定義的,因此相應(yīng)的這組函數(shù)(或子程序)必然以相互遞歸的方式進(jìn)行調(diào)用。為每個(gè)非終結(jié)符編制一個(gè)遞歸下降分析函數(shù),每個(gè)函數(shù)名是相應(yīng)的非終結(jié)符,函數(shù)體則是根據(jù)規(guī)則右部符號(hào)串的結(jié)構(gòu)和順序編寫(xiě),完成相應(yīng)非終結(jié)符匹配,通過(guò)所有子程序的相互調(diào)用,完成整個(gè)終結(jié)符號(hào)串的分析。(1)當(dāng)遇到終結(jié)符a時(shí),則編寫(xiě)語(yǔ)句if(當(dāng)前讀來(lái)
9、的輸入符號(hào)==a)讀下一個(gè)輸入符號(hào);(2)當(dāng)遇到非終結(jié)符A時(shí),則編寫(xiě)語(yǔ)句調(diào)用A();(3)當(dāng)遇到規(guī)則A→ε時(shí),則編寫(xiě)語(yǔ)句if(當(dāng)前讀來(lái)的輸入符號(hào)FOLLOW(A))error()