




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、語義分析和中間代碼生成語義分析和中間代碼生成第五章第五章 本章要求本章要求 主要內容主要內容:語義分析和中間代碼生成的語義分析和中間代碼生成的功能,中間代碼的形式,屬性文法及語功能,中間代碼的形式,屬性文法及語法制導的翻譯程序,各種語句的語法制法制導的翻譯程序,各種語句的語法制導的翻譯過程導的翻譯過程 重點掌握:重點掌握:屬性文法,屬性文法,語義分析與處理語義分析與處理的方法的方法, ,中間代碼的表示形式,各種語句中間代碼的表示形式,各種語句的代碼結構,各種語句的翻譯方法的代碼結構,各種語句的翻譯方法語義分析和中間代碼生成所處的位置:5.1 概述概述. 語義分析和中間代碼生成在編譯器中的位置:
2、語義分析和中間代碼生成在編譯器中的位置: 靜態語義檢查:如:類型、運算、數組維數、越界等的檢查 語義處理:如:變量的存儲分配、表達式的求值、語句的翻譯(中間代碼的生成) 總目標:生成等價的中間代碼語法分析語義分析和中間代碼生成編譯的后續階段語法樹中間代碼. 功能及任務:功能及任務: 輸入-語法分析單位 輸出 - 用中間代碼形式表示的文本 - 出錯處理: 定位、繼續編譯3. 為什么要此階段為什么要此階段? 邏輯結構清楚;利于不同目標機上實現同一種語言; 利于進行與機器無關的優化,這些內部形式也能用于解釋。4. 什么是中間代碼什么是中間代碼(Intermediate code) 源程序的一種內部表
3、示,不依賴目標機的結構,易于機械生成目標代碼的中間表示。5. 中間代碼的幾種形式中間代碼的幾種形式 逆波蘭、三元式、間接三元式、四元式、樹 1 1、逆波蘭式、逆波蘭式:運算對象寫在前,運算符寫在后(后綴后綴表示形式)例:a+b ab+ (a+b)*c ab+c*a+b*c abc*+a:=b*c+b*d abc*bd*+:=5.2中間代碼的幾種形式中間代碼的幾種形式+a b優點:易于計算機處理 利用棧,將掃描到的運算對象入棧,碰到運算符: 若是雙目運算符,則對棧頂的兩個運算對象實施該運算并將運算結果代替這兩個運算對象進棧; 若是單目運算符,對棧頂元素,執行該運算,將運算結果代替該元素進棧,最后
4、結果即棧頂元素。練習練習寫出下列算式的逆波蘭表示a+b*(c+d/e) a:=b a:=b* *(-c)+b (-c)+b * *(-34)(-34)not A or not (C or not D)abcde/+*+A not C D not or not or+a * b + c / d e后綴式的推廣后綴式的推廣 (1)賦值語句A:=E,后綴式為:AE:= (2)轉向語句GOTO L的后綴式為:Ljmp (3)條件語句if xy then m:=x else m:=y12345678910111213 14xy11 jezmx:=14jmy:= 2 2、三元式、三元式編號(運算符,第一運
5、算數,第二運算數)編號(運算符,第一運算數,第二運算數)如:a:= b*c+b*d(1)(*,b,c)(2)(*,b,d)(3)(+,(1),(2))(4)(:=,(3),a)對于單目運算符,只有一個運算對象,另一個為空對于單目運算符,只有一個運算對象,另一個為空注意:在三元式中的編號既代表了序號,又代表了結注意:在三元式中的編號既代表了序號,又代表了結果的存放位置。果的存放位置。 3 3、四元式、四元式 是目前最常用的中間代碼形式:( (運算符,第一運算數,第二運算數,結果運算符,第一運算數,第二運算數,結果) )例:a:=b*c+b*d (1)(*,b,c,t1) (2)(*,b,d,t2
6、) (3)(+,t1,t2,t3) (4)(:=,t3, ,a) 也可以寫成賦值語句形式:(1)t1:=b*c (2)t2:=b*d(3)t3:=t1+t2 (4)a:=t3練習練習 求 -B+C-B+C* *D D 的逆波蘭表示形式、三元式和四元式逆波蘭:B C D * +三元式:(1) (-,B,) (2) (*,C,D)(3) (+,(1),(2)四元式:(1) (-,B, , t1) (2) (*,C,D,t2)(3) (+,t1,t2,t3)到目前為止,已知到目前為止,已知 輸入的語法單位輸入的語法單位,又知道又知道 要翻譯的結果的形式要翻譯的結果的形式,翻譯的方法翻譯的方法是什么?
7、是什么? 語義分析和翻譯的方法:語義表示較流行的方法仍然是屬性文法,翻譯方法是語法屬性文法,翻譯方法是語法制導的翻譯制導的翻譯。5.3 屬性文法與語法指導的翻譯屬性文法與語法指導的翻譯 屬性文法屬性文法:是在上下文無關文法的基礎上,為每個文法符號(含終結符和非終結符)配備若干個屬性屬性值,對文法的每個產生式都配備了一組屬性計算規則(稱為語義規則語義規則)。在語法分析過程中,完成語義規則所描述的動作,從而實現語義處理。 屬性屬性:代表與文法符號相關的信息,如類型、值、代碼序列、符號表的內容等。與變量一樣,可以進行計算和傳遞,屬性的加工過程就是語義的處理過程。 屬性分兩類: 綜合屬性:用于自下而上
8、傳遞信息 繼承屬性:用于自上而下傳遞信息 注意: 終結符只有綜合屬性,它由詞法分析器提供; 非終結符可有綜合屬性,也可有繼承屬性,它由詞法分析器提供; 文法的開始符號的所有繼承屬性作為屬性計算前的初始值綜合屬性綜合屬性繼承屬性繼承屬性 產生式右邊的文法符號的繼承屬性可以繼承左邊的文法符號的繼承屬性 產生式左邊的文法符號可以通過綜合右邊的文法符號的綜合屬性而得到 但必須提供一個計算規則:計算規則中只能使用相應產生式中的文法符號的屬性。 實際應用中,一個結點的綜合屬性的值由其子結點的綜合屬性值決定(產生式右邊)。一個結點的繼承屬性由此結點的父結點和/或兄結點的某些屬性決定(產生式左邊)。 但產生式
9、左邊的繼承屬性和右邊的綜合屬性不由所給的產生式的屬性計算規則進行計算,它們由其它產生式的屬性計算規則提供。digitlexval:=3Fval:=3Tval:=3Fval:=5Tval:=15*Eval:=15+digitlexval:=4Fval:=4Tval:=4Eval:=19Ln0LEn1EE1+T2ET3TT1*F4TF5F(E)6Fdigitprint(E.val)E.val:=E1.val+t.valE.val:=T.valT.val:=T1.val * F.valT.val:=F.valF.val:=E.valF.val:=digit.lexvaldigitlexval:=5若
10、輸入符號串為:若輸入符號串為:3*5+4n例例:綜合屬性的計算綜合屬性的計算C語言中變量定義:語言中變量定義:int id1,id2,id3綜合屬性的傳遞繼承屬性的傳遞例例:繼承屬性的計算繼承屬性的計算產生式語 義 規 則D TL T intT realL L1,idL idL.in:=T.typeT.type=integerT.type:=realaddtype(id.entry,L.in) L1.in:=L.inaddtype(id.entry,L.in) 語義規則描述的工作: 屬性計算、靜態語義檢查、符號表的操作、代碼生成等,通常寫成過程和函數調用,稱為語語義子程序義子程序。 語義翻譯常
11、用的方法: 語法制導翻譯語法制導翻譯:定義翻譯所必須的語義屬性和語義規則,一般不涉及計算順序。語法制導翻譯技術語法制導翻譯技術 語法制導翻譯(Syntax-Directed Translations): 一個句子的語義翻譯過程與語法分析過程同時進行。 在文法中,文法符號有明確的意義,文法符號之間有確定的語義關系。屬性描述語義信息,語義規則描述屬性間的的關系,將語義規則與語法規則相結合,在語法分析的過程中計算語義屬性值。語法制導翻譯的處理方法語法制導翻譯的處理方法 對應每一個產生式編制一個語義子程序,在進行語法分析的過程中,當一個產生式獲得匹配時,就調用相應的語義子程序語義子程序實現語義檢查與翻
12、譯。即在自下而上語法分析的過程中,每一次歸約時就調用相應的語義子程序。 在產生式的右部的適當位置,插入相應的語義動作,按照分析的進程,執行遇到的語義動作。 語義子程序 一個語義子程序描述了一個產生式對應的翻譯翻譯工作工作。 主要有:改變編譯程序某些變量的值改變編譯程序某些變量的值、查填各查填各種符號表種符號表、發現并報告源程序錯誤發現并報告源程序錯誤、產生中間產生中間代碼代碼。 在描述語義動作時需要為每個文法符號賦以各種不同的語義值,如類型類型、地址地址、代碼值代碼值等。 如果一個產生式中一個符號多次出現,就用上角標來區分,如:E = E(1) + E(2)v語義子程序的一般形式v語義子程序寫
13、在該產生式后面的花括號內:v(1) X 語義子程序1 v(2) Y 語義子程序2 v(3) AXY 語義子程序3 常見的語法制導翻譯類型:常見的語法制導翻譯類型: 語法分析采用自下而上方法時,使用與語法分析棧同步操作的語義棧進行語法制導翻譯。 語法分析采用遞歸下降分析方法時,利用隱含堆棧存儲各遞歸子程序中的局部變量所表示的語義信息 語法分析采用LL(1)分析法時,利用翻譯文法進行語法制導的翻譯。翻譯文法是在描述語言的文法中加入語義動作的符號。 利用屬性文法進行翻譯。屬性文法也是一種翻譯文法,它的文法符號和動作符號都帶有語義屬性和同一產生式中各屬性間的運算規則。自下而上的語法制導翻譯舉例自下而上
14、的語法制導翻譯舉例 為了正確理解,需要弄清楚: 自下而上翻譯的特點 各種語句的目標結構 從源到目標的變換方法自下而上翻譯的特點使用上圖形式的棧實現增加語義棧用X.Val表示文法符號X的語義信息。語義信息與文法符號同時出棧和入棧下面以一個例子來說明自底向上的翻譯方法例例1:下面是一個算術表達式文法,每個產生式右:下面是一個算術表達式文法,每個產生式右邊是它的語義動作,對輸入串邊是它的語義動作,對輸入串* 3 + 2的規范歸約的規范歸約的分析過程如下:的分析過程如下:例例2:在:在3*54的的LR分析過程中增加了語義棧后的分析過程中增加了語義棧后的語法制導的實現過程。語法制導的實現過程。(1) E
15、E+T|T(2) TT*F|F(3) F(E)|i 狀態actiongotoabcd#E A B01234567891011S2.r1r2r3r5r4r6S3.r1r2r3r5r4r6. S4S5S4S5r1r2r3r5r4r6. S10S11S10S11r1r2r3r5r4r6.acc.r1r2r3r5r4r.9序號狀態棧 符號棧語義棧語義棧歸約產生式輸入串10#-3*5+4#205#3-*5+4#303#F-3Fi*5+4#402#T-3TF*5+4#5027#T*-3-5+4#60275#T*5-3-+4#702710#T*F-3-5Fi+4#802#T-15TT*F+4
16、#901#E-15ET+4#10016#E+-15-4#110165#E+4-15-#120163#E+F-15-4Fi#130169#E+T-15-4TF#1401#E-19EE+T#15接受結論結論 在剛才的翻譯過程中有如下特點: 句柄歸約在先,語義動作在后。句柄歸約在先,語義動作在后。 歸約時,棧內句柄各符號的語義信息與該句柄歸約時,棧內句柄各符號的語義信息與該句柄同時出同時出棧棧,整個句柄所表示的語義信息則賦給相應產生式左,整個句柄所表示的語義信息則賦給相應產生式左部非終結符的語義變量,并讓該非終結符及其語義變部非終結符的語義變量,并讓該非終結符及其語義變量量同時入棧同時入棧。 為了在
17、某處調用語義動作,就必須先歸約,因此,有為了在某處調用語義動作,就必須先歸約,因此,有時需要時需要改寫文法改寫文法。5.4 常見語句的語法制導的翻譯常見語句的語法制導的翻譯 高級語言的語句分類:高級語言的語句分類: 說明語句定義各種名字的屬性 可執行語句用于完成指定的功能,涉及到指令代碼 語義翻譯也分兩類:語義翻譯也分兩類: 翻譯說明語句時,將所定義的名字的各種屬性登記到符號表中 翻譯可執行語句時,首先應根據各源語句的語法結構和語義設計出它的目標代碼結構目標代碼結構,找出源與目標的對應關系,給出對信息(數據表示)描述和從源到目標的變換算法變換算法。語義子程序則根據變換方法進行翻譯。說明語句的翻
18、譯說明語句的翻譯 說明語句的作用: 就是說明類型等屬性信息,在翻譯時主要是填符號表 說明語句分多種,此處舉例兩種的翻譯: 變量說明語句的翻譯 常量說明語句的翻譯變量說明語句的翻譯變量說明語句的翻譯. 變量說明語句的文法描述變量說明語句的文法描述. 變量說明語句的翻譯變量說明語句的翻譯例如:var a,b,c: integer;策略:先翻譯第,產生式,再翻譯,產生式,以便記錄的類型,即在寫程序時,讀完讀完一個說明語句,開始歸約,再開始翻譯,變量的類型朝前傳遞。. 翻譯的語義動作翻譯的語義動作FILL(entry(i),Type)表示將表示將類型類型Type填入符號表中填入符號表中entry(i)
19、 表示變量名表示變量名i在在符號表中的入口符號表中的入口NameTYPEKINDVALADDRa4integer符號表:符號表:VAR id1,id2,id3:integer;的歸約過程integer:id3,id2id2,id1id1id1VARVARVARVAR(a)(b)(c)(d)(e)常量說明語句的翻譯常量說明語句的翻譯. 常量說明語句的文法描述常量說明語句的文法描述. 常量說明語句的翻譯常量說明語句的翻譯策略:和變量說明一樣,先翻譯后面的產生式,再翻譯前面的產生式,以便在歸約時,執行語義動作,將常量的值、類型、種屬填入符號表。例:例:Constant A=123. 翻譯的語義動作翻
20、譯的語義動作將常量將常量INT在符號表中的入在符號表中的入口或值直接填入常量符號口或值直接填入常量符號i所指符號表的所指符號表的VAL欄欄將常數的類型填將常數的類型填入符號表的入符號表的Type欄欄3,4產生式的翻譯與5,6產生式的翻譯相同1,2產生式沒有語義動作NameTYPEKINDVALADDRA4integer數值常數數值常數 123將常數的種屬填將常數的種屬填入符號表的入符號表的Kind欄欄可執行語句的翻譯可執行語句的翻譯 定義的一些語義變量和過程 GENCODE(OP,ARG1,ARG2,RESULT):語義過程,產生一個四元式,并填入四元式表,編號自動增1 。 NEWT:函數,返
21、回一個臨時變量序號。在翻譯可執行語句的過程中,可能需要使用臨時變量,假定用NEWT過程來申請臨時變量Ti,每申請一次,i增1。 ENTRY(i):函數,查找變量i的入口地址;檢查是否在符號表中,如在則返回一指向該登陸項的指針,否則返回NULL E.PLACE:與給終結符E相聯系的語義變量,可能是某變量的入口地址,或者為臨時變量序號。簡單賦值語句的翻譯簡單賦值語句的翻譯. 簡單賦值語句的文法描述簡單賦值語句的文法描述2. 簡單賦值語句的代碼結構簡單賦值語句的代碼結構例如:例如:x := 2+3 * 2;3. 簡單賦值語句的翻譯簡單賦值語句的翻譯 此處只假定是整數運算此處只假定是整數
22、運算例:賦值句A:=B+C*(-D)的自底向上分析設:翻譯此賦值句之前四元式的最大編號為K因此,四元式表中增加了因此,四元式表中增加了4條四元式:條四元式:K(翻譯此賦值語句之前的四元式)K+1(i,FDPLACE,_,FDPLACE)K+2(*i,TcPLACE,FDPLACE,TPLACE)K+3(+i,EBPLACE,TPLACE,EPLACE)K+4(:=,EPLACE,_,ENTRY(iA)布爾表達式的翻譯布爾表達式的翻譯3 .布爾表達式布爾表達式的文法描述的文法描述.布爾表達式布爾表達式的作用的作用用作控制語句中的條件表達式用作控制語句中的條件表達式用在邏輯賦值語句中用在邏輯賦值語
23、句中2 .布爾表達式的形式布爾表達式的形式 (1)單個布爾量單個布爾量;(2) 布爾量的運算布爾量的運算not, and,or, 優先級比優先級比關系運算高關系運算高;(3)關系運算關系運算:E1 rop E2, E1E2是算術表達是算術表達式,式,rop為關系運算符為關系運算符: ,=,=,=(1) or (2)(3) and (4)(5)not (6)()(7) rop (8)i rop i(9)i 例如:例如:x := not a and (yz); 布爾量翻譯為兩條四元式:布爾量翻譯為兩條四元式: (jnz, A,_,P): 真出口,當真出口,當A為真時跳轉到四元式為真時跳轉到四元式P
24、 (j, _,_,q) : 假出口,無條件跳轉到四元式假出口,無條件跳轉到四元式q 關系表達式也翻譯為兩條四元式:關系表達式也翻譯為兩條四元式: (jrop, i1, i2, P) : 真出口,當真出口,當i1 rop i2為真時轉四為真時轉四元式元式P (j, _,_,q) : 假出口,無條件跳轉到四元式假出口,無條件跳轉到四元式q3.布爾量布爾量的代碼結構的代碼結構 每個布爾量每個布爾量(布爾變量或關系表達式布爾變量或關系表達式)的目標結構有的目標結構有兩個出口,真出口指向為真時應跳轉的位置;假出兩個出口,真出口指向為真時應跳轉的位置;假出口指向為假時應跳轉的位置。口指向為假時應跳轉的位置
25、。類似于編寫類似于編寫匯編代碼匯編代碼AA.TCA.FC在翻譯布爾表達式時,后面的語句未在翻譯布爾表達式時,后面的語句未翻譯,翻譯,P,q如何知道?如何知道? 解決方法是:回填技術回填技術 已知就直接填入;不知時先填0,等知道后再返填 若多個因子的轉移去向相同,但又不知道具體位置,應該用鏈將這些未知且出口相同的四元式鏈在一起。 布爾表達式: A and B and CD 的四元式為: 假出口未知,填入假出口未知,填入0當掃描到當掃描到and時,對時,對A進行進行歸約,產生兩個四元式歸約,產生兩個四元式1,2,其中真出口已知,為其中真出口已知,為3當掃描到當掃描到B后的后的and時,時,對對B進
26、行歸約,又產生進行歸約,又產生兩個四元式兩個四元式3,4,其中,其中真出口已知,為真出口已知,為5假出口仍未知,假出口仍未知,但它與但它與A的假出的假出口相同,則鏈接口相同,則鏈接起來,填起來,填2當掃描到最后,對當掃描到最后,對CD進行歸約,又產進行歸約,又產生兩個四元式生兩個四元式5,6,此時真出口未知,填此時真出口未知,填0假出口仍未知,但假出口仍未知,但它與上兩個布爾量它與上兩個布爾量的假出口相同,則的假出口相同,則鏈接起來,填鏈接起來,填4生成了真、假出口兩個鏈,兩個生成了真、假出口兩個鏈,兩個0就是待填就是待填部分。等到以后翻譯到后面再填入。部分。等到以后翻譯到后面再填入。 將將P
27、1,P2為鏈首兩個四元式鏈合并在一起,可以用為鏈首兩個四元式鏈合并在一起,可以用下述過程,返回合并后的四元式鏈首:下述過程,返回合并后的四元式鏈首:merge(P1,P2) if P2 = 0) return (P1); else P := P2; while (四元式P的第4分量內容不為0) do P := 四元式P的第4分量內容; 把P1填進四元式P的第4分量; return (P2); 假出口鏈上的四元式應轉向相同的位置,所以一旦假出口鏈上的四元式應轉向相同的位置,所以一旦知道轉向的真實位置,就應返填,返填是將已知位知道轉向的真實位置,就應返填,返填是將已知位置填入鏈上的所有四元式的第四
28、個分量。置填入鏈上的所有四元式的第四個分量。 用用backpatch,把已知位置,把已知位置t填入以填入以P為鏈首的四元為鏈首的四元式中:式中:BACKPATCH(P,t) Q:=P; while (Q!=0) do m := 四元式Q的第4分量內容; 把t填進四元式Q的第4分量; Q := m; 4 .布爾表達式布爾表達式的翻譯的翻譯 布爾表達式是帶有布爾表達式是帶有not, and, or 的表達式的表達式 第一種翻譯方法可以象算術表達式一樣翻譯,第一種翻譯方法可以象算術表達式一樣翻譯,先計算每個因子的值,再計算整個表達式的值。先計算每個因子的值,再計算整個表達式的值。 第二種翻譯方法采取
29、優化措施進行翻譯。第二種翻譯方法采取優化措施進行翻譯。 E1 or T 的優化的優化:只要:只要E為真,后面的表達式就不必計算,為真,后面的表達式就不必計算,只只 有當有當E為假時才讀取為假時才讀取T,目標結構如下:,目標結構如下:E1 and T 的優化的優化:只要:只要E為假,后面的表達式就不必計算,為假,后面的表達式就不必計算,只有當只有當E為真時才讀取為真時才讀取T,目標結構如下:,目標結構如下:如果是翻譯如果是翻譯not E1,則,則E的的真假出口正好與真假出口正好與E1相反相反5. 翻譯布爾表達式時,當讀到翻譯布爾表達式時,當讀到not, and, or時,要進行歸約,時,要進行歸
30、約,因此應對文法進行改造,改造前后的文法為:因此應對文法進行改造,改造前后的文法為:(1)or(2)oror(3)(4)and(5)andand(6)(7)()(8)not(9)rop(10)i rop i(11)i改造后的文法改造后的文法(1) or (2)(3) and (4)(5)not (6)()(7) rop (8)i rop i(9)i 改造前的文法改造前的文法 6. 總結前面的分析,各產生式的翻譯為:總結前面的分析,各產生式的翻譯為:NXQ表示當前產生表示當前產生的四元式的編號的四元式的編號單個的布爾量單個的布爾量關系運算關系運算Not邏輯運算邏輯運算帶算術運算的關系運算帶算術運
31、算的關系運算產生式產生式6: ,3: 的翻譯與的翻譯與7相相似,都是將右邊的真假出似,都是將右邊的真假出口直接賦值到左邊口直接賦值到左邊(5)(4)構成構成and邏輯運算邏輯運算(2)(1)構成構成or邏輯運算邏輯運算控制語句的翻譯控制語句的翻譯 控制語句包括: if 語句 While 語句 Repeat 語句 For 語句IF語句的翻譯語句的翻譯1. IF語句的文法語句的文法(S是開始符號是開始符號) 產生式產生式(1),(4)生成無生成無else 的的IF語句結構語句結構 產生式產生式(1),(2),(3)生成生成if then else 的的語句結構語句結構(1)SC S(1)(2)Ci
32、f E then(3)ST S(2)(4)TC S(1) else 2. IF語句的目標結構及其翻譯語句的目標結構及其翻譯 無無else的結構的結構C.Chain的作用:由于在用第一的作用:由于在用第一個產生式進行歸約時,只生成了個產生式進行歸約時,只生成了條件式條件式E的代碼,的代碼,then時可以回填時可以回填E.TC, E.FC必須向后傳遞到下一必須向后傳遞到下一各產生式中。各產生式中。if ab then x:=3;(1)SC S(1) SCHAIN :=MERG(CCHAIN,S(1)CHAIN) (2)Cif E then BACKPATCH(ETC,NXQ);CCHAIN:=EF
33、C 2. IF語句的目標結構及其翻譯語句的目標結構及其翻譯 有有else的結構的結構E的代碼S(1)的代碼ifthenE.TCE.FCS(1).CHAINC.CHAINS.CHAINS(2)的代碼JMP 0T.CHAINS(2).CHAINif ab then x:=3 else x:=5;(1) Cif E then BACKPATCH(ETC,NXQ);CCHAIN:=EFC (2) ST S(2) SCHAIN:=MERG(TCHAIN,S(2)CHAIN) (3) TC S(1) else q:=NXQ;GENCODE(j,_,_,0);BACKPATCH(CCHAIN,NXQ);TC
34、HAIN:=MERG(S(1) CHAIN,q) 例:將下面的例:將下面的IF語句翻譯為四元式序列語句翻譯為四元式序列if A and B and (CD) then if A,C,D,7) /*CD的四元式*/6. (j,_,_,13) 7.(j,A,B,9) /*AB的四元式*/8. (j,_,_,11)9. (:=,1,_,F) /*F :=1的四元式*/10. (j,-,-,15)11. (:=,0,_,F) /*F :=0的四元式*/12. (j,_,_,15)13.(+,G,1,T) /*G:=G+1的四元式*/14.(:=,T,_,G)15. 練習:將下面的語句翻譯為四元式序列i
35、f (AC) and (BD) then if A=1 then C:=C+1 else if AD then A:=A+2; 1.(j,A,C,3)1.(j,A,C,3)2.(j,-,-,14)2.(j,-,-,14)3.(j,B,D,5)3.(j,B,D,5)4.(j,-,-,14)4.(j,-,-,14)5.(j=,A,1,7)5.(j=,A,1,7)6.(j,-,-,10) 6.(j,-,-,10) 7.(+,C,1,T7.(+,C,1,T1 1) ) 8.(:=,T,-,C) 8.(:=,T,-,C) 9.(j,-,-,14)9.(j,-,-,14)10.(j=,A,D,12) 10
36、.(j10; 3. 翻譯翻譯S(1)的代碼R.HEADS(1).CHAINE的代碼repeatuntilE.TCE.FCS.CHAIN(1) Rrepeat RHEAD:=NXQ (2) URS(1) until UHEAD:= RHEAD;BACKPATCH(S(1)CHAIN,NXQ) (3) SUE BACKPATCH(EFC,UHEAD);SCHAIN:=ETC 將下面的語句翻譯為四元式序列If w1 then a:=b*c+delse repeat a:=a-1 until a0;1.(j,w,1,3)2.(j, , ,7)3.(*,b,c,t1)4.(+,t1,d,t2)5.(:=
37、,t2, ,a)6.(j, , ,11)7.(-,a,1,t3)8.(:=,t3, , a)9.(j,a,0, 11)10.(j, , ,7 )W W 1 1a a: := =b b* *c c+ +d dg go ot to o 1 11 1a a: := =a a- -1 1a a ,FPLACE,T1,0) (2) SF S(1) BACKPATCH(S(1)CHAIN,FAGAIN);GENCODE(j,_,_,FAGAIN);SCHAIN:=FCHAIN 將下面的語句翻譯為四元式序列for i := a+b*2 to c+d+10 do if hg then p:=p+1;1 (*,
38、b,2,t1)2 (+,a,t1,t2)3 (+,c,d,t3)4 (+,t3,10,t4)5 (:=,t2, ,i)6 (:=,t4, ,t)7 (j, , ,10)8 (+,I,1,t5)9 (:=,t5, ,i)10 (j,I,t,12)11(j, , , 17)12 (j,h,g,14)13 (j, , ,8)14 (+,p,1,t6)15 (:=,t6, ,p)16 (j, , ,8)175.5 Sample語言語法制導翻譯語言語法制導翻譯程序的設計程序的設計 語法制導的翻譯實際上就是在語法分析的基礎上,當分析完一個正確的語法單位后,調用相應的語義處理程序,直接生成相應的四元式表。
39、在第4章使用遞歸下降的分析方法進行了Sample語言的語法分析器 在此基礎上添加語義處理舉例:為舉例:為IF語句添加語義處理語句添加語義處理ifs( ) /* If語句的語法分析*/ token = getnexttoken(); If(token!=if) error; token= getnexttoken(); bexp(); token = getnexttoken(); If(token!=then) error; token = getnexttoken(); ST_SORT();/*調用函數處理then后的可執行語句*/ token = getnexttoken(); If(to
40、ken!= else) error; token = getnexttoken(); ST_SORT();/*處理else后的可執行語句*/ := if then else ifs( ) /* 添加語義處理后的程序 */ token = getnexttoken(); If (token !=“if”) error; token= getnexttoken(); (e.tc, e.fc) = bexp(); token= getnexttoken(); if (token != then) error(缺缺then); backpatch(e.tc, nxq); /*回填真出口回填真出口e.tc*/ token= getnexttoken(); s1.chain = ST_SORT(token); /*處理處理s1,返回返回s1鏈鏈*/ token= getnexttoken(); := if then else
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 工業園區綠色制造與節能減排技術
- 工業廢棄地生態修復與再利用
- 工業廢水處理技術進展及政策解讀
- 工業安全防護與自動化技術的融合
- 工業機器人技術的應用與發展
- 工業污染防治與環境教育案例分析
- 工業自動化中的數據驅動決策技術
- 工業物聯網的實時數據傳輸與處理
- 工業機械設備的節能與環保改造
- 工業遺址改造為文創園區的策略
- 脫發介紹演示培訓課件
- 初中物理教材插圖原理集錦(回歸教材)
- 腸梗阻護理查房(小腸減壓管的應用)
- JGT266-2011 泡沫混凝土標準規范
- 2024屆遼寧省沈陽市東北育才校中考沖刺卷物理試題含解析
- 抗菌藥物合理應用
- 初中體育籃球雙手胸前傳接球教案
- 中建盤扣式落地卸料平臺施工方案
- 配電網技術標準(施工驗收分冊)
- 12英寸主要原輔材料消耗表
- 電力電子裝置-2021復習要點
評論
0/150
提交評論