




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第二章第二章 PL/0PL/0編譯程序的實現(xiàn)編譯程序的實現(xiàn)本章以本章以PL/0PL/0編譯程序編譯程序為實例為實例, , 使大家對編譯程序的實現(xiàn)建立起整體概念,對編譯程序的構造得到一些感性認識和初步了解。1 PL/0PL/0語言語言2 PL/0PL/0處理機處理機假想棧式機假想棧式機3 PL/0PL/0編譯程序編譯程序4 4 符號表的一般形式討論符號表的一般形式討論5 5 棧式存儲管理的再討論棧式存儲管理的再討論1 PL/0PL/0語言語言PL/0PL/0功能簡單、結構清晰、可讀性強,而又具備了一功能簡單、結構清晰、可讀性強,而又具備了一般高級語言的必備部分,因而其編譯程序能充分體般高級語言的
2、必備部分,因而其編譯程序能充分體現(xiàn)一個高級語言編譯程序的基本技術和步驟?,F(xiàn)一個高級語言編譯程序的基本技術和步驟。zPL/0PL/0語言:語言:PASCALPASCAL語言的語言的子集,用于教學子集,用于教學zPL/0PL/0程序示例程序示例zPL/0PL/0的的語法描述圖語法描述圖zPL/0PL/0語言語言的的EBNFEBNF表示表示 PL/0PL/0語言是語言是PASCALPASCAL語言的語言的子集子集z 過程可過程可嵌套定義,內層嵌套定義,內層可引用包圍它的外層定義的可引用包圍它的外層定義的標識符標識符, ,可遞歸調用可遞歸調用z 數據類型數據類型, ,只有整型只有整型z 數據結構數據結
3、構 , ,只有簡變和常數只有簡變和常數z 標識符的有效長度是標識符的有效長度是1010z 語句種類:語句種類: begin/endbegin/end、ifif、whilewhile、賦值、賦值、read/writeread/write、callcall、constconst、varvar、procedureprocedurez 過程無參,最多可過程無參,最多可嵌套嵌套三層三層z 1313個保留字:個保留字:ifif、thenthen、whilewhile、dodo、readread、writewrite、callcall、beginbegin、endend、constconst、varvar、
4、procedureprocedure、oddoddz + +、- -、* *、/ /、= =、 、= 、=、( (、) ) PL/0PL/0程序示例程序示例 CONST A=10; CONST A=10; (* * 常量說明部分常量說明部分 * *) VAR B,C; VAR B,C; (* * 變量變量說明部分說明部分 * *) PROCEDURE PROCEDURE P; P; (* * 過程過程說明部分說明部分 * *) VAR D;VAR D;(* * P P的局部變量的局部變量說明部分說明部分 * *) PROCEDURE PROCEDURE Q; Q; (* * P P的局部過程的
5、局部過程說明部分說明部分 * *) VAR X;VAR X; BEGINBEGIN READ(X); READ(X); D:=X; D:=X; IF X#0 DO CALL P; IF X#0 DO CALL P; END; END; BEGINBEGIN CALL Q; WRITE(D); CALL Q; WRITE(D); END; END; BEGIN CALL P; END.BEGIN CALL P; END.遞歸計算 sum = 1! + 2 ! + . + n! var n, m, fact, sum; 遞規(guī)計算 fact = m! procedure factorial;begi
6、n if m 0 then begin fact := fact * m; m := m - 1; call factorial; end;end;begin 讀入n read(n); sum := 0; while n 0 do begin m := n; fact := 1; call factorial; sum := sum + fact; n := n - 1; end; 輸出n ! write(sum);end.constidentnumber=,;varident,;procedureident;分程序分程序語句語句分程序分程序程序程序分程序分程序.語法圖語法圖identread
7、end;語句語句表達式表達式:=begin語句語句語句語句)(ident,PL/0PL/0語言的語言的EBNFEBNF表示表示z BNFBNF(BACKUS-NAUR FORMBACKUS-NAUR FORM)與與EBNFEBNF的介紹的介紹BNFBNF是根據美國的是根據美國的John W.BackusJohn W.Backus與丹麥的與丹麥的Peter NaurPeter Naur來命名的,它是從來命名的,它是從語法上描述程序設計語言的語法上描述程序設計語言的元語言元語言。采用。采用BNFBNF就可說明哪些符號序列是對就可說明哪些符號序列是對于某給定語言于某給定語言在語法上在語法上有效的程序
8、。有效的程序。z 構成構成EBNFEBNF的元素:非終結符,終結符,開始符,規(guī)則的元素:非終結符,終結符,開始符,規(guī)則z EBNFEBNF的元符號:的元符號: 用左右尖括號括起來的內容為用左右尖括號括起來的內容為非終結符非終結符=或或 讀做讀做定義為定義為,的的左部由左部由右部右部定義定義 | | 讀做讀做或或 表示右部候選內容表示右部候選內容 表示花括號內的內容表示花括號內的內容可重復可重復任意次或限定次數任意次或限定次數 表示方括號內的內容為表示方括號內的內容為任選項任選項 ( ) ( ) 表示圓括號內的內容表示圓括號內的內容優(yōu)先優(yōu)先PL/0PL/0語言文法的語言文法的EBNFEBNF表示
9、表示程序-分程序.分程序-常量說明部分-CONST常量定義部分,常量定義;無符號整數-數字數字變量說明部分-VAR標識符,標識符;標識符-字母字母|數字 B-C-B -先調用,后結束B區(qū)A區(qū)B區(qū)C區(qū)BT 二、運行時數據的存儲與訪問-棧式存儲假設A、C同層,且A中嵌套B子程序的調用、執(zhí)行和返回l 過程被調用時,子程序的每次調用都需在數據棧頂為其分配獨立的數據區(qū)l 子程序返回時,需做兩件事情:一是代碼返回(需記住RA),二是數據區(qū)的同步恢復(DL)l 子程序運行時,要存取外層數據區(qū)中的存儲單元當前B數據區(qū)須記?。?返回地址RA 動態(tài)鏈DL記錄調用者數據區(qū)基地址 靜態(tài)鏈SL記錄定義該過程的直接外層過
10、程數據區(qū)的基地址,以便訪問外層數據運行時數據棧運行時數據棧S S的變化的變化 varvar m1,m2,m3; m1,m2,m3; Procedure A; Procedure A; var var a1; a1; procedure B; procedure B; var var b1,b2; b1,b2; procedure C; procedure C; C C過程過程call B;call B; r1r1: : B B過程過程call C; call C; r2:r2: A A過程過程call B; call B; r3:r3: 主程序主程序Call A; Call A; r4:r4:
11、 B的臨時單元 b2=120 b1=50 RA: r1 DL:115 SL:106 RA: r2 DL:110 SL:110 b2=25 b1=20 RA: r3 DL:106 SL:106 a1=15 RA: r4 DL:100 SL:100 m3=118 m2=472 m1=335 RA:0 DL:0 T B SL:0 100 三、PL/0機的指令系統(tǒng) f: 功能碼l: 層次差 (標識符引用層減去定義層)a:根據不同的指令有所區(qū)別f l af l a指令格式:指令格式:所有運算對棧頂的兩個或一個元素進行,并用運算結果代替原來的運算對象。指指令令功功能能表表( 0) jmp 0 8 轉向轉向
12、主程序入口主程序入口( 1) jmp 0 2 轉向轉向過程過程p入口入口( 2) int 0 3 為過程為過程p開辟空間開辟空間( 3) lod 1 3( 4) lit 0 10( 5) opr 0 2( 6) sto 1 4( 7) opr 0 0 退棧并返回調用點退棧并返回調用點( 8) int 0 5( 9) opr 0 16 (10) sto 0 3(11) lod 0 3(12) lit 0 0(13) opr 0 9(14) jpc 0 24 條件不滿足轉條件不滿足轉24(15) cal 0 2 (16) lit 0 2(17) lod 0 4(18) opr 0 4(19) op
13、r 0 14(20) opr 0 15 換行換行(21) opr 0 16(22) sto 0 3(23) jmp 0 11(24) opr 0 0 SL 0DL 0RA 0變量變量b變量變量cRA 16SL 0DL 0運行棧運行棧c o n s t a = 1 0 ;v a r b , c ;p r o c e d u r e p ; begin c : = b + a ; end;begin r e a d ( b ) ; while b#0 do begin c a l l p ; w r i t e ( 2 * c ) ; r e a d ( b ) ; endend.SL:靜態(tài)鏈:靜
14、態(tài)鏈DL:動態(tài)鏈:動態(tài)鏈RA:返回地址:返回地址0演示執(zhí)行過程3 PL/0PL/0編譯程序的實現(xiàn)編譯程序的實現(xiàn)zPL/0PL/0編譯程序的總體設計編譯程序的總體設計zPL/0PL/0編譯程序詞法分析的設計與實現(xiàn)編譯程序詞法分析的設計與實現(xiàn)zPL/0PL/0編譯程序語法分析的設計與實現(xiàn)編譯程序語法分析的設計與實現(xiàn)zPL/0PL/0編譯程序語義分析的設計與實現(xiàn)編譯程序語義分析的設計與實現(xiàn)zPL/0PL/0編譯程序語法錯誤處理的實現(xiàn)編譯程序語法錯誤處理的實現(xiàn)zPL/0PL/0編譯程序代碼生成的實現(xiàn)編譯程序代碼生成的實現(xiàn)zpcodepcode代碼解釋器的設計與實現(xiàn)代碼解釋器的設計與實現(xiàn)3.1 PL/0
15、3.1 PL/0編譯程序的總體設計編譯程序的總體設計z 單趟方式z 以語法、語義分析程序為核心,詞法分析程序和代碼生成程序都作為一個過程,當語法分析需要讀單詞時就調用詞法分析程序,而當語法、語義分析正確,需要生成相應的目標代碼時,則調用代碼生成程序。z 表格管理程序實現(xiàn)變量,常量和過程標識符的信息的登錄與查找。z 出錯處理程序,對詞法和語法、語義分析遇到的錯誤給出在源程序中出錯的位置和與錯誤 性質有關的編號,并進行錯誤恢復。PL/0PL/0編譯程序編譯程序PL/0PL/0編譯程序編譯程序類類 p pcodecode解釋解釋程序程序類類 pcode代碼代碼PL/0源程序源程序輸入數據輸入數據輸出
16、數據輸出數據PL/0編譯程序的結構框架 PL/0PL/0編譯程序的結構編譯程序的結構詞法分析程詞法分析程序序語法語義分析程序語法語義分析程序代碼生成程序代碼生成程序表格管理程序表格管理程序出錯處理程序出錯處理程序PL/0PL/0源程序源程序目標程序目標程序編譯系統(tǒng)總體流程圖編譯系統(tǒng)總體流程圖PL/0編譯程序語法、語義分析的核心3.2 PL/0編譯程序詞法分析的實現(xiàn)詞法分析函數詞法分析函數getsymgetsym()()所識別的單詞:所識別的單詞:y保留字或關鍵字:如:保留字或關鍵字:如:BEGINBEGIN、 ENDEND、 IFIF、 THENTHEN等等y運算符運算符: 如:如:+ +、-
17、 -、* *、/ /、:、:= =、# #、=、=等等y標識符標識符: 用戶定義的變量名、常數名、過程名用戶定義的變量名、常數名、過程名y常數常數: 如:如:1010、2525、100100等整數等整數y界符界符: 如:如:,、. . 、; ; 、( ( 、)等等詞法分析過程詞法分析過程: :getsymgetsym()()框圖(框圖(P19P19圖圖2.52.5)在編譯程序中,單詞的表示方式在編譯程序中,單詞的表示方式:(:(sym, id/numsym, id/num)z enumenum symbol symbol nulnul, ,identident, ,numbernumber,
18、,plusplus, , ,varsymvarsym, ,procsymprocsym ;z 當識別出標識符時先查當識別出標識符時先查保留字保留字表表z 保留保留字及內部表示對應表字及內部表示對應表: char wordnorwalchar wordnorwal; ; enum symble wsymnorw enum symble wsymnorw;z 字符對應的字符對應的單詞表:單詞表: enum symbleenum symble ssym256; ssym256; ssym ssym+=+=plusplus; ssym; ssym-=-=minusminus; ; z 詞法分析通過三個
19、詞法分析通過三個全程量全程量 symbol symbol symsym; char id; int; char id; int numnum; ;將識別出的單詞信息將識別出的單詞信息傳遞傳遞給給語法分析語法分析程序。程序。ysymsym:存放單詞的類別:存放單詞的類別 如:如:initial:= 60initial:= 60;中各單詞對應的類別為:;中各單詞對應的類別為: initial initial identident, := , := becomesbecomes, 60 , 60 numbernumber, ; , ; semicolonsemicolonyidid:存放用戶標識符:
20、存放用戶標識符, ,對對initialinitial(sym-sym-identident,id-id-initialinitial)ynumnum:存放用戶定義的數:存放用戶定義的數 對對6060(sym-sym-number,number,numnum-6060)用狀態(tài)轉換圖實現(xiàn)詞法分析程序的設計方法用狀態(tài)轉換圖實現(xiàn)詞法分析程序的設計方法狀態(tài)狀態(tài),對應每個狀態(tài)編一段程序,對應每個狀態(tài)編一段程序,每個狀態(tài)每個狀態(tài)調用調用取字符取字符程程序,根據當前字符序,根據當前字符轉到不同的狀態(tài),并做相應操作。轉到不同的狀態(tài),并做相應操作。表示表示終態(tài)終態(tài),已,已識識別出一個別出一個單詞單詞1 12 23
21、 35 514141313121210109 97 78 86 64 41111空格空格字母字母字母數字字母數字非字母數字非字母數字數字數字數字數字非數字非數字:= = = =非非= =, + - ( 3.3 PL/03.3 PL/0編譯程序語法分析編譯程序語法分析z語法分析的設計與實現(xiàn)語法分析的設計與實現(xiàn)y 自頂向下的語法分析自頂向下的語法分析y 遞歸子程序法遞歸子程序法(遞歸下降分析器(遞歸下降分析器recursive-descent parser):對應對應每個非終結符每個非終結符(語法成分),(語法成分),編一個獨立的處理子程序。編一個獨立的處理子程序。 由由 開始,按規(guī)則右部開始,按
22、規(guī)則右部(語法描述圖語法描述圖箭頭箭頭方向方向)進行分析進行分析 遇到遇到非終結符非終結符,則,則調用調用相應的相應的處理過程處理過程 遇到遇到終結符終結符,則判斷當前讀入的單詞是否與該終結符,則判斷當前讀入的單詞是否與該終結符相匹相匹配配,若匹配,再讀取下一個單詞繼續(xù)分析。,若匹配,再讀取下一個單詞繼續(xù)分析。 程序程序 pl/0分程序分程序 block語句語句statement條件條件condition表達式表達式expression 項項term因子因子 factor語語法法調調用用關關系系圖圖VAR A;VAR A;BEGINBEGIN READ(A) READ(A)END.END. .
23、 . VARVAR ; A A BEGINBEGIN ENDEND READREAD ( ) A A 為文法的為文法的開始符號開始符號,以開,以開始符號作為根結始符號作為根結點存在一棵倒掛點存在一棵倒掛著的語法樹。著的語法樹。遞歸下降語法分遞歸下降語法分析過程隱含著對析過程隱含著對對語法樹的前序對語法樹的前序遍歷遍歷表達式表達式=+|-+|-項項 (+|-+|-)項)項 int expression(bool* fsys, int* ptx, int lev)if(sym=plus | sym=minus) getsymdo; termdo(nxtlev, ptx, lev); /處理項 el
24、setermdo(nxtlev, ptx, lev); / 處理項 while (sym=plus | sym=minus)getsymdo; termdo(nxtlev, ptx, lev); / 處理項 return 0;注意一致性:進入每一語法單位處理程序之前,其第一個單詞已讀出,退出時,應讀出下一個語法單位的第一個單詞項項=因子因子 (* *|/|/)因子)因子 int term(bool* fsys, int* ptx, int lev)factordo(nxtlev, ptx, lev); /* 處理因子 */ while(sym=times | sym=slash)getsymd
25、o; factordo(nxtlev, ptx, lev);return 0;因子因子=標識符標識符| |無符號整數無符號整數|(表達式表達式)int factor(bool* fsys, int* ptx, int lev)if(sym = ident)/* 因子為常量或變量 */ getsymdo; else if(sym = number) getsymdo; else if (sym = lparen)/* 因子為表達式 */ getsymdo; expressiondo(nxtlev, ptx, lev); if (sym = rparen) getsymdo; else error
26、(22);/* 缺少右括號 */ return 0;3.4 PL/03.4 PL/0語義分析的設計與實現(xiàn)語義分析的設計與實現(xiàn)z 說明部分的分析說明部分的分析與處理與處理z 表格管理表格管理z 過程體過程體( (語句)的分析語句)的分析與處理與處理說明部分的分析說明部分的分析與處理與處理-登錄符號表登錄符號表z 對每個過程(含主程序)對每個過程(含主程序)說明的對象說明的對象(變量變量,常量常量和和過程過程)造符號表造符號表z 登錄登錄標識符的標識符的屬性屬性。z 標識符的屬性標識符的屬性: :種類,所在種類,所在層次層次, ,值值和分配的和分配的相對位置相對位置。z 登錄信息由登錄信息由ENT
27、ERENTER過程完成。過程完成。符號表結構enum object constant, variable, procedur;struct tablestruct char nameal; enum object kind; int val, level, adr, size; tabletxmax; const a=35;/const a=35;/常量常量無無層次層次varvar a1,a2,a3; a1,a2,a3;Procedure P;Procedure P; var var b1,b2; b1,b2; procedure P1; procedure P1; var var c; c;
28、 procedure P2; procedure P2; var var d; d; 注意:在單趟編譯中,對于并列的函數(或分程序),其相注意:在單趟編譯中,對于并列的函數(或分程序),其相應的符號表不會同時存在。應的符號表不會同時存在。過程過程P2在在code的的入口入口 (0) jmp 0 0 CX (1) jmp 0 0 (2) jmp 0 0 (k) jmp 0 0 名字名字 類類 值值 層次層次 地址地址 大小大小: :=varvar, ;if(symif(sym=varsymvarsym)/)/* * 收到變量聲明符號,開始處理變量聲明收到變量聲明符號,開始處理變量聲明 * */
29、/ getsymdogetsymdo; ; dovardeclarationdo(&txdovardeclarationdo(&tx, lev, &dx);, lev, &dx); while (sym = comma) while (sym = comma) getsymdogetsymdo; ; vardeclarationdo(&tx, lev, &dx); vardeclarationdo(&tx, lev, &dx); if (sym = semicolon) if (sym = semicolon) getsymdog
30、etsymdo; else error(5); else error(5); while (sym = ident); while (sym = ident); 注意:注意:&tx&tx變量說明處理變量說明處理int vardeclaration(intint vardeclaration(int* * ptx,int lev,int ptx,int lev,int* * pdx) pdx)if (sym = if (sym = identident) ) enter(variableenter(variable, ptx, lev, pdx);/, ptx, lev, pdx
31、);/填寫名字表填寫名字表 getsymdo; getsymdo; else else error(4); error(4); / /* * varvar后應是標識后應是標識符符 * */ / return 0; return 0; 過程過程ENTERENTER的實現(xiàn)的實現(xiàn)/ /* * 在名字表中加入一項在名字表中加入一項 * * * * k: k: 名字種類名字種類const,var or procedureconst,var or procedure * * ptx: ptx: 名字表尾指針名字表尾指針 * * lev: lev: 名字所在的層次名字所在的層次, ,以后所有的以后所有的le
32、vlev都是這樣都是這樣 * * pdx: pdx: 當前應分配變量的相對地址,分配后增加當前應分配變量的相對地址,分配后增加1 1 * */ /void enter(enum object k, intvoid enter(enum object k, int* * ptx,intptx,int lev, int lev, int* * pdxpdx) )(* *ptxptx)+;)+; strcpy(tablestrcpy(table(* *ptx).nameptx).name, id); , id); / /* * 全局變量全局變量idid中已存有當前名字的名字中已存有當前名字的名字 *
33、 */ / table( table(* *ptx).kindptx).kind = k; = k; switch (k)switch (k) case constant: case constant: / /* * 常量名字常量名字 * */ / if (num amax) if (num amax) error(31); error(31);/ /* * 數越界數越界 * */ / num = 0; num = 0; table( table(* *ptx).val = num;ptx).val = num; break; break; case variable: case variab
34、le: / /* * 變量名字變量名字 * */ / table( table(* *ptx).levelptx).level = = levlev; ; table( table(* *ptx).adrptx).adr = ( = (* *pdxpdx);); ( (* *pdxpdx)+;)+; break; break; case case procedurprocedur: : / /* *過程名字過程名字* */ / table( table(* *ptx).levelptx).level = = levlev; ; break; break; 過程體的處理過程體的處理變量引用的處理
35、變量引用的處理y對對語句進行語句進行語法語法分析分析y語義分析語義分析 當遇到當遇到標識符的引用時標識符的引用時就調用就調用POSITIONPOSITION函數函數查查TABLETABLE表表,看是否,看是否有有過過正確定義正確定義,若已有,則從表中,若已有,則從表中取相應取相應的有關的有關信息信息,供代碼的生成使用。,供代碼的生成使用。若無定義則錯若無定義則錯。y語義分析語義分析 TABLETABLE表表若已若已有有過過正確定義正確定義,檢查引用與說明的,檢查引用與說明的屬性是否一致,屬性是否一致,若不一致則錯若不一致則錯。y當當語法語義正確時語法語義正確時,就,就生成生成相應語句功能的相應
36、語句功能的目標代碼目標代碼intint position(position(charchar* * id) id) intint i; i; strcpy(, id);strcpy(, id); i = i = txtx + 1; + 1; whilewhile(strcmp((strcmp(, id) != 0);, id) != 0); returnreturn i; i; / position/ position思考:在造表和查表過程中,如何保證每個過程的局部量不被它的外層引用?賦值賦值語句的處理
37、語句的處理if (sym = ident) if (sym = ident) / /* * 準備按照賦值語句處理準備按照賦值語句處理 * */ / i = position(id, i = position(id, * *ptx);ptx); if (i = 0) error(11); if (i = 0) error(11);/ /* * 變量未找到變量未找到 * */ / elseif(tablei.kindelseif(tablei.kind != variable) != variable) error(12); error(12); / /* * 賦值語句格式錯誤賦值語句格式錯誤 *
38、 */ / i = 0; i = 0; else. else. gendo(sto,lev-tablei.level,tablei.adrgendo(sto,lev-tablei.level,tablei.adr);); . . 因子因子=標識符標識符| |無符號整數無符號整數|(表達式表達式)int factor(bool* fsys, int* ptx, int lev) /因子的語義分析if(sym = ident)/* 因子為常量或變量 */i = position(id, *ptx);/* 查找名字 */ if (i = 0) error(11); /* 標識符未聲明 */ else
39、 switch (tablei.kind) case constant:/* 名字為常量 */ break; case variable: /* 名字為變量 */ break; case procedur:/* 名字為過程 */ error(21); /* 不能為過程名 */3.5 編譯程序的錯誤處理錯誤處理的原則:盡可能準確指出出錯位置,錯誤性質,錯誤處理的原則:盡可能準確指出出錯位置,錯誤性質,盡可能進行校正。盡可能進行校正。PL/0PL/0編譯程序對語法錯誤的處理:編譯程序對語法錯誤的處理:(1)(1)對于對于易于校正易于校正的錯誤,如丟了逗號,分號等,指出出的錯誤,如丟了逗號,分號等,
40、指出出錯位置,錯位置,加以校正加以校正,繼續(xù)進行分析。,繼續(xù)進行分析。(2)(2)對于對于難于校正難于校正的錯誤,給出錯誤的位置與性質,的錯誤,給出錯誤的位置與性質,跳過跳過后面的一些單詞后面的一些單詞,直到下一個可以進行正常語法分析的直到下一個可以進行正常語法分析的語法單位語法單位 z 在在進入進入某個某個語法單位語法單位時,時,調用調用TESTTEST, ,檢查當前符號檢查當前符號是否屬于該是否屬于該語法單位的開語法單位的開始符號集合始符號集合。若不屬于,。若不屬于,則則濾去濾去開始開始符號符號和和后跟后跟符符號號集合外集合外的所有符號。的所有符號。z 在在語法單位語法單位分析結束分析結束
41、時,時,調用調用TESTTEST, ,檢查當前符號檢查當前符號是否屬于調用該語法單位是否屬于調用該語法單位時應有的時應有的后跟后跟符號集合。符號集合。若不屬于,則若不屬于,則濾去濾去后跟后跟符符號和號和開始開始符號符號集合外集合外的所的所有符號。有符號。 TEST TEST TEST TESTz 開始符號集合 bool declbegsyssymnum,statbegsyssymnum,facbegsyssymnum; declbegsys: constsym,varsym,procsym; statbegsys: beginsym,callsym,ifsym,whilesym,readsym
42、,writesym; facbegsys: ident,number,lparen;z 后跟符號集合fsys作為參數: int test(bool* s1, bool* s2, int n); int block(int lev, int tx, bool *fsys); int statement(bool* fsys, int * ptx, int lev); int expression (bool* fsys, int * ptx, int lev); int term (bool* fsys, int * ptx, int lev); int factor (bool* fsys,
43、int * ptx, int lev);為symble的元素數32后跟符號集TESTSYM在在S1中中?打印出錯編號打印出錯編號nS1:=S1+S2SYM在在S1中中?GETSYM返回返回YYNNTEST測試過程流程圖測試過程流程圖因子的處理過程因子的處理過程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;Facbegsysy 處理處理
44、ident number lparentestntest后跟符集是逐步補充的,需補充的內容與當前所處小環(huán)境有關。對調用expression(fsys); z 由于write語句的語法write(,); 所以在write語句中調用expression時后跟符為: expression(rparen,comma+fsys);zfactor的語法:factor=.|( exp ) 在factor中調用expression時后跟符 expression(rparen+fsys);3.6 代碼生成代碼生成是由過程代碼生成是由過程GENGEN完成。完成。GENGEN有有3 3個個參數參數,分別代表目標代碼
45、的,分別代表目標代碼的功能碼功能碼,層差層差和和位移量位移量。例如。例如 gen(opr,0,16); gen(opr,0,16); gen(sto, gen(sto,levlev- -levellevel,adr,adr) ) levlev:當:當前前處理的處理的過程過程層次層次 levellevel:被:被引用變量或過程所在引用變量或過程所在層次層次 CXCX:為目標代碼:為目標代碼codecode數組的下標指針數組的下標指針代碼結構變換, 地址回填getsym;condition;if sym=thensym then getsym else error(16);cx1:= cx;gen
46、(jpc,0,0)statement( );codecx1.a:=cxIf c then sint main() . if(-1=block(0, 0, nxtlev) . . interpret(); / 調用解釋執(zhí)行程序 .int block(int lev, int tx, bool* fsys) dx=3; tx0=tx; tabletx.adr=cx; gen(jmp,0,0); /生成轉向過程體入口的指令 while (sym = procsym) getsymdo(); if(sym=ident) enter(procedur, &tx, lev, &dx); .
47、 if (-1 = block(lev+1, tx, nxtlev) . .3.7 PL/0分程序的處理子程序分程序的處理子程序-block初值為fsysperiod+declbegsys+statbegsys下標指針下標指針cx,tx和和變量變量dx的作用的作用CX:為目標代碼code數組的下標指針。實際上目標代碼的順序是內層過程的在前邊,主程序的目標代碼在最后。tx :table表的下標指針,是以值參數形式使用的。dx: 計算每個變量在運行棧中相對本過程基地址的偏移量 ,放在table表中的adr域,生成目標代碼時再放在code中的a域。過程體入口時的處理codetabletx0.adr.
48、a=cx; /過程入口地址填寫在code中tabletx0.adr=cx; /過程的入口填寫在table中tabletx0.size=dx; /過程占的空間填寫在table中 cx0=cx; /保留過程在code中的入口地址gen(int,0,dx); /生成過程入口指令3.8 類pcode解釋器z目標代碼存放在數組CODE中(程序地址寄存器p)z解釋程序定義一個一維整型數組S作為運行棧z棧頂寄存器(指針)t,基址寄存器(指針)b,指令寄存器i(當前正在解釋的目標指令)目標代碼的解釋執(zhí)行目標代碼的解釋執(zhí)行幾條幾條特殊指令特殊指令在在code中的中的位置位置和和功能功能yINT 0 AINT 0
49、 A在在過程過程目標程序的目標程序的入口處入口處,開辟開辟A A個單元的數據段。個單元的數據段。A A為為局局部變量部變量的的個數個數+ +3 3。yOPR 0 0OPR 0 0在在過程過程目標程序的目標程序的出口處出口處,釋放數據段釋放數據段(退棧),(退棧),恢復調恢復調用用該過程該過程前前正在運行的過程正在運行的過程的數據段的數據段基址寄存器基址寄存器B B和和棧頂棧頂寄存器寄存器T T的值,并將的值,并將返回地址返回地址送送到指令地址寄存器到指令地址寄存器P P中。中。yCAL L ACAL L A調用過程調用過程,填寫填寫靜態(tài)鏈靜態(tài)鏈、動態(tài)鏈動態(tài)鏈、返回地址返回地址,給出,給出被調被
50、調用用過程過程的的基地址基地址值,值,送送入基址寄存器入基址寄存器B B中,目標程序的中,目標程序的入口入口地址地址A A的值的值送送指令地址寄存器指令地址寄存器P P中,使指令從中,使指令從A A開始執(zhí)行開始執(zhí)行interpret三個寄存器賦初值三個寄存器賦初值t:=0; b:=1; p:=0;主程序的主程序的SL,DL,RA賦初值賦初值s1:=0; s2=0; s3=0;i:=codep;p:=p+1;P=0?返回返回解釋執(zhí)行的流程圖解釋執(zhí)行的流程圖執(zhí)行指令執(zhí)行指令iNY幾條特殊指令的解釋執(zhí)行過程過程出口出口opropr 0 0 0 0 RA RA DL DL SL SLb. tMtbt=b-1;p=st+3;b=st+2Q調用過程調用過程-cal l acal l a st+1=base(l, s, b); 填寫靜態(tài)鏈 st+2=b; 填寫動態(tài)鏈 st+3=p; 填寫返回地址 b=t+1; 被調用過程的基地址 p=a 過程入口地址a送p /t在int中設置i
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 班級活動的評價與反饋機制計劃
- 優(yōu)化手術室管理的工作思路計劃
- 初心不改為孩子的夢想助力計劃
- 品牌與藝術的跨界合作計劃
- 幼兒園社會責任意識培養(yǎng)計劃
- 超聲科團隊建設的領導力培養(yǎng)計劃
- 企業(yè)形象塑造與品牌建設計劃
- 七年級必須收藏:名著《西游記》每回檢測題(16至20回)
- 幼兒園健康教育的有效實現(xiàn)計劃
- 制定多元化發(fā)展戰(zhàn)略的工作計劃
- GB/T 24498-2025建筑門窗、幕墻用密封膠條
- 悟哪吒精神做英雄少年開學第一課主題班會課件-
- 清華大學第二彈:DeepSeek賦能職場-從提示語技巧到多場景應用
- 2025年PEP人教版小學三年級英語下冊全冊教案
- GB 45185-2024眼視光產品成品眼鏡安全技術規(guī)范
- 2025年春季學期教導處工作計劃及安排表
- 2024年江蘇省中小學生金鑰匙科技競賽(高中組)考試題庫(含答案)
- 新質生產力的綠色意蘊
- 智能制造技術在工業(yè)設計中的應用
- 2025年湖南高速鐵路職業(yè)技術學院高職單招高職單招英語2016-2024年參考題庫含答案解析
- 吉林省吉林市普通中學2024-2025學年高三上學期二模試題 數學
評論
0/150
提交評論