[高等教育]第七章語義分析和中間代碼生成_第1頁
[高等教育]第七章語義分析和中間代碼生成_第2頁
[高等教育]第七章語義分析和中間代碼生成_第3頁
[高等教育]第七章語義分析和中間代碼生成_第4頁
[高等教育]第七章語義分析和中間代碼生成_第5頁
已閱讀5頁,還剩52頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、.第七章 語義分析和中間代碼生成知識結(jié)構(gòu): 語義分析語法分析概述 語法制導(dǎo)翻譯 逆波蘭式表示 三元式表示語義分析和中 中間語言 圖型表示間代碼生成 四元式表示 三地址語句表示 賦值語句的翻譯 布爾表達(dá)式的翻譯中間代碼生成 控制語句的翻譯 說明語句的翻譯 過程語句的翻譯第一節(jié) 語法制導(dǎo)翻譯概述一、語義分析的任務(wù)在詞法分析和語法分析的基礎(chǔ)上進(jìn)一步分析其含義,主要的工作是進(jìn)行靜態(tài)語義檢查和翻譯。二、語義分析的功能1、類型檢查檢查運算的合法性(運算對象的一致性)。2、一致性檢查一個對象(標(biāo)識符等)在一個分程序中只能被定義一次。3、相關(guān)名字檢查如果一個名字必須出現(xiàn)多次,檢查使用的名字是否相同的。4、控制

2、流檢查控制流語句必須使控制轉(zhuǎn)移到合法的地方。5、確定類型確定標(biāo)識符所關(guān)聯(lián)得數(shù)據(jù)類型。6、識別含義確認(rèn)程序中各種成分組合到一起的含義,并作相應(yīng)的語義處理,對可執(zhí)行的語句生成中間語言或目標(biāo)語言。三、生成的語言1、直接生成目標(biāo)語言根據(jù)源程序中各語法成分的語義,直接生成機器語言或匯編語言。其特點: 編譯時間較短; 存儲空間較大; 目標(biāo)語言的質(zhì)量較差。2、生成中間語言介于源程序語言和機器語言之間的機內(nèi)表示形式。其特點: 編譯程序的邏輯結(jié)構(gòu)簡單; 有利于編譯程序的移植; 便于目標(biāo)語言的優(yōu)化。四、語義分析方法1、語法制導(dǎo)翻譯方法在語法分析過程中,使用語法規(guī)則進(jìn)行歸約的同時,根據(jù)每個產(chǎn)生式的語義動作進(jìn)行翻譯(

3、在語法規(guī)則的制導(dǎo)下,通過對語義規(guī)則的計算,完成對輸入字符串的翻譯)的方法。2、屬性翻譯方法指明語義規(guī)則的計算次序,陳述一些實現(xiàn)細(xì)節(jié),以表達(dá)語義動作在語法分析過程中的執(zhí)行時刻。五、語義規(guī)則為文法中的每一條產(chǎn)生式配置計算屬性的計算規(guī)則。六、語法制導(dǎo)翻譯為文法中每個產(chǎn)生式配備一組語義規(guī)則。1、語義規(guī)則語義規(guī)則計算包括:產(chǎn)生代碼、在符號表中存放信息、在分析工作棧中填寫語義值(屬性值),并生成相應(yīng)的中間代碼。2、自上而下分析用一條產(chǎn)生式與輸入符號匹配成功時, 執(zhí)行相應(yīng)語義子程序生成中間代碼。3、自下而上分析用一條產(chǎn)生式進(jìn)行的歸約時, 執(zhí)行相應(yīng)語義子程序生成中間代碼。七、翻譯簡例表達(dá)式文法和相應(yīng)的翻譯模式

4、:(P179)Sid:=E p:=Lookup(); if p nil then emit (p:=E.place)else error E.place 為屬性值(語義變量),代表存放E值的變量名在符號表的入口地址或指向代表E值的臨時變量的整數(shù)值。 EE1+E2 E.place:=newtemp; emit( E.place:=E1.place+E2.place) 語法分析工作棧進(jìn)行擴充,增加相應(yīng)的語義值,語法分析同時(如歸約時),執(zhí)行語義規(guī)則(語義子程序)。例:x:=y+z的語法制導(dǎo)翻譯用EE1+E2歸約 執(zhí)行語義規(guī)則E2 E2.place E.place:=T1; + - 歸

5、約后 E E.place emit(T1:=y+z) E1 E1.place 符號 語義值 生成一條中間代碼符號 語義值 用Sid:=E歸約 執(zhí)行語義規(guī)則 E E.place p:=Lookup(x); := - 歸約后 s E.place emit (x:= T1) id id.place 符號 語義值 生成一條中間代碼。 符號 語義值 這樣語法分析結(jié)束時也就生成了中間代碼: (0) T1:=y+z (1) x:= T1 注意:語義工作棧中的值與狀態(tài)工作棧中的值一一對應(yīng),某些符號可能無相應(yīng)的語義值,如上例“+”,保留語義棧位是用“”表示。歸約時符號和語義值同時退出工作棧,同時進(jìn)入工作棧。例A

6、 XYZ Z Z.z Y Y.y 歸約后 A A.a X X.x 符號 語義值 符號 語義值 八、語義值(屬性)和語義規(guī)則(語義子程序) 1、語義值代表文法符號的類型、值、符號表地址等語義子程序需要的信息。如 E.place(符號表指針)。2、語義規(guī)則對語義值(屬性)進(jìn)行計算,或其它加工處理過程。屬性文法翻譯使用語義規(guī)則進(jìn)行屬性值的計算。語法制導(dǎo)翻譯給出使用語義規(guī)則進(jìn)行計算的順序(用 括號起來)。九、理解語法制導(dǎo)翻譯的若干關(guān)鍵問題1、語義值(屬性)代表的含義2、語義子程序(語義規(guī)則)3、語法制導(dǎo)翻譯過程 翻譯的順序與語義子程序執(zhí)行的順序相關(guān); 子程序執(zhí)行的順序與應(yīng)用產(chǎn)生式進(jìn)行歸約的順序相關(guān);

7、歸約的順序與中間代碼的順序相關(guān); 第二節(jié) 中間語言一、中間語言的表示形式1、后綴式(逆波蘭表示)(P167 定義)2、圖表示法(DAG無環(huán)路有向圖,抽象語法樹)3、三地址代碼 三地址語句 四元式 三元式 間接三元式二、后綴式(逆波蘭表示)1、表達(dá)式表示形式 中綴形式二目運算的運算符總是置于兩個運算對象之間。例:a*(b+c) 后綴形式把運算符置于運算對象之后,將中綴式中的算符,按優(yōu)先級或結(jié)合律重新排序。 后綴形式表達(dá)式E的定義 如果E是一個變量或常量,則E的后綴形式是E自身。 如果E是E1 OP E2形式的表達(dá)式,這里的OP是任何二元操作符,則E的后綴形式是E1¢E2¢ O

8、P,這里E1¢和E2¢分別為E1和 E2的后綴形式。 如果E是(E1 )形式的表達(dá)式,則E1¢的后綴形式就是E的后綴形式。例:中綴形式:a*(b+c),而后綴形式:abc+*2、中綴形式轉(zhuǎn)換后綴形式的算法建立兩個工作棧,存放運算對象和經(jīng)處理后的運算符(逆波蘭區(qū));另一個存放運算符,首先將“#”壓入工作棧頂。 若輸入的符號是運算對象,送入波蘭區(qū)。 若輸入的符號是運算符,送入運算符工作棧,操作過程: 工作棧頂運算符的優(yōu)先級高于當(dāng)前輸入的運算符,將工作棧頂運算符彈出,送入逆波蘭區(qū),并把當(dāng)前輸入的運算符壓入運算符工作棧; 工作棧頂運算符的優(yōu)先級低于當(dāng)前輸入的運算符,將當(dāng)前

9、輸入的運算符壓入運算符工作棧; 若當(dāng)前輸入的符號是“#”,將運算符工作棧的符號依次彈出,送入逆波蘭區(qū)。3、轉(zhuǎn)換的語義規(guī)則 屬性定義(語義變量)Ecode:表示E的后綴式,定義了識別的標(biāo)識符(指針)。OP表示任意的二元操作符?!啊北硎竞缶Y形式的連接。 語義規(guī)則的描述(P167)對同一產(chǎn)生式重復(fù)出現(xiàn)的文法符號用角標(biāo)進(jìn)行區(qū)分。例 a + b * (c + d * b) + d 4 3 2 1 5 后綴式:abcdb*+*+d+ 產(chǎn)生式 語義動作 E®id E.codeid E®E1 OP E2 E.codeE1.codeE2.codeop三、圖表示法1、抽象語法樹語法樹可以作為一

10、種合適的中間語言形式。在語法樹中去掉那些對翻譯無效的信息,從而獲得更有效的源程序中間表示。這種變換后的語法樹為抽象語法樹。抽象語法樹的表示形式: 操作符和關(guān)鍵字作為內(nèi)部結(jié)點。 運算對象作為葉子結(jié)點。例:3×54的抽象語法樹 × 4 3 5 2、DAG圖(無環(huán)路有向圖)與抽象語法樹一樣,對表達(dá)式的每個子表達(dá)式,DAG都有一個結(jié)點。DAG圖的結(jié)構(gòu): 內(nèi)部結(jié)點為運算符。 子結(jié)點為操作對象。3、DAG與抽象語法樹的區(qū)別(P168) DAG圖的公共子表達(dá)式的結(jié)點具有多個父結(jié)點。 抽象語法樹的公共子表達(dá)式對應(yīng)重復(fù)子樹。四、三地址代碼1、三地址代碼一般形式X := Y op Z 結(jié)果 操

11、作數(shù) 操作符 操作數(shù)例:X+Y*Z中間代碼為:T1 :=Y*Z T2 :=X+T1 T1, T2為臨時變量(由編譯生成)2、三地址語句的種類 (P170): 二目運算的賦值語句x := y op z。 單目運算的賦值語句x :=op y 。 復(fù)制語句x := y。 無條件轉(zhuǎn)移語句goto L(中間代碼地址)。 條件轉(zhuǎn)移語句if x relop y goto L或if a goto L。 調(diào)用語句param x和call p, n,返回語句return y。 索引賦值x := yi和xi := y(數(shù)組元素)。 地址和指針賦值x :=&y,x :=*y和 *x :=y。3、三地址代碼的幾

12、種表示 四元式 (op,arg1,arg2,result)例:x:=y op z 的四元式(op,y,z,x)例:a:=b * -c + b* -c(,c,_,T1)(*,b,T1,T2)(,c,_,T3)(*,b,T3,T4)(+,T2,T4,T5)(:=,T5,_,a) 三元式 為了避免把臨時變量填入符號表,用中間代碼地址(指針)代表運算對象。(op,arg1,arg2)例:a:=b * -c + b * -c(0)(,c,_ )(1)(*,b,(0)(2)(,c,_ )(3)(*,b,(2)(4)(+,(1),(3)(5)(:=,a,(4)例:xi:= y(0)(= ,x,i)(1)(:

13、=,y,(0))用兩條三元式表示索引賦值。例:x:=yi(0)( =,y,i) (1)(:=,x,(0)(3) 間接三元式(P173)為了便于代碼優(yōu)化處理,不直接使用三元式的指針,而是另設(shè)一張間接代碼表,按先后順序列出三元式在三元式代碼表中的位置。例:x:=(A+B)*cy:=D(A+B) 三元式代碼表 間接代碼表OP ARG1 ARG2 (1)(1) + A B (2)(2) * (1) C (3)(3) X (2) (1)(4) D (1) (4)(5) Y (1) (5) 比較幾種形式的三地址代碼a:=b*-c+b*-c三地址碼 四元式 三元式間接三元式 T1:= - c (,c,-,T

14、1) (,c,-)(0)(,c,- )(0) T2:=b*T1 ( *,b,T1,T2) (*,b,(0)(1)(*,b,(0) (1) T3:= - c (,c,-,T3 ) (,c,-) (2)(+,)(0) T4:=b*T3 (* ,b,T3,T4 ) (*,b,) (3)(:=,a,)(1) T5:=T2+T4 (+ ,T2,T4,T5) (+,) (4)(2) A:=T5 (:= ,T5 ,-,a) (:=,a,) (5)(3) 第三節(jié) 賦值語句的翻譯一、簡單算術(shù)表達(dá)式及賦值語句1、語義函數(shù)(子程序)P178Lookup():查找在符號表中的入口地址。em

15、it( ):生成三地址語句(中間代碼)發(fā)送到輸出文件中。例:emit(X:=uminusT) 產(chǎn)生中間代碼。 newtemp:產(chǎn)生一個新臨時變量名的整數(shù)碼。如T1,T2,T3。 2、語義變量(屬性)E.place:代表存放E值在符號表的入口地址或臨時變量。 :以存在的變量名。賦值語句的翻譯模式(P179)Sid:=E p:=Lookup(); if p nil then emit (p:=E.place)else errorEE1+E2 E.place:=newtemp;emit( E.place:=E1.place+E2.place)EE1*E2 E.place:

16、=newtemp;emit(E.place:=E1.place*E2.place)E-E1 E.place:=newtemp;emit(E.place:=uminusE1.place)E(E1) E.place:=E1.placeEid p:= lookup () if pnil then E.place:=pElse error例:X:=-B*(C+D) 的語法制導(dǎo)翻譯過程輸入 棧 Place 產(chǎn)生式 三地址代碼 X:=-B*(C+D) X _ :=-B*(C+D) X:= _ _ -B*(C+D) X:=- _ _ _ B*(C+D) X:=-B _ _ _ _ Eid *(

17、C+D) X:=-E _ _ _ B *(C+D) X:=E _ _ T1 E-E1 T1:=uminus B *(C+D) X:=E* _ _ T1_ (C+D) X:=E*( _ _ T1_ _ C+D) X:=E*(C _ _ T1_ _ _ +D) X:=E*(E _ _ T1 _ _C Eid +D) X:=E*(E+ _ _ T1 _ _C_ D) X:=E*(E+D _ _ T1_ _ C _ _ Eid) X:=E*(E+E _ _T1 _ _ C _ D ) X:=E*(E _ _ T1_ _T2 EE1+E2 T2:=C+D ) X:=E*(E) _ _ T1_ _ T2_

18、 E(E) X:=E*E _ _T1 _T2 EE1*E2 T3:=T1*T2 X:=E _ _ T3 Sid:=E X:=T3 二、不同類型運算的翻譯(P184)對不同類型運算,生成代碼時首先進(jìn)行類型轉(zhuǎn)換。例:x:=y + i*j 其中x,y為實型, i,j為整型;產(chǎn)生三地址代碼為:T1:= i int* jT2:= int to real T1T3:= y real+ T2X:=T3增加一個語義值(屬性)類型屬性 E.type語義棧擴充 state place typeEE1 + E2的語義規(guī)則(P184)E.place:=newtemp;if E1.type=integer and E2

19、.type=integer then begin emit(E.place:=E1.placeint+E2.place)E.type=integer end else if E1.type =real and E2.type =real then beginemit(E.place:=E1.placereal+E2.place)E.type=realendelse if E1.type=integer and E2.type=realthen beginu:= newtemp; emit(u:= int to realE1.place)emit(E.place:=ureal+E2.place)

20、E.type=real endelse if E1.type=real and E2.type=integer then beginu:= newtemp; emit(u:= inttoreal E2.place)emit(E.place:=E1.placereal+u)E.type=real end else E.type:=type_error 三、數(shù)組元素的引用1、編譯對變量、數(shù)組元素的處理 為某過程的名字(變量、數(shù)組元素)分配空間,在中間代碼中操作數(shù)用相對地址表示。2、符號表(實數(shù)域?qū)?字節(jié), 整數(shù)域?qū)?字節(jié)) 某一過程有變量X, Y, i, j 名字 類型 相對地址 內(nèi)存的分布 0

21、X Real 0 X8字節(jié) 1 Y Real 8 Y8字節(jié) 2 I Int 16 i4字節(jié) 3 J Int 20 j4字節(jié) 3、操作數(shù)在中間代碼中表示: 如i的E.place為2(符號表的指針2); 書面表達(dá)用名字i(直觀); 存儲分配后相對地址16;4、數(shù)組元素地址的計算數(shù)組元素的存儲方式:數(shù)組元素存放在一片連續(xù)的單元中,地址用相對地址表示。例 Var A:array1¼2,1¼3of integer; a11,a12,a13 a21,a22,a23 行排序 列排序 A1,1 A1,1 A1,2 A2,1 A1,3 A1,2 A2,1 A2,2 A2,2 A1,3 A2,

22、3 A2,3 數(shù)組下標(biāo):沿著每一維的距離稱為一個下標(biāo),每一維下標(biāo)只能在上、下限之內(nèi)變動。例:一維數(shù)組Alow¼highlow為下標(biāo)的下限、high為下標(biāo)的上限。例:數(shù)組說明為A1¼5, low=1, high=5。lowihigh (i取值范圍)其中:i為一個下標(biāo)值。數(shù)組下標(biāo)變量:由數(shù)組名連同各維的下標(biāo)值命名的,表示數(shù)組元素的地址。例:Ai數(shù)組元素地址的計算: 一維數(shù)組元素地址的計算D=base+(ilow)×w = i×w+(base-low×w)其中:D表示數(shù)組元素Ai的相對地址;base為A的第一個數(shù)據(jù)元素A1的相對地址,w為域?qū)挕?ba

23、se-low×w)為相對地址D的常量用CONSTPART表示。i×w為相對地址D中的變量用VARPART表示。地址計算公式:D=CONSTPART+VARPART例:求A3的地址A33×4(1001×4)=12+96=108A0 96 A1 100 A2 104 A3 108例:一維數(shù)組A2¼5, low=2、high=5,base為A的相對地址為100,w為4。相對地址偏移量:(base-low×w)=1002×4=92。例:求A4的地址A4i×w (base-low×w)4×492=108

24、A0 92 A1 96A2 100A3 104A4 108 二維數(shù)元素地址的計算(按行存放):二維數(shù)組Alow1¼high1, low2¼high2例:Ai1,i2的地址D base+(i1-low1)×n2+ i2-low2)×w base+( i1×n2 -low1×n2+ i2-low2)×w(i1×n2+i2)×w + base-(low1×n2+low2)×w /* n2為第二維的取值個數(shù), n2=high2-low2+1 */CONSTPART= base-(low1

25、15;n2+low2)×wVARPART=(i1×n2+i2)×w例:二維數(shù)組A1¼2,1¼3, 求數(shù)組元素A1,3的地址。其中:low11,low21,high23,n23113。CONSTPART base-(low1×n2+low2)×w100(1×31)×484 VARPART (i1×n2+i2)×w(1*3+3)*4=24A1,3 CONSTPART+VARPART84+24 = 108數(shù)組元素A1,3是第三個元素(按行存放)。A1,1 100A1,2 104A1,3 10

26、8A2,1 112A2,2 116A2,3 118*; 多維數(shù)組元素地址的計算D(i1n2+i2)n3+i3)nk+i k )×w +base-((low1n2+low2)n3+low3))nk+lowk)×wDVARPART + CONSTPART 數(shù)組內(nèi)情向量: 下限值 上限值 每維界差 i1 h1 n1 ¼ ¼ ¼ in hn nn n(維數(shù)) C(常量) TYPE(類型) A(數(shù)組名稱)數(shù)組元素在中間代碼中的表示:用CONSTPART VARPATR兩部分表示數(shù)組元素。例:A2,3:=E 中間代碼為:Tj:= VARPATR; Ti :

27、= CONSTPART Ti保存語義值L.place符號表指針;Tj保存語義值L.offset屬性變量。TiTj:=E L.placeL.offset:=E例:X:=A2,3的中間代碼為:X:=TiTj四、含數(shù)組元素的賦值語句的翻譯模式(P181)1、語義值和語義子程序L.place: 簡單變量:指此名字的符號表入口。 數(shù)組元素:指保存CONSTPART的臨時變量整數(shù)碼。L.offset: 簡單變量:null。 數(shù)組元素:指保存VARPART的臨時變量整數(shù)碼。Elist.array:表示數(shù)組名在符號表中的位置。Elist.ndim:下標(biāo)個數(shù)(數(shù)組維數(shù))計數(shù)器。Elist.place:保存VAR

28、PART的中間結(jié)果的臨時變量整數(shù)碼。Limit(array,m):給出數(shù)組array第m維的長度。2、語義規(guī)則(翻譯規(guī)則):(P181-P182)Elistid E Elist.place:= E.place; Elist.ndim:=1; Elist.array := id.place Elist Elist1 ,E t:= newtemp; m:=Elist1.ndim + 1;emit(t:= Elist1.place*limit(Elist1.array,m)emit (t:=t+E.place)Elist.array := Elist1.array;Elist.place := tE

29、list.ndim := m LElist L.place:=newtemp;emit(L.place := Elist.arry - c )L.offset:=newtemp;emit(L.offset := w *Elist.place)EL  if L.offset = null then E.place := L.place else begin E.place := newtemp;emit(E.place:=L.placeL.offset) end EL:=E if L.offset=null /* L是簡單變量*/Then emit(L.place := E.place

30、)Else emit(L.place L.offset:=E.palce)例71 (P183)A1¼10,1¼20設(shè)w=4, A的第一個元素的地址為200。CONSTPARTbase-(low1×n2+low2)×w200-(1*20+1)*4:=200-84:=116寫出X:=AY,Z的語法制導(dǎo)翻譯過程Lid L.place:=Elist.placeL.offset:=nullElistid E Elist.place:=Y Elist.ndim:=1, Elist.array:=A ElistElist,E t:=T1 ,m:=1+1=2T1=Y*2

31、0T1:=T1+ZElist.array:=AElist.place:=T1Elist.ndim:=2 LElist L.place:=T2 T2:=200-84=116 L.offset:=T3T3:=4*T1EL E.place:=T4 T4:= T2 T3SL:=E ifL.offset=null Then X:=T4 else T2 T3:=X 第四節(jié) 布爾表達(dá)式的翻譯一、布爾表達(dá)式的定義和翻譯1、布爾表達(dá)式的定義布爾表達(dá)式是用布爾運算符號(and,or,not)作用到布爾變量或關(guān)系運算符上而組成的。 布爾表達(dá)式的作用 邏輯值的計算; 作為條件控制的布爾式。 布爾表達(dá)式的優(yōu)先級(P18

32、5)算術(shù)運算符(一元負(fù)),*,/,+,。比較運算符=,<, ,> , 。邏輯運算符not,and,or。2、布爾表達(dá)式的計算方法 按優(yōu)先關(guān)系計算值用1代表true,0代表false 1 or ( not 0 and 0) or 0= 1 or (1 and 0) or 0= 1or 0 or 0= 1 or 0=1 按優(yōu)化方式計算值A(chǔ) or B: if A then true else B (A為真時無需判斷B);A and B:if A then B else false(A為假時無需判斷B);not A: if A then false else true3、數(shù)值表示法的翻譯例

33、:a<b 等價為if a<b then 1 else 0翻譯為:100: if a<b goto 103101: T1:=0102: goto 104103: T1 :=1104:其中:T1的值表示a<b結(jié)果例:a or b and not c翻譯為:100: T1 := not c101: T2 := b and T1102: T3 := a or T2 數(shù)值表示法的翻譯模式:EE1 or E2 E.place:= newtemp; emit(E.place := E1.place or E2.place) EE1 and E2 E.place:= newtemp;

34、emit(E.place := E1.place and E2.place) E not E1 E.place:= newtemp; emit(E.place := not E1.place) E ( E1 ) E.place:= E1.place Eid1 relop id2 E.Place:=newtemp; emit(if id1.place relop.op id2.place gotonextstat + 3 ); emit(E.place:=0); emit(gotonextstat + 2 ); emit(E.place:=1) Eid E.place:= id.place 例:

35、a<b or c<d and e<f的翻譯過程 Eid1 relop id2 (a<b) E.place:=T1, 100 if a<b goto 103 101 T1:=0 102 goto 104 103 T1:=1 Eid1 relop id2 (c<d)E.place:=T2 104 if c<d goto 107 105 T2:=0106 goto 108107 T2:=1 Eid, relop id2 (e<f)E.place:=T3 108 if e<f goto 111 109 T3:=0 110 goto 112 111

36、T3:=1EE1 and E2 (and) E.place:=T4112 T4:=T2 and T3 EE1 or E2 (or)E.place:=T5113 T5:=T1 or T4二、作為條件控制的布爾表達(dá)式翻譯1、作為條件控制出口的定義 語義值為真(E.true)轉(zhuǎn)移到真入口地址。 語義值為假(E.false)轉(zhuǎn)移到假入口地址。 true jmp例:if E then S1 else S2 ; false條件語句翻譯的結(jié)構(gòu): E的代碼 to E.true to E.falseE.true S1的代碼goto S.nextE.false S2的代碼S.next 中間語言的表示: if E

37、goto L1 (轉(zhuǎn)移到真入口) goto L2 (轉(zhuǎn)移到假入口)L1: S1 (代碼序列) goto Snext (跳出條件語句)L2: S2 (代碼序列) Snext:布爾表達(dá)式E的翻譯: K:if E goto E.true(轉(zhuǎn)移到真入口) K+1:goto E.false (轉(zhuǎn)移到假入口) true jmp例:if ab then S1 else S2 ; false中間語言的表示: if ab goto L1 (轉(zhuǎn)移到真入口) goto L2 (轉(zhuǎn)移到假入口)L1: S1 (代碼序列) goto Snext (跳出條件語句)L2: S2 (代碼序列) Snext:布爾表達(dá)式E=ab的

38、翻譯: K:if ab goto E.true(轉(zhuǎn)移到真入口) K+1:goto E.false (轉(zhuǎn)移到假入口) true jmp例 if E1 or E2 then S1 else S2 ; false條件語句翻譯的結(jié)構(gòu): E1的代碼 to E1.true to E1.false E1.false E2的代碼 to E2.true to E2.falseE1.true S1的代碼E2.true goto S.nextE1.false S2的代碼E2.false s.next中間語言的表示: if E1 goto L2 goto L1L1: if E2 goto L2 goto L3L2:

39、S1的代碼 goto Snext L3: S2的代碼 s.next:布爾表達(dá)式E1 or E2的翻譯: if E1 goto L2 goto L1L1: if E2 goto L2 goto L3L2: L3: 布爾表達(dá)式E1 or E2的操作規(guī)則:E1或E2為真轉(zhuǎn)向同一地址E.true(L2真入口), 但L2的入口地址尚沒確定,必須記下這兩條代碼地址用E1.truelist,E2.truelist保存;E1為假,直接轉(zhuǎn)向E2第一條地址L1, 在E1 or之后的地址便是E2第一條地址,為了得到該地址:a、產(chǎn)生式EE1 or E2改為 EE1 or M E2,添加非終結(jié)符M和產(chǎn)生式M;b、設(shè)置語

40、義值M.quad記錄E2第一條地址, 產(chǎn)生式M的翻譯模式(語義處理)為: M.quad:=nextquad ;c、E2為假,布爾表達(dá)式 E1 or E2為假轉(zhuǎn)向地址E.false(L3假入口), 但L3的入口地址尚沒確定,必須記下這條代碼地址用E1.falselist,E2.falselist保存。翻譯模式(語義處理)為:EE1 or M E2 backpatch (E1.falselist, M.quad ); E.truelist := merge(E1.truelist,E2.truelist) E.falselist := E2.falselist M M.quad:=nextquad

41、 true jmp例 if E1 and E2 then S1 else S2 ; false條件語句翻譯的結(jié)構(gòu): E1的代碼 to E1.true to E1.false E1.true E2的代碼 to E2.true to E2.falseE2.true S1的代碼 goto S.nextE2.false S2的代碼 s.next中間語言的表示: if E1 goto L2 goto L3L1: if E2 goto L2 goto L3L2: S1的代碼 goto Snext L3: S2的代碼 s.next:布爾表達(dá)式E1 or E2的翻譯: if E1 goto L2 goto L

42、3L1: if E2 goto L2 goto L3L2: L3: 布爾表達(dá)式E1 and E2的操作規(guī)則:E1 或E2為假轉(zhuǎn)向同一地址E.false,但入口地址尚沒確定,必須用E1.falselist,E2.falselist記下這兩條代碼地址。E1為真,直接轉(zhuǎn)向E2第一條地址L1。在E1and之后的地址便是E2第一條地址,為了得到該地址:a、把產(chǎn)生式EE1 and E2 改為 EE1 and M E2,添加非終結(jié)符M和產(chǎn)生式M;b、設(shè)置語義值M.quad記錄E2第一條地址, 產(chǎn)生式M的翻譯模式(語義處理)為: M.quad:=nextquad c、E2為真,布爾表達(dá)式 E1 and E2為真轉(zhuǎn)向地址E.true(L3真入口), 但L3的入口地址尚沒確定,必須記下這條代碼地址用E1.truelist,E2.truelist保存; 翻譯模式(語義處理)為:EE1 and M E2 backpatch (E1. truelist, M.quad ); E. falselist:= merge (E1. falselist,E2. falselist) E. truelist :=

溫馨提示

  • 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

提交評論