pl10編譯程序_第1頁
pl10編譯程序_第2頁
pl10編譯程序_第3頁
pl10編譯程序_第4頁
pl10編譯程序_第5頁
已閱讀5頁,還剩81頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第第2 2章章 PL/0PL/0編譯程序編譯程序2.1 PL/0語言和類語言和類pcode的描述的描述2.2 PL/0編譯程序的結(jié)構(gòu)編譯程序的結(jié)構(gòu)2.3 PL/0編譯程序的語法語義分析編譯程序的語法語義分析 2.4 PL/0編譯程序的編譯程序的錯誤處理錯誤處理2.5 類類pcodepcode代碼解釋器代碼解釋器本章目的:以本章目的:以PL/0PL/0為實(shí)例為實(shí)例, ,學(xué)習(xí)編譯程序?qū)崿F(xiàn)的基本步驟和相關(guān)技學(xué)習(xí)編譯程序?qū)崿F(xiàn)的基本步驟和相關(guān)技術(shù)術(shù) PL/0 PL/0編譯程序編譯程序 PL/0編譯程序編譯程序 PL/0 語言程序語言程序 類類 pcode 代嗎代嗎源語言源語言(PL/0)目標(biāo)語言目標(biāo)語言

2、(類類 pcode)實(shí)現(xiàn)語言(實(shí)現(xiàn)語言(pascal) PL/0 類類 pcode pascal PL/0PL/0編譯程序編譯程序類類 pcodepcode解釋解釋程序程序類類 pcode代碼代碼PL/0源程序源程序輸入輸入輸出輸出PL/0PL/0編譯系統(tǒng)的結(jié)構(gòu)框架編譯系統(tǒng)的結(jié)構(gòu)框架PL/0PL/0語言語言zPL/0PL/0程序示例程序示例zPL/0PL/0的的語法描述圖語法描述圖zPL/0PL/0語言語言文法的文法的EBNFEBNF表示表示zPL/0PL/0語言:語言:PASCALPASCAL語言的語言的子集子集 PL/0 PL/0程序示例程序示例 CONST A=10; CONST A=1

3、0; (* * 常量說明部分常量說明部分 * *) VAR B,C; VAR B,C; (* * 變量變量說明部分說明部分 * *) PROCEDURE PROCEDURE P; P; (* * 過程過程說明部分說明部分 * *) VAR D;VAR D; PROCEDURE PROCEDURE Q;Q; VAR X; VAR X; BEGINBEGIN READ(X); READ(X); D:=X; D:=X; WHILE X#0 WHILE X#0 DO CALL P; DO CALL P; END; END; BEGINBEGIN WRITE(D); WRITE(D); CALL Q;

4、CALL Q; END; END; BEGINBEGIN CALL P; CALL P; END. END.Q的過程體的過程體p的過程體的過程體主主程序程序體體 程序程序分程序分程序.內(nèi)的文字表示內(nèi)的文字表示非終結(jié)符非終結(jié)符或內(nèi)的文字或符號表示內(nèi)的文字或符號表示終結(jié)符終結(jié)符constidentnumbervaridentprocedureident分程序分程序語句語句分程序分程序PL/0PL/0語言文法的語言文法的EBNFEBNF表示表示 EBNF EBNF 引入的符號引入的符號( (元符號元符號) ): 用左右尖括號括起來的語法成分為用左右尖括號括起來的語法成分為非終結(jié)符非終結(jié)符= () =

5、 () 定義為定義為 =() =() 的的左部由左部由右部右部定義定義 | | 或或 表示花括號內(nèi)的語法成分表示花括號內(nèi)的語法成分可重復(fù)可重復(fù)任意次或限任意次或限 定次數(shù)定次數(shù) 表示方括號內(nèi)的語法成分為表示方括號內(nèi)的語法成分為任選項(xiàng)任選項(xiàng)( ) ( ) 表示圓括號內(nèi)的成分表示圓括號內(nèi)的成分優(yōu)先優(yōu)先例:用例:用EBNFEBNF描述描述 的定義的定義 : =+|-=+|- =0|1|2|3|4|5|6|7|8|9=0|1|2|3|4|5|6|7|8|9 或更好的寫法或更好的寫法 =+|-=+|-|0|0 =1|2|3|4|5|6|7|8|9 =1|2|3|4|5|6|7|8|9 =0|=0| PL

6、/0PL/0語言是語言是PASCALPASCAL語言的語言的子集子集同同PASCALPASCAL 作用域規(guī)則(內(nèi)層作用域規(guī)則(內(nèi)層可引用包圍它的外層定義的可引用包圍它的外層定義的標(biāo)識符),標(biāo)識符),上下文約束,上下文約束, 過程可過程可嵌套定義嵌套定義,可遞歸調(diào)用可遞歸調(diào)用子集子集z 數(shù)據(jù)類型數(shù)據(jù)類型, ,只有整型只有整型z 數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu) , ,只有簡變和常數(shù)只有簡變和常數(shù)z 數(shù)字最多為數(shù)字最多為1414位位z 標(biāo)識符的有效長度是標(biāo)識符的有效長度是1010z 語句種類語句種類z 過程最多可過程最多可嵌套嵌套三層三層 目標(biāo)代碼目標(biāo)代碼類類pcodepcode目標(biāo)代碼目標(biāo)代碼類類pcodepc

7、ode是一種是一種假想棧式計算機(jī)假想棧式計算機(jī)的的匯編語言匯編語言。指令格式:指令格式:f l af l af f功能碼功能碼l l層次差層次差 (標(biāo)識符(標(biāo)識符引用層引用層減去減去定義層定義層)a a根據(jù)不同的指令有所區(qū)別根據(jù)不同的指令有所區(qū)別LIT 0 aLIT 0 a將常數(shù)值取到棧頂,將常數(shù)值取到棧頂,a a為常數(shù)值為常數(shù)值LOD l aLOD l a將變量值取到棧頂,將變量值取到棧頂,a a為偏移量,為偏移量,l l為層差為層差STO l aSTO l a將棧頂內(nèi)容送入某變量單元中,將棧頂內(nèi)容送入某變量單元中,a a為偏移量,為偏移量,l l為層差為層差CAL l aCAL l a調(diào)用

8、過程,調(diào)用過程,a a為過程地址,為過程地址,l l為層差為層差I(lǐng)NT 0 aINT 0 a在運(yùn)行棧中為被調(diào)用的過程開辟在運(yùn)行棧中為被調(diào)用的過程開辟a a個單元的數(shù)據(jù)區(qū)個單元的數(shù)據(jù)區(qū)JMP 0 aJMP 0 a無條件跳轉(zhuǎn)至無條件跳轉(zhuǎn)至a a地址地址JPC 0 aJPC 0 a條件跳轉(zhuǎn),當(dāng)棧頂布爾值非真則跳轉(zhuǎn)至條件跳轉(zhuǎn),當(dāng)棧頂布爾值非真則跳轉(zhuǎn)至a a地址,否則順地址,否則順序執(zhí)行序執(zhí)行OPR 0 OPR 0 0 0過程調(diào)用結(jié)束后過程調(diào)用結(jié)束后, ,返回調(diào)用點(diǎn)并退棧返回調(diào)用點(diǎn)并退棧OPR 0 1OPR 0 1棧頂元素取反棧頂元素取反OPR 0 2OPR 0 2次棧頂與棧頂相加,退兩個棧元素,結(jié)果值

9、進(jìn)棧次棧頂與棧頂相加,退兩個棧元素,結(jié)果值進(jìn)棧OPR 0 3OPR 0 3次棧頂減去棧頂,退兩個棧元素,結(jié)果值進(jìn)棧次棧頂減去棧頂,退兩個棧元素,結(jié)果值進(jìn)棧OPR 0 4OPR 0 4次棧頂乘以棧頂,退兩個棧元素,結(jié)果值進(jìn)棧次棧頂乘以棧頂,退兩個棧元素,結(jié)果值進(jìn)棧OPR 0 5OPR 0 5次棧頂除以棧頂,退兩個棧元素,結(jié)果值進(jìn)棧次棧頂除以棧頂,退兩個棧元素,結(jié)果值進(jìn)棧OPR 0 6OPR 0 6棧頂元素的奇偶判斷,結(jié)果值在棧頂棧頂元素的奇偶判斷,結(jié)果值在棧頂OPR 0 7OPR 0 7OPR 0 8OPR 0 8次棧頂與棧頂是否相等,退兩個棧元素,結(jié)果值進(jìn)棧次棧頂與棧頂是否相等,退兩個棧元素,

10、結(jié)果值進(jìn)棧OPR 0 9OPR 0 9次棧頂與棧頂是否不等,退兩個棧元素,結(jié)果值進(jìn)棧次棧頂與棧頂是否不等,退兩個棧元素,結(jié)果值進(jìn)棧OPR 0 10OPR 0 10次棧頂是否小于棧頂,退兩個棧元素,結(jié)果值進(jìn)棧次棧頂是否小于棧頂,退兩個棧元素,結(jié)果值進(jìn)棧OPR 0 11OPR 0 11次棧頂是否大于等于棧頂,退兩個棧元素,結(jié)果值進(jìn)棧次棧頂是否大于等于棧頂,退兩個棧元素,結(jié)果值進(jìn)棧OPR 0 12OPR 0 12次棧頂是否大于棧頂,退兩個棧元素,結(jié)果值進(jìn)棧次棧頂是否大于棧頂,退兩個棧元素,結(jié)果值進(jìn)棧OPR 0 13OPR 0 13次棧頂是否小于等于棧頂,退兩個棧元素,結(jié)果值進(jìn)棧次棧頂是否小于等于棧頂

11、,退兩個棧元素,結(jié)果值進(jìn)棧OPR 0 14OPR 0 14棧頂值輸出至屏幕棧頂值輸出至屏幕OPR 0 15OPR 0 15屏幕輸出換行屏幕輸出換行OPR 0 16OPR 0 16從命令行讀入一個輸入置于棧頂從命令行讀入一個輸入置于棧頂指指令令功功能能表表 const a=10; const a=10;var b,c;var b,c;procedure p;procedure p; beginbegin c:=b+a; c:=b+a; end; end;beginbegin read(b); read(b); while while b#0b#0 do do begin begin call p

12、; call p; write(2 write(2* *c);c); read(b); read(b); end endend.end.( 0) jmp 0 8 ( 0) jmp 0 8 轉(zhuǎn)向轉(zhuǎn)向主程序入口主程序入口( 1) jmp 0 2 ( 1) jmp 0 2 轉(zhuǎn)向轉(zhuǎn)向過程過程p p入口入口( 2)( 2) int 0 3int 0 3 過程過程p p入口入口, ,為過程為過程p p開辟空間開辟空間( 3) lod ( 3) lod 1 1 3 3 取變量取變量b b的值到棧頂?shù)闹档綏m? 4) lit 0 10 ( 4) lit 0 10 取常數(shù)取常數(shù)1010到棧頂?shù)綏m? 5) op

13、r 0 2 ( 5) opr 0 2 次棧頂與棧頂相加次棧頂與棧頂相加( 6) sto ( 6) sto 1 1 4 4 棧頂值送變量棧頂值送變量c c中中( 7) ( 7) opr 0 0opr 0 0 退棧并返回調(diào)用點(diǎn)退棧并返回調(diào)用點(diǎn)(16)(16)( 8)( 8) int 0 5 int 0 5 主程序入口開辟主程序入口開辟5 5個??臻g個棧空間( 9) opr 0 16 ( 9) opr 0 16 從命令行讀入值置于棧頂從命令行讀入值置于棧頂(10) sto 0 3 (10) sto 0 3 將棧頂值存入變量將棧頂值存入變量b b中中(11) lod 0 3 (11) lod 0 3

14、將變量將變量b b的值取至棧頂?shù)闹等≈翖m?12) lit 0 0 (12) lit 0 0 將常數(shù)值將常數(shù)值0 0進(jìn)棧進(jìn)棧(13) opr 0 9 (13) opr 0 9 次棧頂與棧頂是否不等次棧頂與棧頂是否不等(14) (14) jpc 0 24jpc 0 24 等時轉(zhuǎn)等時轉(zhuǎn)(24)(24)(條件不滿足轉(zhuǎn)條件不滿足轉(zhuǎn))(15) (15) cal 0 2cal 0 2 調(diào)用過程調(diào)用過程p p(16) lit 0 2 (16) lit 0 2 常數(shù)值常數(shù)值2 2進(jìn)棧進(jìn)棧(17) lod (17) lod 0 0 4 4 將變量將變量c c的值取至棧頂?shù)闹等≈翖m?18) opr 0 4 (1

15、8) opr 0 4 次棧頂與棧頂相乘次棧頂與棧頂相乘(2(2* *c)c)(19) opr 0 14 (19) opr 0 14 棧頂值輸出至屏幕棧頂值輸出至屏幕(20) opr 0 15 (20) opr 0 15 換行換行(21) opr 0 16 (21) opr 0 16 從命令行讀取值到棧頂從命令行讀取值到棧頂(22) sto (22) sto 0 0 3 3 棧頂值送變量棧頂值送變量b b中中(23) jmp 0 11 (23) jmp 0 11 無條件轉(zhuǎn)到循環(huán)入口無條件轉(zhuǎn)到循環(huán)入口(11)(11)(24) opr 0 0 (24) opr 0 0 結(jié)束退棧結(jié)束退棧 PL/0PL

16、/0編譯程序的結(jié)構(gòu)編譯程序的結(jié)構(gòu)詞法分析程詞法分析程序序語法語義分析程序語法語義分析程序代碼生成程序代碼生成程序表格管理程序表格管理程序出錯處理程序出錯處理程序PL/0PL/0源程序源程序目標(biāo)程序目標(biāo)程序PL/0PL/0編譯程序的總體設(shè)計編譯程序的總體設(shè)計z 其編譯過程采用其編譯過程采用一趟掃描方式一趟掃描方式z 以語法以語法、語義分析語義分析程序程序?yàn)楹诵臑楹诵?詞法分析詞法分析程序和程序和代碼生成代碼生成程序都作為一個程序都作為一個過程過程,當(dāng)語法,當(dāng)語法分析需要讀單詞時就調(diào)用詞法分析程序,而當(dāng)語法分析需要讀單詞時就調(diào)用詞法分析程序,而當(dāng)語法、語語義分析正確,需要生成相應(yīng)的目標(biāo)代碼時,則調(diào)

17、用代碼義分析正確,需要生成相應(yīng)的目標(biāo)代碼時,則調(diào)用代碼生成程序。生成程序。z 表格管理表格管理程序?qū)崿F(xiàn)程序?qū)崿F(xiàn)變量變量,常量常量和和過程過程標(biāo)識符的標(biāo)識符的信息的登信息的登錄與查找錄與查找。z 出錯處理出錯處理程序,對詞法和語法程序,對詞法和語法、語義分析遇到的錯誤給語義分析遇到的錯誤給出在源程序中出在源程序中出錯的位置出錯的位置和與和與錯誤錯誤 性質(zhì)有關(guān)性質(zhì)有關(guān)的編號,并的編號,并進(jìn)行錯誤恢復(fù)。進(jìn)行錯誤恢復(fù)。 PL/0PL/0編譯程序詞法分析的設(shè)計與實(shí)現(xiàn)編譯程序詞法分析的設(shè)計與實(shí)現(xiàn)識別的單詞:識別的單詞:y保留字或關(guān)鍵字:如:保留字或關(guān)鍵字:如:BEGINBEGIN、 ENDEND、 IFI

18、F、 THENTHEN等等y運(yùn)算符運(yùn)算符: 如:如:+ +、- -、* *、/ /、:、:= =、# #、=、=等等y標(biāo)識符標(biāo)識符: 用戶定義的變量名、常數(shù)名、過程名用戶定義的變量名、常數(shù)名、過程名y常數(shù)常數(shù): 如:如:1010、2525、100100等整數(shù)等整數(shù)y界符界符: 如:如:,、. . 、; ; 、( ( 、)等等詞法分析過程詞法分析過程GETSYMGETSYM所要完成的任務(wù):所要完成的任務(wù):y讀源程序(讀源程序(getch)getch)y濾空格濾空格y識別識別保留字保留字y識別標(biāo)識符識別標(biāo)識符y拼數(shù)拼數(shù)y識別單字符單詞識別單字符單詞y拼雙字符單詞拼雙字符單詞z 詞法分析過程詞法分析

19、過程:GETSYM:GETSYM框圖(見教材圖框圖(見教材圖2.52.5)z 程序(程序( procedure getsymprocedure getsym)當(dāng)識別到標(biāo)識符時先查當(dāng)識別到標(biāo)識符時先查保留字保留字表表z 保留字保留字表:(表:( begin (begin (* * main main * * ) ) )word1:=word1:=begin begin ;word2:=word2:=callcall ; .word13:=word13:=writewrite ;查到時找到相應(yīng)的查到時找到相應(yīng)的內(nèi)部表示內(nèi)部表示W(wǎng)sym1:=beginsym; wsym2:=callsym; wsy

20、m13:=writesym;z 字符對應(yīng)的字符對應(yīng)的單詞表:單詞表:ssym+:=ssym+:=plusplus; ssym-:=; ssym-:=minusminus; ; ssym;:=ssym;:=semicolonsemicolon; ;z 詞法分析如何把單詞傳遞給語法分析詞法分析如何把單詞傳遞給語法分析 type symbol=(type symbol=(nulnul, ,identident, ,numbernumber, ,plusplus,varsymvarsym, ,procsymprocsym) );3 3個個全程量全程量 symsym:symbol;:symbol;idi

21、d:alfa;:alfa;numnum:integer;:integer;通過三個通過三個全程量全程量 SYMSYM 、IDID和和NUMNUM 將識別出的單詞信息將識別出的單詞信息傳遞傳遞給給語法語法分析分析程序。程序。ySYMSYM:存放單詞的類別:存放單詞的類別 如:有程序段落為:如:有程序段落為: begin initial := 60begin initial := 60;endend 對應(yīng)單詞翻譯后變?yōu)椋簩?yīng)單詞翻譯后變?yōu)椋?begin begin beginsymbeginsym, initial , initial identident, ,:= := becomesbecom

22、es, 60 , 60 numbernumber, , ; semicolonsemicolon,end end endsymendsym 。yIDID: 存放用戶所定義的標(biāo)識符的值存放用戶所定義的標(biāo)識符的值 如:如: initial initial (在(在SYMSYM中放中放identident,在,在IDID中放中放initialinitial)yNUMNUM:存放用戶定義的數(shù):存放用戶定義的數(shù) 如:如:60 60 y(在(在SYMSYM中放在中放在numbernumber在在NUMNUM中放中放6060)使用狀態(tài)轉(zhuǎn)換圖實(shí)現(xiàn)詞法分析程序的設(shè)計方法使用狀態(tài)轉(zhuǎn)換圖實(shí)現(xiàn)詞法分析程序的設(shè)計方法詞

23、法分析程序的設(shè)計詞法分析程序的設(shè)計-使用狀態(tài)轉(zhuǎn)換圖實(shí)現(xiàn)使用狀態(tài)轉(zhuǎn)換圖實(shí)現(xiàn)表示表示狀態(tài)狀態(tài),對應(yīng)每個狀態(tài)編一段程序,對應(yīng)每個狀態(tài)編一段程序,每個狀態(tài)每個狀態(tài)調(diào)用調(diào)用取字符取字符程序,根據(jù)當(dāng)前字程序,根據(jù)當(dāng)前字符符轉(zhuǎn)到不同的狀態(tài),并做相應(yīng)操作。轉(zhuǎn)到不同的狀態(tài),并做相應(yīng)操作。表示表示終態(tài)終態(tài),已,已識別出一個識別出一個單詞單詞。1 12 23 35 514141313121210109 97 78 86 64 41111空格空格字母字母字母數(shù)字字母數(shù)字非字母數(shù)字非字母數(shù)字?jǐn)?shù)字?jǐn)?shù)字?jǐn)?shù)字?jǐn)?shù)字非數(shù)字非數(shù)字:= = = =非非= =, + - ( PL/0PL/0編譯程序語法語義分析編譯程序語法語義分析 P

24、L/0PL/0編譯程序語法分析的設(shè)計與實(shí)現(xiàn)編譯程序語法分析的設(shè)計與實(shí)現(xiàn)自頂向下自頂向下的語法分析的語法分析遞歸子程遞歸子程序法序法 程序程序分程序分程序.constidentnumbervaridentprocedureident分程序分程序語句語句分程序分程序identreadend語句語句表達(dá)式表達(dá)式:=begin語句語句語句語句)(ident, 自頂向下的語法分析自頂向下的語法分析VAR A;VAR A;BEGINBEGIN READ(A) READ(A)END.END. . . VARVAR ; A A BEGINBEGIN ENDEND READREAD ( ) A A 為文法的為文

25、法的開始符號開始符號,以開,以開始符號作為根結(jié)始符號作為根結(jié)點(diǎn)構(gòu)造一棵倒掛點(diǎn)構(gòu)造一棵倒掛著的語法樹。著的語法樹。遞歸子程序法遞歸子程序法z遞歸子程序法遞歸子程序法:對應(yīng)對應(yīng)每個非終結(jié)符每個非終結(jié)符語法單元,編一個獨(dú)語法單元,編一個獨(dú)立的處理過程(或子程序)。語法分析從讀入第一個單詞立的處理過程(或子程序)。語法分析從讀入第一個單詞開始,由非終結(jié)符開始,由非終結(jié)符 (即開始符)出發(fā),沿語法描述即開始符)出發(fā),沿語法描述圖圖箭頭箭頭所指出的方向進(jìn)行分析。當(dāng)遇到非終結(jié)符時,則所指出的方向進(jìn)行分析。當(dāng)遇到非終結(jié)符時,則調(diào)調(diào)用用相應(yīng)的相應(yīng)的處理過程處理過程,從語法描述圖看,也就進(jìn)入了一個語,從語法描述圖

26、看,也就進(jìn)入了一個語法單元,再沿當(dāng)前所進(jìn)入的語法單元所指箭頭方向繼續(xù)進(jìn)法單元,再沿當(dāng)前所進(jìn)入的語法單元所指箭頭方向繼續(xù)進(jìn)行分析。當(dāng)遇到描述圖中是行分析。當(dāng)遇到描述圖中是終結(jié)符終結(jié)符時,則判斷當(dāng)前讀入的時,則判斷當(dāng)前讀入的單詞是否與圖中的終結(jié)符單詞是否與圖中的終結(jié)符相匹配相匹配,若匹配,再讀取下一個,若匹配,再讀取下一個單詞繼續(xù)分析。遇到單詞繼續(xù)分析。遇到分支點(diǎn)分支點(diǎn)時,將當(dāng)前的單詞與分支點(diǎn)上時,將當(dāng)前的單詞與分支點(diǎn)上多個終結(jié)符多個終結(jié)符逐個相比較逐個相比較,若都不匹配時可能是進(jìn)入下一個,若都不匹配時可能是進(jìn)入下一個非終結(jié)符語法單位或是出錯。非終結(jié)符語法單位或是出錯。例:如何用遞歸子程序法實(shí)現(xiàn)表

27、達(dá)式的語法分析例:如何用遞歸子程序法實(shí)現(xiàn)表達(dá)式的語法分析項(xiàng)項(xiàng)表達(dá)式表達(dá)式+-項(xiàng)項(xiàng)+-項(xiàng)項(xiàng) 因子因子 因子因子 */語法圖語法圖因子的語法圖因子的語法圖因子因子identnumber(表達(dá)式表達(dá)式)z 表達(dá)式的表達(dá)式的EBNF表達(dá)式表達(dá)式=+|-+|-項(xiàng)項(xiàng) (+|-+|-)項(xiàng))項(xiàng) 項(xiàng)項(xiàng)=因子因子 (* *|/|/)因子)因子 因子因子=標(biāo)識符標(biāo)識符| |無符號整數(shù)無符號整數(shù)|(表達(dá)式表達(dá)式)z 表達(dá)式表達(dá)式的的遞歸子程序遞歸子程序?qū)崿F(xiàn)實(shí)現(xiàn)procedure procedure exprexpr; ;beginbegin if sym in if sym in plusplus, , minusm

28、inus then then begin begin getsym; getsym; termterm; ; end end else else termterm; ; while sym in while sym in plusplus, , minusminus do do begin begin getsym; getsym; termterm; ; end endend;end; z z項(xiàng)項(xiàng)的的遞歸子程序遞歸子程序?qū)崿F(xiàn)實(shí)現(xiàn)procedure procedure termterm; ;beginbegin factorfactor; ; while sym in while sym in

29、 timestimes, , slashslash do do begin begin getsym; getsym; factorfactor; ; end endend;end;z 因子因子的的遞歸子程序遞歸子程序?qū)崿F(xiàn)實(shí)現(xiàn)procedure procedure factorfactor; ;begin begin if sym if sym identident then then begin begin if sym if sym numbernumber then then begin begin if sym = if sym = ( ( then then begin begin

30、getsym;getsym; exprexpr; ; if sym = if sym = ) ) then then getsym getsym else error else error end end else error else error end end end end end; end; = beginbegin(* *mainmain* *) )(* *initializeinitialize* *) ) ( (* *r/w file setr/w file set* *) ) getsym; getsym; block( ); block( ); if sym period t

31、hen error. if sym period then error.end.end.。 程序程序 pl0分程序分程序 block語句語句 statement條件條件 condition表達(dá)式表達(dá)式expression項(xiàng)項(xiàng) term因子因子 factor語語法法調(diào)調(diào)用用關(guān)關(guān)系系圖圖編譯程序總體流程圖編譯程序總體流程圖啟動啟動置初值置初值調(diào)用G E TSYM取 單 詞調(diào)用G E TSYM取 單 詞調(diào)用B L OCK過 程調(diào)用B L OCK過 程當(dāng)前單詞當(dāng)前單詞是否為源程序結(jié)束符是否為源程序結(jié)束符.?.?出錯出錯源程序中源程序中是否有錯誤?是否有錯誤?調(diào)用解釋過程I N T E R P RET調(diào)

32、用解釋過程I N T E R P RET解釋執(zhí)行目標(biāo)程序解釋執(zhí)行目標(biāo)程序打印錯誤打印錯誤結(jié)束結(jié)束N NY YY YN N PL/0PL/0編譯程序語義分析的設(shè)計與實(shí)現(xiàn)編譯程序語義分析的設(shè)計與實(shí)現(xiàn) PL/0PL/0編譯程序語法、語義分析的的核心編譯程序語法、語義分析的的核心程序是程序是BLOCKBLOCK過程過程, z 說明部分的分析說明部分的分析與處理與處理z 表格管理表格管理z 過程體過程體( (語句)的分析語句)的分析與處理與處理說明部分的分析說明部分的分析與處理與處理對每個過程(含主程序)對每個過程(含主程序)說明的對象說明的對象(變量變量,常量常量和和過程過程)造造符號表符號表 登錄登

33、錄標(biāo)識符的標(biāo)識符的屬性屬性。 標(biāo)識符的屬性標(biāo)識符的屬性: :種類,所在種類,所在層次層次, ,值值和分配的和分配的相對位置相對位置。 登錄信息由登錄信息由ENTERENTER過程完成。過程完成。說明部分的分析說明部分的分析與處理與處理(程程序)序)z 說明種類的定義: object= (constant, variable,procedur) (定義定義純量純量/ /枚舉枚舉類型)類型)z 符號表的定義 table:array0.txmax of record name:alfa; case kind:object of constant:(val:integer); variable:pro

34、cedur:(level,adr,size: integer); N NA AM ME E:A A N NA AM ME E:B B N NA AM ME E:C C N NA AM ME E:D D N NA AM ME E:E E N NA AM ME E:P P K KI IN ND D:C CO ON NS ST TA AN NT T K KI IN ND D:C CO ON NS ST TA AN NT T K KI IN ND D:V VA AR RI IA AB BL LE E K KI IN ND D:V VA AR RI IA AB BL LE E K KI IN ND D:

35、V VA AR RI IA AB BL LE E K KI IN ND D:P PR RO OC CE ED DU UR R V VA AL L:3 35 5 V VA AL L:4 49 9 L LE EV VE EL L:L LE EV V L LE EV VE EL L:L LE EV V L LE EV VE EL L:L LE EV V L LE EV VE EL L:L LE EV V A AD DR R:D DX X A AD DR R:D DX X+ +1 1 A AD DR R:D DX X+ +2 2 A AD DR R: S SI IZ ZE E:4 4 N NA AM

36、ME E:G G K KI IN ND D:V VA AR RI IA AB BL LE E L LE EV VE EL L:L LE EV V+ +1 1 A AD DR R:D DX X 例程序說明部分為:例程序說明部分為:CONST A=35CONST A=35,B=49B=49; VAR CVAR C,D D,E E; PROCEDURE PPROCEDURE P; VAR G VAR G ; 符號表符號表 名字名字 種類種類 層次層次/值值 地址地址 存儲空間存儲空間對應(yīng)名字表對應(yīng)名字表ztxtx :tabletable表的下標(biāo)指針表的下標(biāo)指針, ,是以是以值參數(shù)值參數(shù)形式使用形式使

37、用的。的。zdx: 計算每個變量在運(yùn)行棧中相對本計算每個變量在運(yùn)行棧中相對本過程過程基地址基地址的偏移量的偏移量 ,放在放在table表中的表中的adr域,域,生成生成目標(biāo)目標(biāo)代碼代碼時再放在時再放在codecode中的中的a域域變量定義語句的處理變量定義語句的處理語法:語法:: := varvar , ;程序:程序: if sym=if sym=varsymvarsym then then begin begin getsym; getsym; repeat repeat vardeclarationvardeclaration;(;(* *變量說明處理變量說明處理*) while sym=

38、while sym=commacomma do do begin begin getsym; getsym; vardeclarationvardeclaration end; end; if sym= if sym=semicolonsemicolon then then getsym getsym else error(5) else error(5) until sym until symidentident; ; end; end;變量說明處理變量說明處理z p r o c e d u r e p r o c e d u r e v a r d e c l a r a t i o n

39、;v a r d e c l a r a t i o n ; beginbegin if sym= if sym=identidentthenthen begin begin e n tere n ter( (variablevariable);); getsym getsym end end else else error(4) error(4) end( end(* *vardeclarationvardeclaration* *););過程過程ENTERENTER的實(shí)現(xiàn)的實(shí)現(xiàn)ztxtx :tabletable表的指針表的指針z procedure procedure enterenter

40、( (k k:object );:object ); begin ( begin (* * enter object into table enter object into table * *) ) tx:=tx+1; tx:=tx+1; with tabletx do with tabletx do ( (* * 開域開域語句語句 * *) beginbegin namename:=:=idid;(;(* * 表示表示name:=:=idid; ;* *) kindkind:=:=k k;(;(* * 表示表示tabletx.tabletx.kind

41、kind:=:=k k; ;* * ) )過程過程ENTERENTER的實(shí)現(xiàn)的實(shí)現(xiàn) casecase k k of of constantconstant: : begin begin if if numnumamax thenamax then begin begin error(31); error(31); numnum:=0;:=0; end; end; valval:=:=numnum;(;(* * tabletx.tabletx.valval:=:=numnum; ;* *) ) end; end;過程過程ENTERENTER的實(shí)現(xiàn)的實(shí)現(xiàn) variablevariable: : b

42、egin begin levellevel:=:=levlev; ; (* *表示表示tabletx.tabletx.levellevel:=:=levlev* *) adradr:=:=dxdx; ; (* *表示表示tabletx.tabletx.adradr:=:=dxdx* *) dx:=dx+1;dx:=dx+1; end; end; procedurprocedur: : levellevel:=:=levlev ( (* * 表示表示tabletx.tabletx.levellevel:=:=levlev; ;* *) end(end(* * casecase * *); );

43、endendend(end(* *enterenter* *););過程體的處理過程體的處理y對對語句進(jìn)行語句進(jìn)行語法語法分析分析y語義分析語義分析 當(dāng)遇到當(dāng)遇到標(biāo)識符的引用時標(biāo)識符的引用時就調(diào)用就調(diào)用POSITIONPOSITION函數(shù)函數(shù)查查TABLETABLE表表,看是否,看是否有有過過正確定義正確定義,若已有,則從表中,若已有,則從表中取相應(yīng)取相應(yīng)的有關(guān)的有關(guān)信息信息,供代碼的生成使用。,供代碼的生成使用。若無定義則錯若無定義則錯。y當(dāng)當(dāng)語法語義正確時語法語義正確時,就,就生成生成相應(yīng)語句功能的相應(yīng)語句功能的目標(biāo)代碼目標(biāo)代碼賦值賦值語句的語句的處理處理 if sym = ident t

44、henif sym = ident then begin begin i:= position(id); i:= position(id); if i= 0 then error(11) if i= 0 then error(11) else if tablei.kind variable else if tablei.kind variable then then begin error(12); begin error(12); i:= 0 i:= 0 end; end; getsym;getsym; if sym = becomes then getsym if sym = become

45、s then getsym else error(13); else error(13); expression(fsys); expression(fsys); if i 0 then if i 0 then with table i do gen(sto,lev-level,adr) with table i do gen(sto,lev-level,adr) end end 代碼生成代碼生成z代碼生成是由過程代碼生成是由過程GENGEN完成。完成。zGENGEN有有3 3個個參數(shù)參數(shù),分別代表目標(biāo)代碼的,分別代表目標(biāo)代碼的功能碼功能碼,層差層差和和位移量位移量。例如。例如 gen(opr

46、,0,16); gen(opr,0,16); gen(sto, gen(sto,levlev- -levellevel,adr),adr) levlev:當(dāng)前:當(dāng)前處理的處理的過程過程層次層次 levellevel:被引用變量或過程所在:被引用變量或過程所在層次層次CXCX:為目標(biāo)代碼:為目標(biāo)代碼codecode數(shù)組的下標(biāo)指針數(shù)組的下標(biāo)指針結(jié)構(gòu)變換, 地址返填zIf c then s getsym;z condition;z if sym=thensymz then getsymz else error(16);z cx1:= cx;z gen(jpc,0,0)z statement( );z

47、 codecx1.a:=cx PL/0 PL/0編譯程序錯誤處理的實(shí)現(xiàn)編譯程序錯誤處理的實(shí)現(xiàn) 對語法錯誤的兩種處理方法:對語法錯誤的兩種處理方法:(1) (1) 對于對于易于校正易于校正的錯誤,如丟了逗號,分的錯誤,如丟了逗號,分號等,指出出錯位置,號等,指出出錯位置,加以校正加以校正,繼續(xù)進(jìn)行,繼續(xù)進(jìn)行分析。分析。(2) (2) 對于對于難于校正難于校正的錯誤,給出錯誤的位置的錯誤,給出錯誤的位置與性質(zhì),與性質(zhì),跳過后面的一些單詞跳過后面的一些單詞,直到下一個直到下一個可以進(jìn)行正常語法分析的語法單位??梢赃M(jìn)行正常語法分析的語法單位。 z在在進(jìn)入進(jìn)入某個某個語法單位語法單位時,調(diào)用時,調(diào)用TE

48、STTEST, ,檢查當(dāng)前符號檢查當(dāng)前符號是否屬于該是否屬于該語法單位的開始符號集合語法單位的開始符號集合。若不屬于,。若不屬于,則則濾去濾去開始開始符號符號和和后繼后繼符號符號集合外集合外的所有符號。的所有符號。z在在語法單位語法單位分析結(jié)束分析結(jié)束時,調(diào)用時,調(diào)用TESTTEST, ,檢查當(dāng)前符號檢查當(dāng)前符號是否屬于調(diào)用該語法單位時應(yīng)有的是否屬于調(diào)用該語法單位時應(yīng)有的后繼后繼符號集合。符號集合。若不屬于,則若不屬于,則濾去濾去后繼后繼符號和符號和開始開始符號符號集合外集合外的的所有符號所有符號。 TEST TEST TEST TEST開始符號集合與后繼符號集合開始符號集合與后繼符號集合非終

49、結(jié)符名非終結(jié)符名開始符號集合開始符號集合后繼符號集合后繼符號集合分程序分程序const const var procedurevar procedureident if call beginident if call beginwhile read writewhile read write. ;. ;語句語句ident call beginident call beginif while read writeif while read write. ; . ; endend條件條件odd + - (odd + - (ident numberident numberThen doThen do

50、表達(dá)式表達(dá)式+ - (+ - (ident numberident number. ; ) . ; ) ropropend then doend then do項(xiàng)項(xiàng)ident number (ident number (. ; ) . ; ) rop + -rop + -end then doend then do因子因子ident number (ident number (. ; ) . ; ) rop + -rop + -* / end then do* / end then doz開始符號開始符號集合集合 symset=set of symbol;declbegsys, statbeg

51、sys, facbegsys:symset;z開始符號集合(開始符號集合(* *主程序主程序* *)declbegsys:=constsym,varsym,procsym; statbegsys:=beginsym,callsym,ifsym, whilesym,readsym,writesym; facbegsys:=ident,number,lparen; z后繼符后繼符號集合號集合fsys作為參數(shù):作為參數(shù):procedure test(s1,s2:symset; n:integer);procedure block(lev,tx:integer; fsys:symset); proce

52、dure statement(fsys:symset);procedure expression (fsys:symset);procedure term (fsys:symset);procedure factor (fsys:symset);READREAD語句的語法語義分析處理語句的語法語義分析處理 if sym=if sym=readsymreadsym then then begin begin getsym; getsym; if sym if symlparenlparen then error(34) then error(34) else else repeatrepeat

53、getsym; getsym; READREAD語句的語法語義分析處理語句的語法語義分析處理 if sym= if sym=identident then i:= then i:=positionposition(id)(id) else i:=0; else i:=0; if i=0 then error(35) if i=0 then error(35) else else with tablei dowith tablei do beginbegin gen(opr,0,16); gen(opr,0,16); gen(sto,lev- gen(sto,lev-levellevel, ,a

54、dradr) ) endend; ;READREAD語句的語法語義分析處理語句的語法語義分析處理 getsym getsym untiluntil sym symcommacomma; ; if sym if symrparenrparen then then begin begin error(33); error(33); while not(sym in while not(sym in fsysfsys) ) do getsym do getsym end end else getsym else getsym end end出錯處理出錯處理跳過不應(yīng)出現(xiàn)跳過不應(yīng)出現(xiàn)的符號的符號正確正確

55、出出口口TESTSYM在在S1中中?打印出錯編號打印出錯編號nS1:=S1+S2SYM在在S1中中?GETSYM返回返回YYNNTEST測試過程流程圖測試過程流程圖 因子的處理過程因子的處理過程z例:因子的處理過程例:因子的處理過程 procedure factor(fsys:symset); var i:integer; begin 入口:入口: test(facbegsys,fsys,24); while sym in facbegsys do begin if . 出口:出口: test(fsys,facbegsys,23); end end; 因子的處理過程因子的處理過程Facbegs

56、ysy 處理處理ident number, lparentestntestz增加后跟符增加后跟符與與調(diào)用位置有關(guān)調(diào)用位置有關(guān) 例:調(diào)用例:調(diào)用expression(fsys); z write語句的語句的語法語法write(,); write語句語句(后后調(diào)用調(diào)用expression時時后跟符后跟符 expression(rparen,comma+fsys);zfactor的的語法:語法:factor=.|.|( exp )在在factor(后后調(diào)用調(diào)用expression時時后跟符后跟符 expression(rparen+fsys); 類類pcodepcode代碼解釋器的實(shí)現(xiàn)代碼解釋器的實(shí)

57、現(xiàn)z類類pcode解釋器的結(jié)構(gòu)解釋器的結(jié)構(gòu)z目標(biāo)代碼解釋執(zhí)行時目標(biāo)代碼解釋執(zhí)行時數(shù)據(jù)棧的布局?jǐn)?shù)據(jù)棧的布局(運(yùn)行(運(yùn)行棧的存儲分配)棧的存儲分配)類類pcodepcode解釋器的結(jié)構(gòu)解釋器的結(jié)構(gòu)z目標(biāo)代碼存放在數(shù)組目標(biāo)代碼存放在數(shù)組CODECODE中。中。z解釋程序定義一個一維整型數(shù)組解釋程序定義一個一維整型數(shù)組S S作為作為運(yùn)行棧運(yùn)行棧棧頂寄存器棧頂寄存器(指針)(指針)t t,基址寄存器基址寄存器(指針)(指針)b b,程序地址寄存器程序地址寄存器p p,指令寄存器指令寄存器i i目標(biāo)代碼解釋執(zhí)行時數(shù)據(jù)棧的布局目標(biāo)代碼解釋執(zhí)行時數(shù)據(jù)棧的布局(運(yùn)行棧的存儲分配)(運(yùn)行棧的存儲分配)在每個過程調(diào)

58、用時在棧頂分配在每個過程調(diào)用時在棧頂分配3 3個聯(lián)系單元:個聯(lián)系單元:ySLSL: 靜態(tài)鏈靜態(tài)鏈,指向,指向定義定義該過程的該過程的直接外過程直接外過程 (或主程序)運(yùn)行時(或主程序)運(yùn)行時最新最新數(shù)據(jù)段的基地址數(shù)據(jù)段的基地址。yDLDL: 動態(tài)鏈動態(tài)鏈,指向,指向調(diào)用調(diào)用該過程前正在運(yùn)行過該過程前正在運(yùn)行過 程的數(shù)據(jù)段基地址。程的數(shù)據(jù)段基地址。yRARA: 返回地址返回地址,記錄調(diào)用該過程時,記錄調(diào)用該過程時目標(biāo)程序目標(biāo)程序的的斷點(diǎn)斷點(diǎn),即調(diào)用過程指令的下一條指令的地址。,即調(diào)用過程指令的下一條指令的地址。 目標(biāo)代碼的解釋執(zhí)行目標(biāo)代碼的解釋執(zhí)行 運(yùn)行棧運(yùn)行棧S SzM M調(diào)用過程調(diào)用過程Q

59、Q RA RA DL DL SL SLb. ttbQM目標(biāo)代碼的解釋執(zhí)行目標(biāo)代碼的解釋執(zhí)行幾條幾條特殊指令特殊指令在在code中的中的位置位置和和功能功能yINT 0 AINT 0 A在在過程過程目標(biāo)程序的目標(biāo)程序的入口處入口處,開辟開辟A A個單元的數(shù)據(jù)段。個單元的數(shù)據(jù)段。A A為為局部變量局部變量的的個數(shù)個數(shù)+ +3 3。yOPR 0 0OPR 0 0在在過程過程目標(biāo)程序的目標(biāo)程序的出口處出口處,釋放數(shù)據(jù)段釋放數(shù)據(jù)段(退棧),(退棧),恢復(fù)調(diào)用恢復(fù)調(diào)用該過程該過程前前正在運(yùn)行的過程正在運(yùn)行的過程的數(shù)據(jù)段的數(shù)據(jù)段基址寄基址寄存器存器B B和和棧頂寄存器棧頂寄存器T T的值,并將的值,并將返回

60、地址返回地址送送到指令到指令地址寄存器地址寄存器P P中,以使調(diào)用前的程序從中,以使調(diào)用前的程序從斷點(diǎn)斷點(diǎn)開始開始繼繼續(xù)執(zhí)行續(xù)執(zhí)行。目標(biāo)代碼的解釋執(zhí)行目標(biāo)代碼的解釋執(zhí)行幾條幾條特殊特殊指令在指令在code中的中的位置位置和和功能功能yCAL L ACAL L A調(diào)用過程調(diào)用過程,還完成,還完成填寫填寫靜態(tài)鏈靜態(tài)鏈、動態(tài)鏈動態(tài)鏈、返回返回地址地址,給出,給出被調(diào)被調(diào)用用過程過程的的基地址基地址值,值,送送入基址入基址寄存器寄存器B B中,目標(biāo)程序的中,目標(biāo)程序的入口入口地址地址A A的值的值送送指令指令地址寄存器地址寄存器P P中,使指令從中,使指令從A A開始執(zhí)行。開始執(zhí)行。 附附 PL/0P

溫馨提示

  • 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

提交評論