PL0編譯器功能擴(kuò)充_第1頁
PL0編譯器功能擴(kuò)充_第2頁
PL0編譯器功能擴(kuò)充_第3頁
PL0編譯器功能擴(kuò)充_第4頁
PL0編譯器功能擴(kuò)充_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、 Ningxia Normal UniversityPL0編譯器 題 目 Pl0編譯器功能擴(kuò)充 姓 名 學(xué) 號 院(系) 數(shù)學(xué)與計(jì)算機(jī)科學(xué)學(xué)院 專業(yè)班級 計(jì)算機(jī)技術(shù)與科學(xué)2班 時(shí)間 2014-1-5 1目 錄一、實(shí)驗(yàn)?zāi)康?- 3二、實(shí)驗(yàn)內(nèi)容 - 3三、實(shí)驗(yàn)框圖 - 4四、過程分析 - 61、詞法過程分析 - 62、語法過程分析 - 63、整體過程分析 - 74、擴(kuò)充過程分析 - 9五、測試結(jié)果 - 11六、問題及感受 - 12 2一、實(shí)驗(yàn)?zāi)康谋敬螌?shí)驗(yàn)設(shè)計(jì)主要是在分析理解PL/0編譯程序的基礎(chǔ)上,對其詞法分析程序、語法分析程序和語義處理程序進(jìn)行部分修改擴(kuò)充,使其增加并且實(shí)現(xiàn)了更多的功能。二、實(shí)驗(yàn)

2、內(nèi)容PL/0語言是Pascal語言的一個(gè)子集,這里分析的PL/0的編譯程序包括了對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代碼。擴(kuò)充PL0語言是在PL0語言的基礎(chǔ)上增加對整型一維數(shù)組的支持、擴(kuò)充IF-THEN-ELSE條件語句、增加REPEAT語句。如下所示:(1)整型一維數(shù)組,數(shù)組

3、的定義格式為:VAR <數(shù)組標(biāo)識名>(<下界>:<上界>)其中上界和下界可以是整數(shù)或者常量標(biāo)識名訪問數(shù)組元素的時(shí)候,數(shù)組下標(biāo)是整型的表達(dá)式,包括整數(shù)、常量或者變量和它們的組合(2)擴(kuò)充條件語句,格式為:<條件語句>:= IF <條件>THEN <語句>ELSE <語句>(3)增加REPEAT語句,格式為:<重復(fù)語句> := REPEAT <語句> UNTIL <條件> (4) 注釋 單行注釋以 開始,以 結(jié)束,注釋內(nèi)容不包括 和 3三、實(shí)驗(yàn)框圖1、基本工作流程圖語法分析詞法分

4、析語義分析代碼生成代碼執(zhí)行源程序執(zhí)行結(jié)果符號表管理錯(cuò)誤診斷處理2、語法分析圖程序程序體語句條件表達(dá)式項(xiàng)因子43、if-then-else 語句的流程圖進(jìn)入if語句 條件判斷 Y N 執(zhí)行 then 后語句 執(zhí)行 else 后語句 退出該語句4、增加+a,-a功能 開始程序 讀入a值 a=a+1或a=a-1a原值參與運(yùn)算 退出該語句 5四、過程分析1、詞法分析:詞法分析子程序名為GETSYM,功能是從源程序中讀出一個(gè)單詞符號,把它的信息放入全局變量 SYM、ID和NUM中,字符變量放入CH中,語法分析器需要單詞時(shí),直接從這三個(gè)變量中獲得。Getch過程通過反復(fù)調(diào)用Getch子過程從源程序過獲取字

5、符,并把它們拼成單詞。GETCH過程中使用了行緩沖區(qū)技術(shù)以提高程序運(yùn)行效率。詞法分析器的分析過程:調(diào)用GETSYM時(shí),它通過GETCH過程從源程序中獲得一個(gè)字符。如果這個(gè)字符是字母,則繼續(xù)獲取字符或數(shù)字,最終可以拼成一個(gè)單詞,查保留字表,如果查到為保留字,則把SYM變量賦成相應(yīng)的保留字類型值;如果沒有查到,則這個(gè)單詞應(yīng)是一個(gè)用戶自定義的標(biāo)識符(可能是變量名、常量名或是過程的名字),把SYM置為IDENT,把這個(gè)單詞存入ID變量。查保留字表時(shí)使用了二分法查找以提高效率。如果Getch獲得的字符是數(shù)字,則繼續(xù)用Getch獲取數(shù)字,并把它們拼成一個(gè)整數(shù)或?qū)崝?shù),然后把SYM置為 INTEGER或REA

6、L,并把拼成的數(shù)值放入NUM變量。如果識別出其它合法的符號(比如:賦值號、大于號、小于等于號等),則把SYM則成相應(yīng)的類型。如果遇到不合法的字符,把SYM置成NUL。2、語法分析:語法分析子程序采用了自頂向下的遞歸子程序法,語法分析同時(shí)也根據(jù)程序的語義生成相應(yīng)三元代碼,并提供了出錯(cuò)處理的機(jī)制。語法分析主要由分程序分析過程、參數(shù)變量分析過程、參數(shù)變量處理過程、數(shù)組處理過程、常量定義分析過程、變量定義分析過程、語句分析過程、表達(dá)式處理過程、項(xiàng)處理過程、因子處理過程和條件處理過程構(gòu)成。這些過程在結(jié)構(gòu)上構(gòu)成一個(gè)嵌套的層次結(jié)構(gòu)。除此之外,還有出錯(cuò)報(bào)告過程、代碼生成過程、測試單詞合法性及出錯(cuò)恢復(fù)過程、登錄

7、名字表過程、查詢名字表函數(shù)以及列出類 PCODE代碼過程作過語法分析的輔助過程。63、整體分析:語法分析開始后,首先調(diào)用分程序處理過程處理分程序。過程入口參數(shù)置為:0層、符號表位置0、出錯(cuò)恢復(fù)單詞集合為句號、聲明符或語句開始符。進(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)前符號表位置并產(chǎn)生一條Jmp指令,準(zhǔn)備跳轉(zhuǎn)到主程序的開始位置,由于當(dāng)前還沒有知到主程序究竟在何處開始,所以Jmp的目標(biāo)暫時(shí)填為0,稍后再改。同時(shí)在符號表的當(dāng)前位置記錄下這個(gè)Jmp指令在代碼段中的位置。在判斷了嵌套層數(shù)沒有超過規(guī)定的

8、層數(shù)后,開始分析源程序。首先判斷是否遇到了常量聲明,如果遇到則開始常量定義,把常量存入符號表。接下去用同樣的方法分析變量聲明,變量定義過程中會用Dx變量記錄下局部數(shù)據(jù)段分配的空間個(gè)數(shù)。然后如果遇到Procedure保留字則進(jìn)行過程聲明和定義,聲明的方法是把過程的名字和所在的層次記入符號表,過程定義的方法就是通過遞歸調(diào)用Block過程,因?yàn)槊總€(gè)過程都是一個(gè)分程序。由于這是分程序中的分程序,因此調(diào)用Block時(shí)需把當(dāng)前的層次號Lev加一傳遞給Block 過程。分程序聲明部分完成后,即將進(jìn)入語句的處理,這時(shí)的代碼分配指針CX的值正好指向語句的開始位置,這個(gè)位置正是前面的Jmp指令需要跳轉(zhuǎn)到的位置。于

9、是通過前面記錄下來的地址值,把這個(gè)Jmp指令的跳轉(zhuǎn)位置改成當(dāng)前cx的位置。并在符號表中記錄下當(dāng)前的代碼段分配地址和局部數(shù)據(jù)段要分配的大?。―X 的值)。生成一條INT指令,分配DX個(gè)空間,作為這個(gè)分程序段的第一條指令。下面就調(diào)用語句處理過程Statement分析語句。分析完成后,生成操作數(shù)為0的OPR指令,用于從分程序返回。常量定義過程:通過循環(huán),反復(fù)獲得標(biāo)識符和對應(yīng)的值,存入符號表。符號表中記錄下標(biāo)識符的名字和它對應(yīng)的值。變量定義過程:與常量定義類似,通過循環(huán),反復(fù)獲得標(biāo)識符,存入符號表。符號表中記錄下標(biāo)識符的名字、它所在的層及它在所在層中的偏移地址。7參變量定義過程:類似變量定義,將參變量

10、,存入符號表中。參變量處理過程:如果函數(shù)用參變量,依照形參的類型、個(gè)數(shù),由實(shí)參進(jìn)行賦值。數(shù)組處理過程:計(jì)算數(shù)組括號內(nèi)的偏移值,存入棧頂用于后面生成的STOARR和LODARR指令調(diào)用實(shí)際的數(shù)組中元素的地址。語句處理過程:語句處理過程是一個(gè)嵌套子程序,通過調(diào)用表達(dá)式處理、項(xiàng)處理、因子處理等過程及遞歸調(diào)用自己來實(shí)現(xiàn)對語句的分析。語句處理過程可以識別的語句包括賦值語句、read語句、write語句、+語句、-語句、+=語句、-=語句、if-else-then語句、while語句、For語句、repeat語句。當(dāng)遇到begin/end語句時(shí),就遞歸調(diào)用自己來分析。分析的同時(shí)生成相應(yīng)的類PCODE指令。

11、賦值語句的處理:首先獲取賦值號左邊的標(biāo)識符,從符號表中找到它的信息,并確認(rèn)這個(gè)標(biāo)識符確為變量名。然后通過調(diào)用表達(dá)式處理過程算得賦值號右部的表達(dá)式的值并生成相應(yīng)的指令保證這個(gè)值放在運(yùn)行期的數(shù)據(jù)棧頂。最后通過前面查到的左部變量的位置信息,生成相應(yīng)的STO指令,把棧頂值存入指定的變量的空間,實(shí)現(xiàn)了賦值操作。返回函數(shù)值也是用賦值語句進(jìn)行返回值的儲存。對函數(shù)與過程調(diào)用的處理:首先判斷讀入的標(biāo)識符屬性為FUNCTION或PROCEDURE,從符號表中找到此標(biāo)識符,獲得其所在層次和偏移地址。然后生成相應(yīng)的cal指令。至于調(diào)用子過程所需的保護(hù)現(xiàn)場等工作是由類PCODE解釋程序在解釋執(zhí)行cal指令時(shí)自動(dòng)完成的。

12、如果此標(biāo)識符不在第0層而且是該層函數(shù)的函數(shù)名則作為返回值返回。read語句的處理: 在read語句合理前提下,由變量的類型生成相應(yīng)的指令:8對于整型,第一條是16號操作的opr指令,實(shí)現(xiàn)從標(biāo)準(zhǔn)輸入設(shè)備上讀一個(gè)整數(shù)值,放在數(shù)據(jù)棧頂。如果讀入是實(shí)數(shù)就報(bào)錯(cuò),第二條是sto指令,把棧頂?shù)闹荡嫒雛ead語句括號中的變量所在的單元。對于實(shí)型,第一條是15號操作的opr指令,實(shí)現(xiàn)從標(biāo)準(zhǔn)輸入設(shè)備上讀一個(gè)實(shí)數(shù)值,放在數(shù)據(jù)棧頂。第二條是sto指令,把棧頂?shù)闹荡嫒雛ead語句括號中的變量所在的單元。對于字符型,第一條是20號操作的opr指令,實(shí)現(xiàn)從標(biāo)準(zhǔn)輸入設(shè)備上讀一個(gè)字符值,第二條是sto指令,把棧頂?shù)闹荡嫒雛ea

13、d語句括號中的變量所在的單元。write語句的處理:與read語句相似。在語法正確的前提下,生成指令:通過循環(huán)調(diào)用表達(dá)式處理過程分析write語句括號中的每一個(gè)表達(dá)式,生成相應(yīng)指令保證把表達(dá)式的值算出并放到數(shù)據(jù)棧頂并生成指令,輸出表達(dá)式的值,如果是數(shù)字類型則生成14號操作的opr指令,如果是字符類型則生成19號操作的opr指令。4、擴(kuò)充分析:增加錯(cuò)誤分析功能在編譯程序的過程中,往往我們的程序中存在著一些錯(cuò)誤。而在編譯主體的時(shí)候我們已經(jīng)列出了出錯(cuò)編號,為了清晰的了解出錯(cuò)原因,因此在初始化過程后增加了出錯(cuò)處理,打印出錯(cuò)位置和錯(cuò)誤編碼。void error(int n)char space81;me

14、mset(space,32,81); spacecc-1=0; /出錯(cuò)時(shí)當(dāng)前符號已經(jīng)讀完,所以cc-1printf("*%s!%dn",space,n);switch(n)err+;9增加if-then-else當(dāng)編譯程序編譯到條件語句時(shí),并不直到條件為假時(shí)的轉(zhuǎn)移地址,必須等到條件為真的語句編譯完后才知道轉(zhuǎn)移地址。還有當(dāng)條件為真時(shí)語句執(zhí)行完畢后,必須跳出 if 語句,否則就會接著執(zhí)行else后語句。即再then后else前語句的最后加上一條無條件轉(zhuǎn)移指令: jmp 0 ?,此時(shí)該地址也未知,因?yàn)榫幾g程序還未編譯 else 后語句,等到編譯完 else后語句時(shí),才知道該地址,

15、所以必須保存該代碼的地址,等下次回填。 在初始化與頭文件中作相應(yīng)改動(dòng)初始化:strcpy(&(word50),"else");strcpy(&(word140),"to");wsym5=elsesym; /* add else*/wsym14=tosym; 頭文件:enum symbol nul, ident, number, plus, minus, times, slash, oddsym, eql, neq,lss, leq, gtr, geq, lparen,rparen, comma, semicolon,period, bec

16、omes,pluseq,minuseq,plusone,minusone,beginsym, endsym, ifsym, thensym, whilesym,writesym, readsym, dosym, callsym, constsym,varsym, procsym,elsesym,tosym增加+a與-a、增加a+與a-功能和增加+=與-=功能+a與-a的操作是將a的值自加與自減1,但是參與程序中與a值相關(guān)的運(yùn)算的時(shí)候,使用的仍然是未經(jīng)過自加或自減的a值。a+與a-的操作是將a的值自加與自減1,而后參與程序中與a值相關(guān)的運(yùn)算的時(shí)候,使用的是已經(jīng)過自加或自減的a值。+=與-=首先在

17、詞法分析getsym中加入識別+=與-=的功能。同時(shí)在頭文件中作相應(yīng)改變頭文件。10五、測試結(jié)果1、測試文件:TEST1:var x,y,z; TEST2:var x,y;Begin begin x:=-3; x:=10; y:=13; y:=6; read(z); x+=y; if z>4 then y-=x;write(x) write(x); else write(y)write(y+x) end.end. TEST3 :var x,y,z; TEST4:var x,y;Begin beginx:=6; x=5;y:=13; y:=1;z:=12; z:=x+yz:=(+x)+(y

18、-); write(z);write(x); endwrite(y);write(z)end. 112測試結(jié)果: 12六、問題及感受1、感受:初見pl/0的代碼,真的是很長很長,這次實(shí)驗(yàn)可以說是從我們學(xué)習(xí)這個(gè)專業(yè)以來所接觸的代碼量最大,涉及數(shù)據(jù)結(jié)構(gòu)和算法知識最多的一次實(shí)驗(yàn)。從一開始,就很擔(dān)心是否可以按照老師的規(guī)定完成相應(yīng)的要求。拿到代碼,就開始閱讀代碼,遇到不懂的地方,就查閱網(wǎng)絡(luò)、編譯原理的書,或是詢問同學(xué),但這次的pl/0與我平時(shí)接觸的其他程序有很多不同,每一個(gè)模塊之間的聯(lián)系都緊緊相扣,從詞法分析,語法分析到虛擬機(jī)的輸出,指針存儲的應(yīng)用以及最后的整個(gè)程序等。讀來都太緊湊,對于我來說理解都很困難。這次的實(shí)驗(yàn)不僅困難重重,也有很多不足的地方,與真正的程序比起來實(shí)在相差太遠(yuǎn),但是對我來說是一個(gè)不錯(cuò)的經(jīng)驗(yàn)。它讓我大致上看到了一個(gè)程序完整的開發(fā)過程,對于我的將來相信是有莫大的好處的。在實(shí)驗(yàn)的過程中,我認(rèn)識到自己的專業(yè)知識是相當(dāng)欠缺的,C語言的陌生,各種

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論