編譯原理實驗報告-編寫編譯程序?qū)崿F(xiàn)多行表達(dá)式的表達(dá)式序列的文法語言的編譯執(zhí)行_第1頁
編譯原理實驗報告-編寫編譯程序?qū)崿F(xiàn)多行表達(dá)式的表達(dá)式序列的文法語言的編譯執(zhí)行_第2頁
編譯原理實驗報告-編寫編譯程序?qū)崿F(xiàn)多行表達(dá)式的表達(dá)式序列的文法語言的編譯執(zhí)行_第3頁
編譯原理實驗報告-編寫編譯程序?qū)崿F(xiàn)多行表達(dá)式的表達(dá)式序列的文法語言的編譯執(zhí)行_第4頁
編譯原理實驗報告-編寫編譯程序?qū)崿F(xiàn)多行表達(dá)式的表達(dá)式序列的文法語言的編譯執(zhí)行_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、編譯原理實驗報告 編寫編譯程序?qū)崿F(xiàn)多行表達(dá)式的的文法語言的編譯執(zhí)行組長:組員: 一、實驗項目名稱:有表示多行表達(dá)式的文法如下:- - = +-(+-) - (* | /) - () ( ) - sin | cos | tan | exp其中的變量無需定義且其作用域為第一次賦值處至最后。試按遞歸下降方式設(shè)計其編譯程序,生成pl/0棧式指令代碼,然后解釋執(zhí)行。二、實驗要求:將編譯和解釋執(zhí)行分成完全獨立的兩個階段;對棧式指令進(jìn)行適當(dāng)擴(kuò)充,使之能處理標(biāo)準(zhǔn)函數(shù)的調(diào)用;剔除本題目不需要的pl/0棧式指令,并說明理由;簡化pl/0運行棧,使之滿足本題目要求既可;注意定義中的可選項變量=引起的歧義性:如 a=

2、1+2與a+2,前一個a屬于,而后一個a屬于,思考如何解決;以“表達(dá)式目標(biāo)碼序列結(jié)果”方式輸出運行結(jié)果;設(shè)計一個測試,使之能充分測試你的實現(xiàn);對正確列出的目標(biāo)碼、執(zhí)行并按適當(dāng)方式演示運行棧的變化,計算出值;對錯誤的指出其出錯位置和錯誤性質(zhì)三、設(shè)計概述:實現(xiàn)平臺:vc+6.0 運行平臺:xindows xp 四、結(jié)構(gòu)設(shè)計說明:結(jié)構(gòu)圖:編譯系統(tǒng)總體流程圖五、具體實現(xiàn)過程:1、詞法分析(斯琴)詞法分析子程序名為getsym,功能是從源程序中讀出一個單詞符號,把它的信息放入全局變量sym,值放入id中,語法分析需要單詞時,直接從變量中獲得。getsym過程通過反復(fù)調(diào)用getch從源程序中獲取字符,并把

3、它們拼成單詞。getch過程中使用了行緩存區(qū)技術(shù)。(每次讀入一行,存入line緩存區(qū),line被getsym取空后再讀一行。)提高了程序運行效率。詞法分析器的分析過程:調(diào)用getsym時,它通過getch從源程序中獲得一個字符。如果這個字符開頭是字母,則繼續(xù)獲取字符或數(shù)字,最終可以拼成一個單詞,查保留字表,如果查到為保留字,則把sym變量賦成相應(yīng)的保留字類型值;如果沒有查到,則這個單詞應(yīng)是一個用戶自定義的標(biāo)識符(可能是變量名,常量名),把sym置為ident,把這個單詞存入id變量。查保留字表時使用了二次法查找以提高效率。如果getch獲取的字符是數(shù)字,則繼續(xù)用個getch獲取數(shù)字,并把它們拼

4、成一個整數(shù),然后把sym置為number,并把拼成的數(shù)值放入num變量。取字符過程:2、 語法分析(宗華):表達(dá)式序列文法為:語法分析子程序分析:語法分析子程序采用了自頂向下的遞歸子程序法,語法分析同時也根據(jù)程序的語意生成相應(yīng)的代碼,并提供了出錯處理的機(jī)制。語法分析主要由表達(dá)式處理過程(expression)、項處理過程(term)、因子處理過程(factor)構(gòu)成。這些過程在結(jié)構(gòu)上構(gòu)成一個嵌套的層次結(jié)構(gòu)。除此之外,還有出錯報告過程(error)、代碼生成過程(gen)、登錄名字表過程(enter)、查詢名字表函數(shù)(position)以及列出類pcode代碼過程(listcode)作過語法分析

5、的輔助過程。表達(dá)式、項、因子處理:根據(jù)pl/0語法可知,表達(dá)式應(yīng)該是由正負(fù)號或無符號開頭、由若干個項以加減號連接而成。而項是由若干個因子以乘除號連接而成,因子則可能是一個標(biāo)識符或一個數(shù)字,或是一個以括號括起來的子表達(dá)式。根據(jù)這樣的結(jié)構(gòu),構(gòu)造出相應(yīng)的過程,遞歸調(diào)用就完成了表達(dá)式的處理。把項和因子獨立開處理解決了加減號與乘除號的優(yōu)先級問題。在這幾個過程的反復(fù)調(diào)用中,始終傳遞fsys變量的值,保證可以在出錯的情況下跳過出錯的符號,使分析過程得以進(jìn)行下去。以下是我們給出對表達(dá)式序列文法的理解,則:(1).表達(dá)式序列為多個表達(dá)式的集合.(2).表達(dá)式由項組成,或者可以有多個項作加法運算構(gòu)成(3).項是由

6、因子或者因子作乘法運算構(gòu)成(4). 因子是無符號實數(shù),變量,標(biāo)準(zhǔn)函數(shù),亦或遞歸表達(dá)式的定義3、語義分析(宗華):表達(dá)式文法的語義分析主要是:其中的變量無需定義且其作用域為第一次賦值處至最后。 4、目標(biāo)代碼結(jié)構(gòu)和代碼生成(辛敏):表達(dá)式序列編譯程序不僅完成通常的詞法分析、語法分析,而且還產(chǎn)生中間代碼和“目標(biāo)”代碼。目標(biāo)代碼放在一個固定的存貯數(shù)組code中。目標(biāo)代碼結(jié)構(gòu)lit num: 將常數(shù)值取到棧頂 opr 1 : 棧頂元素取反 opr 2 : 次棧頂與棧頂相加,退兩個棧元素,結(jié)果值進(jìn)棧 opr 3 : 次棧頂減去棧頂,退兩個棧元素,結(jié)果值進(jìn)棧 opr 4 : 次棧頂乘以棧頂,退兩個棧元素,結(jié)

7、果值進(jìn)棧 opr 5 : 次棧頂除以棧頂,退兩個棧元素,結(jié)果值進(jìn)棧 sto i : 將棧頂內(nèi)容送入某變量單元中 sin_ : 將棧頂計算sincos_ : 將棧頂計算costan_ : 將棧頂計算tanexp_ : 將棧頂計算explod i : 將變量值取到棧頂 上述指令的格式由兩部分組成:fa其中,f, a的含義見下表: faint常 量lit常 量lod數(shù)據(jù)地址sto數(shù)據(jù)地址opr運算類別表2-1 表達(dá)式序列 處理機(jī)指令上表中,程序地址為目標(biāo)數(shù)組code的下標(biāo),數(shù)據(jù)地址為變量在局部存貯中的相對地址。表達(dá)式序列的編譯程序為每一條表達(dá)式序列源程序的可執(zhí)行語句生成后綴式目標(biāo)代碼。如賦值語句x

8、= y op z(op為某個運算符),將被翻譯成下面的目標(biāo)代碼序列:(設(shè)指令計數(shù)從第0號開始)no.fa0lodaddr_y1lodaddr_z2oprop3stoaddr_x相關(guān)過程(函數(shù))有:gen(),其任務(wù)是把三個參數(shù)f、a組裝成一條目標(biāo)指令并存放于code數(shù)組中,增加cx的值,cx表示下一條即將生成的目標(biāo)指令的地址。5、解釋執(zhí)行(劉中文)s是由解釋程序定義的一位實型數(shù)組,目標(biāo)程序是一種假象的棧式計算機(jī)的匯編語言。解釋執(zhí)行時的數(shù)據(jù)空間s為棧式計算機(jī)的存儲空間,遵循后進(jìn)先出規(guī)則。解釋執(zhí)行過程如下:相關(guān)過程: interpret()。interpret()則完成各種指令的執(zhí)行工作。6、錯誤

9、處理(張俊):編寫完代碼之后,首先檢查一下有沒有簡單的語法錯誤,然后編譯連接運行,輸入源程序,判斷源文件的語法錯誤,返回錯誤原因及編號n,全局變量line記錄出錯的位置。部分代碼:n值的意義:1 無法打開文件2 數(shù)字長度太長3 沒有檢測到賦值符號4 表達(dá)式?jīng)]有正常結(jié)束5 表達(dá)式序列沒有正常結(jié)束6 沒有定義該變量7 數(shù)越界8 缺右括號9 程序太長10 缺左括號六、測試1一個例子1.1表達(dá)式序列語言源程序下面我們給出一個表達(dá)式序列語言寫的一段程序:b=3+100;a=1+1+sin(3*5+cos(45/30);c=3.14*tan(a);d=c*b;#七說明:1、關(guān)于對剔除本程序不需要的pl/0

10、棧式指令的相關(guān)說明剔除的pl/0棧式指令為:cal,jmp,jpc。cal:調(diào)用過程的指令。 本程序只是關(guān)于編譯表達(dá)式的程序,沒有過程,按順序執(zhí)行,不需要調(diào)用過程的指令。jpc: 條件轉(zhuǎn)移指令jmp: 無條件轉(zhuǎn)移指令 表達(dá)式文法是按順序執(zhí)行的,不需用到轉(zhuǎn)移指令。2、簡化pl/0運行棧在pl/0程序中在棧頂分配三個聯(lián)系單元,存貯靜態(tài)鏈,動態(tài)鏈,和返回地址。這些用于過程調(diào)用,但是因為在本程序中沒有過程調(diào)用,所以沒有這三個單元。八、遺留問題遺留問題:類似這樣的表達(dá)式不能解決a=(a=3)九、各自的貢獻(xiàn):討論程序結(jié)構(gòu)的設(shè)計,進(jìn)行詞法分析,寫相關(guān)的代碼。:討論程序結(jié)構(gòu)的設(shè)計,進(jìn)行語法分析,寫相關(guān)的代碼,測試程序:討論程序結(jié)構(gòu)的設(shè)計,設(shè)計關(guān)于生成代碼、執(zhí)行的程序,測試程序,撰寫實驗報告。:討論程序結(jié)構(gòu)的設(shè)計, 編寫解釋執(zhí)行部分代碼。:討論程序結(jié)構(gòu)的設(shè)計,進(jìn)行錯誤判斷,寫相關(guān)的處理代碼,對程序進(jìn)行測試。十、實驗總結(jié):實驗

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論