PL 0 語言編譯器分析實(shí)驗(yàn)報(bào)告_第1頁
PL 0 語言編譯器分析實(shí)驗(yàn)報(bào)告_第2頁
免費(fèi)預(yù)覽已結(jié)束,剩余1頁可下載查看

下載本文檔

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

文檔簡(jiǎn)介

1、PL/0語言編譯器分析實(shí)驗(yàn)一、實(shí)驗(yàn)?zāi)康耐ㄟ^閱讀與解析一個(gè)實(shí)際編譯器(PL/O語言編譯器)的源代碼,加深對(duì)編譯階段(包括詞法分析、語法分析、語義分析、中間代碼生成等)和編譯系統(tǒng)軟件結(jié)構(gòu)的理解,并達(dá)到提高學(xué)生學(xué)習(xí)興趣的目的。二、實(shí)驗(yàn)要求(1)要求掌握基本的程序設(shè)計(jì)技巧(C語言)和閱讀較大規(guī)模程序源代碼的能力;(2)理解并掌握編譯過程的邏輯階段及各邏輯階段的功能;(3)要求能把握整個(gè)系統(tǒng)(PL/0語言編譯器)的體系結(jié)構(gòu),各功能模塊的功能,各模塊之間的接口;(4)要求能總結(jié)出實(shí)現(xiàn)編譯過程各邏輯階段功能采用的具體算法與技三、實(shí)驗(yàn)報(bào)告pl/0語言是pascal語言的一個(gè)子集,我們這里分析的pl/0的編譯程

2、序包括了對(duì)pl/0語言源程序進(jìn)行分析處理、編譯生成類pcode代碼,并在虛擬機(jī)上解釋運(yùn)行生成的類pcode代碼的功能。pl/0語言編譯程序采用以語法分析為核心、一遍掃描的編譯方法。詞法分析和代碼生成作為獨(dú)立的子程序供語法分析程序調(diào)用。語法分析的同時(shí),提供了出錯(cuò)報(bào)告和出錯(cuò)恢復(fù)的功能。在源程序沒有錯(cuò)誤編譯通過的情況下,調(diào)用類pcode解釋程序解釋執(zhí)行生成的類pcode代碼。詞法分析子程序分析:詞法分析子程序名為getsym,功能是從源程序中讀出一個(gè)單詞符號(hào)(token),把它的信息放入全局變量sym、id和num中,語法分析器需要單詞時(shí),直接從這三個(gè)變量中獲得。(注意!語法分析器每次用完這三個(gè)變量

3、的值就立即調(diào)用getsym子程序獲取新的單詞供下一次使用。而不是在需要新單詞時(shí)才調(diào)用getsym過程。)getsym過程通過反復(fù)調(diào)用getch子過程從源程序過獲取字符,并把它們拼成單詞。getch過程中使用了行緩沖區(qū)技術(shù)以提高程序運(yùn)行效率。詞法分析器的分析過程:調(diào)用getsym時(shí),它通過getch過程從源程序中獲得一個(gè)字符。如果這個(gè)字符是字母,則繼續(xù)獲取字符或數(shù)字,最終可以拼成一個(gè)單詞,查保留字表,如果查到為保留字,則把sym變量賦成相應(yīng)的保留字類型值;如果沒有查到,則這個(gè)單詞應(yīng)是一個(gè)用戶自定義的標(biāo)識(shí)符(可能是變量名、常量名或是過程的名字),把sym置為ident,把這個(gè)單詞存入id變量。查保

4、留字表時(shí)使用了二分法查找以提高效率。如果getch獲得的字符是數(shù)字,則繼續(xù)用getch獲取數(shù)字,并把它們拼成一個(gè)整數(shù),然后把sym置為number,并把拼成的數(shù)值放入num變量。如果識(shí)別出其它合法的符號(hào)(比如:賦值號(hào)、大于號(hào)、小于等于號(hào)等),則把Sym則成相應(yīng)的類型。如果遇到不合法的字符,把sym置成nul。語法分析子程序分析:語法分析子程序采用了自頂向下的遞歸子程序法,語法分析同時(shí)也根據(jù)程序的語意生成相應(yīng)的代碼,并提供了出錯(cuò)處理的機(jī)制。語法分析主要由分程序分析過程(block)、常量定義分析過程(constdeclaration)、變量定義分析過程(vardeclaration)、語句分析過

5、程(statement)、表達(dá)式處理過程(expression)、項(xiàng)處理過程(term)、因子處理過程(factor)和條件處理過程(condition)構(gòu)成。這些過程在結(jié)構(gòu)上構(gòu)成一個(gè)嵌套的層次結(jié)構(gòu)。除此之外,還有出錯(cuò)報(bào)告過程(error)、代碼生成過程(gen)、測(cè)試單詞合法性及出錯(cuò)恢復(fù)過程(test)、登錄名字表過程(enter)、查詢名字表函數(shù)(position)以及列出類pcode代碼過程(listcode)作過語法分析的輔助過程。由pl/0的語法圖可知:一個(gè)完整的pl/0程序是由分程序和句號(hào)構(gòu)成的。因此,本編譯程序在運(yùn)行的時(shí)候,通過主程序中調(diào)用分程序處理過程block來分析分程序部分

6、(分程序分析過程中還可能會(huì)遞歸調(diào)用block過程),然后,判斷最后讀入的符號(hào)是否為句號(hào)。如果是句號(hào)且分程序分析中未出錯(cuò),則是一個(gè)合法的pl/0程序,可以運(yùn)行生成的代碼,否則就說明源pl/0程序是不合法的,輸出出錯(cuò)提示即可。語法單元分析:1、分程序處理過程:語法分析開始后,首先調(diào)用分程序處理過程(block)處理分程序。過程入口參數(shù)置為:0層、符號(hào)表位置0、出錯(cuò)恢復(fù)單詞集合為句號(hào)、聲明符或語句開始符。進(jìn)入block過程后,首先把局部數(shù)據(jù)段分配指針設(shè)為3,準(zhǔn)備分配3個(gè)單元供運(yùn)行期存放靜態(tài)鏈sl、動(dòng)態(tài)鏈dl和返回地址ra。然后用tx0記錄下當(dāng)前符號(hào)表位置并產(chǎn)生一條jmp指令,準(zhǔn)備跳轉(zhuǎn)到主程序的開始位

7、置,由于當(dāng)前還沒有知到主程序究竟在何處開始,所以jmp的目標(biāo)暫時(shí)填為0,稍后再改。同時(shí)在符號(hào)表的當(dāng)前位置記錄下這個(gè)jmp指令在代碼段中的位置。在判斷了嵌套層數(shù)沒有超過規(guī)定的層數(shù)后,開始分析源程序。首先判斷是否遇到了常量聲明,如果遇到則開始常量定義,把常量存入符號(hào)表。接下去用同樣的方法分析變量聲明,變量定義過程中會(huì)用dx變量記錄下局部數(shù)據(jù)段分配的空間個(gè)數(shù)。然后如果遇到procedure保留字則進(jìn)行過程聲明和定義,聲明的方法是把過程的名字和所在的層次記入符號(hào)表,過程定義的方法就是通過遞歸調(diào)用block過程,因?yàn)槊總€(gè)過程都是一個(gè)分程序。由于這是分程序中的分程序,因此調(diào)用block時(shí)需把當(dāng)前的層次號(hào)l

8、ev加一傳遞給block過程。分程序聲明部分完成后,即將進(jìn)入語句的處理,這時(shí)的代碼分配指針cx的值正好指向語句的開始位置,這個(gè)位置正是前面的jmp指令需要跳轉(zhuǎn)到的位置。于是通過前面記錄下來的地址值,把這個(gè)jmp指令的跳轉(zhuǎn)位置改成當(dāng)前cx的位置。并在符號(hào)表中記錄下當(dāng)前的代碼段分配地址和局部數(shù)據(jù)段要分配的大?。╠x的值)。生成一條int指令,分配dx個(gè)空間,作為這個(gè)分程序段的第一條指令。下面就調(diào)用語句處理過程statement分析語句。分析完成后,生成操作數(shù)為0的opr指令,用于從分程序返回(對(duì)于0層的主程序來說,就是程序運(yùn)行完成,退出)。2、常量定義過程:通過循環(huán),反復(fù)獲得標(biāo)識(shí)符和對(duì)應(yīng)的值,存入

9、符號(hào)表。符號(hào)表中記錄下標(biāo)識(shí)符的名字和它對(duì)應(yīng)的值。3、變量定義過程:與常量定義類似,通過循環(huán),反復(fù)獲得標(biāo)識(shí)符,存入符號(hào)表。符號(hào)表中記錄下標(biāo)識(shí)符的名字、它所在的層及它在所在層中的偏移地址。4、語句處理過程:語句處理過程是一個(gè)嵌套子程序,通過調(diào)用表達(dá)式處理、項(xiàng)處理、因子處理等過程及遞歸調(diào)用自己來實(shí)現(xiàn)對(duì)語句的分析。語句處理過程可以識(shí)別的語句包括賦值語句、read語句、write語句、call語句、if語句、while語句。當(dāng)遇到begin/end語句時(shí),就遞歸調(diào)用自己來分析。分析的同時(shí)生成相應(yīng)的類pcode指令。5、賦值語句的處理:首先獲取賦值號(hào)左邊的標(biāo)識(shí)符,從符號(hào)表中找到它的信息,并確認(rèn)這個(gè)標(biāo)識(shí)符確

10、為變量名。然后通過調(diào)用表達(dá)式處理過程算得賦值號(hào)右部的表達(dá)式的值并生成相應(yīng)的指令保證這個(gè)值放在運(yùn)行期的數(shù)據(jù)棧頂。最后通過前面查到的左部變量的位置信息,生成相應(yīng)的sto指令,把棧頂值存入指定的變量的空間,實(shí)現(xiàn)了賦值操作。6、read語句的處理:確定read語句語法合理的前提下(否則報(bào)錯(cuò)),生成相應(yīng)的指令:第一條是16號(hào)操作的opr指令,實(shí)現(xiàn)從標(biāo)準(zhǔn)輸入設(shè)備上讀一個(gè)整數(shù)值,放在數(shù)據(jù)棧頂。第二條是sto指令,把棧頂?shù)闹荡嫒雛ead語句括號(hào)中的變量所在的單元。7、write語句的處理:與read語句相似。在語法正確的前提下,生成指令:通過循環(huán)調(diào)用表達(dá)式處理過程分析write語句括號(hào)中的每一個(gè)表達(dá)式,生成相

11、應(yīng)指令保證把表達(dá)式的值算出并放到數(shù)據(jù)棧頂并生成14號(hào)操作的opr指令,輸出表達(dá)式的值。最后生成15號(hào)操作的opr指令輸出一個(gè)換行。8、call語句的處理:從符號(hào)表中找到call語句右部的標(biāo)識(shí)符,獲得其所在層次和偏移地址。然后生成相應(yīng)的cal指令。至于調(diào)用子過程所需的保護(hù)現(xiàn)場(chǎng)等工作是由類pcode解釋程序在解釋執(zhí)行cal指令時(shí)自動(dòng)完成的。9、if語句的處理:按if語句的語法,首先調(diào)用邏輯表達(dá)式處理過程處理if語句的條件,把相應(yīng)的真假值放到數(shù)據(jù)棧頂。接下去記錄下代碼段分配位置(即下面生成的jpc指令的位置),然后生成條件轉(zhuǎn)移jpc指令(遇0或遇假轉(zhuǎn)移),轉(zhuǎn)移地址未知暫時(shí)填0。然后調(diào)用語句處理過程處

12、理then語句后面的語句或語句塊。then后的語句處理完后,當(dāng)前代碼段分配指針的位置就應(yīng)該是上面的jpc指令的轉(zhuǎn)移位置。通過前面記錄下的jpc指令的位置,把它的跳轉(zhuǎn)位置改成當(dāng)前的代碼段指針位置。10、begin/end語句的處理:通過循環(huán)遍歷begin/end語句塊中的每一個(gè)語句,通過遞歸調(diào)用語句分析過程分析并生成相應(yīng)代碼。11、while語句的處理:首先用cxl變量記下當(dāng)前代碼段分配位置,作為循環(huán)的開始位置。然后處理while語句中的條件表達(dá)式生成相應(yīng)代碼把結(jié)果放在數(shù)據(jù)棧頂,再用cx2變量記下當(dāng)前位置,生成條件轉(zhuǎn)移指令,轉(zhuǎn)移位置未知,填0。通過遞歸調(diào)用語句分析過程分析do語句后的語句或語句塊

13、并生成相應(yīng)代碼。最后生成一條無條件跳轉(zhuǎn)指令jmp,跳轉(zhuǎn)到cx1所指位置,并把cx2所指的條件跳轉(zhuǎn)指令的跳轉(zhuǎn)位置改成當(dāng)前代碼段分配位置。12、表達(dá)式、項(xiàng)、因子處理:根據(jù)pl/0語法可知,表達(dá)式應(yīng)該是由正負(fù)號(hào)或無符號(hào)開頭、由若干個(gè)項(xiàng)以加減號(hào)連接而成。而項(xiàng)是由若干個(gè)因子以乘除號(hào)連接而成,因子則可能是一個(gè)標(biāo)識(shí)符或一個(gè)數(shù)字,或是一個(gè)以括號(hào)括起來的子表達(dá)式。根據(jù)這樣的結(jié)構(gòu),構(gòu)造出相應(yīng)的過程,遞歸調(diào)用就完成了表達(dá)式的處理。把項(xiàng)和因子獨(dú)立開處理解決了加減號(hào)與乘除號(hào)的優(yōu)先級(jí)問題。在這幾個(gè)過程的反復(fù)調(diào)用中,始終傳遞fsys變量的值,保證可以在出錯(cuò)的情況下跳過出錯(cuò)的符號(hào),使分析過程得以進(jìn)行下去。13、邏輯表達(dá)式的處

14、理:首先判斷是否為一元邏輯表達(dá)式:判奇偶。如果是,則通過調(diào)用表達(dá)式處理過程分析計(jì)算表達(dá)式的值,然后生成判奇指令。如果不是,則肯定是二元邏輯運(yùn)算符,通過調(diào)用表達(dá)式處理過程依次分析運(yùn)算符左右兩部分的值,放在棧頂?shù)膬蓚€(gè)空間中,然后依不同的邏輯運(yùn)算符,生成相應(yīng)的邏輯判斷指令,放入代碼段。14、判斷單詞合法性與出錯(cuò)恢復(fù)過程分析:本過程有三個(gè)參數(shù),si、s2為兩個(gè)符號(hào)集合,n為出錯(cuò)代碼。本過程的功能是:測(cè)試當(dāng)前符號(hào)(即sym變量中的值)是否在si集合中,如果不在,就通過調(diào)用出錯(cuò)報(bào)告過程輸出出錯(cuò)代碼n,并放棄當(dāng)前符號(hào),通過詞法分析過程獲取一下單詞,直到這個(gè)單詞出現(xiàn)在si或s2集合中為止。這個(gè)過程在實(shí)際使用中

15、很靈活,主要有兩個(gè)用法:在進(jìn)入某個(gè)語法單位時(shí),調(diào)用本過程,檢查當(dāng)前符號(hào)是否屬于該語法單位的開始符號(hào)集合。若不屬于,則濾去開始符號(hào)和后繼符號(hào)集合外的所有符號(hào)。在語法單位分析結(jié)束時(shí),調(diào)用本過程,檢查當(dāng)前符號(hào)是否屬于調(diào)用該語法單位時(shí)應(yīng)有的后繼符號(hào)集合。若不屬于,則濾去后繼符號(hào)和開始符號(hào)集合外的所有符號(hào)。通過這樣的機(jī)制,可以在源程序出現(xiàn)錯(cuò)誤時(shí),及時(shí)跳過出錯(cuò)的部分,保證語法分析可以繼續(xù)下去。15、類pcode代碼解釋執(zhí)行過程分析:這個(gè)過程模擬了一臺(tái)可以運(yùn)行類pcode指令的棧式計(jì)算機(jī)。它擁有一個(gè)棧式數(shù)據(jù)段用于存放運(yùn)行期數(shù)據(jù)、擁有一個(gè)代碼段用于存放類pcode程序代碼。同時(shí)還擁用數(shù)據(jù)段分配指針、指令指針、

16、指令寄存器、局部段基址指針等寄存器。16、解釋執(zhí)行類pcode代碼時(shí),數(shù)據(jù)段存儲(chǔ)分配方式:對(duì)于源程序的每一個(gè)過程(包括主程序),在被調(diào)用時(shí),首先在數(shù)據(jù)段中開辟三個(gè)空間,存放靜態(tài)鏈sl、動(dòng)態(tài)鏈dl和返回地址ra。靜態(tài)鏈記錄了定義該過程的直接外過程(或主程序)運(yùn)行時(shí)最新數(shù)據(jù)段的基地址。動(dòng)態(tài)鏈記錄調(diào)用該過程前正在運(yùn)行的過程的數(shù)據(jù)段基址。返回地址記錄了調(diào)用該過程時(shí)程序運(yùn)行的斷點(diǎn)位置。對(duì)于主程序來說,sl、dl和ra的值均置為0。靜態(tài)鏈的功能是在一個(gè)子過程要引用它的直接或間接父過程(這里的父過程是按定義過程時(shí)的嵌套情況來定的,而不是按執(zhí)行時(shí)的調(diào)用順序定的)的變量時(shí),可以通過靜態(tài)鏈,跳過個(gè)數(shù)為層差的數(shù)據(jù)段,找到包含要引用的變量所在的數(shù)據(jù)段基址,然后通過偏移地址訪問它。在過程返回時(shí),解釋程序通過返回地址恢復(fù)指令指針的值到調(diào)用前的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論