編譯原理第8章語(yǔ)法制導(dǎo)翻譯_第1頁(yè)
編譯原理第8章語(yǔ)法制導(dǎo)翻譯_第2頁(yè)
編譯原理第8章語(yǔ)法制導(dǎo)翻譯_第3頁(yè)
編譯原理第8章語(yǔ)法制導(dǎo)翻譯_第4頁(yè)
編譯原理第8章語(yǔ)法制導(dǎo)翻譯_第5頁(yè)
已閱讀5頁(yè),還剩153頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第八章語(yǔ)法制導(dǎo)翻譯和中間代碼生成第一節(jié)屬性文法第二節(jié)語(yǔ)法制導(dǎo)翻譯概論第三節(jié)中間代碼的形式第四節(jié)簡(jiǎn)單賦值語(yǔ)句的翻譯第五節(jié)布爾表達(dá)式的翻譯第六節(jié)控制結(jié)構(gòu)的翻譯第七節(jié)說(shuō)明語(yǔ)句的翻譯第八節(jié)數(shù)組和結(jié)構(gòu)的翻譯知識(shí)結(jié)構(gòu)8.1屬性文法語(yǔ)義處理的功能:靜態(tài)語(yǔ)義審查:驗(yàn)證語(yǔ)法結(jié)構(gòu)合法的程序是否真正有意義翻譯:

翻譯說(shuō)明語(yǔ)句,把名字的屬性登記到符號(hào)表中

翻譯可執(zhí)行語(yǔ)句,設(shè)計(jì)出目標(biāo)代碼結(jié)構(gòu),給出變換方法,將可執(zhí)行語(yǔ)句變換為目標(biāo)代碼

生成中間代碼或目標(biāo)代碼第八章語(yǔ)法制導(dǎo)翻譯和中間代碼生成靜態(tài)語(yǔ)義審查:類型檢查:驗(yàn)證程序中執(zhí)行的每個(gè)操作是否遵守語(yǔ)言的類型系統(tǒng)的過(guò)程,編譯程序必須報(bào)告不符合類型系統(tǒng)的信息控制流檢查:控制流語(yǔ)句必須使控制轉(zhuǎn)移到合法地方

一致性檢查:在很多場(chǎng)合要求對(duì)象只能被定義一次

相關(guān)名字檢查:有時(shí),同一名字必須出現(xiàn)兩次或多次

名字的作用域分析:例如:表達(dá)式A+B*C對(duì)運(yùn)算對(duì)象進(jìn)行類型檢查,對(duì)變量進(jìn)行先定義后使用檢查如果靜態(tài)語(yǔ)義正確,語(yǔ)義處理則要執(zhí)行真正的翻譯,即生成程序的某種中間代碼的形式或直接生成目標(biāo)代碼。執(zhí)行真正的翻譯目前多數(shù)編譯程序進(jìn)行語(yǔ)義分析的方法是采用語(yǔ)法制導(dǎo)翻譯法

。它不是一種形式系統(tǒng),但它比較接近形式化。

語(yǔ)法制導(dǎo)翻譯法使用屬性文法為工具來(lái)描述程序設(shè)計(jì)語(yǔ)言的語(yǔ)義。(1)屬性對(duì)文法的每一個(gè)符號(hào),引進(jìn)一些屬性,這些屬性代表與文法符號(hào)相關(guān)的信息,如類型、值、存儲(chǔ)位置等。與屬性相關(guān)的信息,即屬性值,可以在語(yǔ)法分析過(guò)程中計(jì)算和傳遞。1.屬性文法屬性分為兩類:綜合屬性其計(jì)算規(guī)則按“自下而上”方式進(jìn)行,即規(guī)則左部符號(hào)的某些屬性根據(jù)其右部符號(hào)的屬性和(或)自己的其他屬性計(jì)算而得。屬性加工的過(guò)程即是語(yǔ)義的處理過(guò)程。綜合屬性和繼承屬性。繼承屬性其計(jì)算規(guī)則按“自上而下”方式進(jìn)行,即規(guī)則右部符號(hào)的某些屬性根據(jù)其左部符號(hào)的屬性和(或)右部其他符號(hào)的某些屬性計(jì)算而得。(2)屬性文法為文法的每一個(gè)規(guī)則配備的計(jì)算屬性的計(jì)算規(guī)則,稱為語(yǔ)義規(guī)則(描述語(yǔ)義處理的加工動(dòng)作)。屬性文法包含一個(gè)上下文無(wú)關(guān)文法和一系列語(yǔ)義規(guī)則。語(yǔ)義規(guī)則:這些語(yǔ)義規(guī)則附在文法的每個(gè)產(chǎn)生式上,在語(yǔ)法分析過(guò)程中,執(zhí)行語(yǔ)義規(guī)則描述的動(dòng)作,從而實(shí)現(xiàn)語(yǔ)義處理。也就是說(shuō),附在文法的每個(gè)產(chǎn)生式上語(yǔ)義規(guī)則描述了語(yǔ)義處理的加工動(dòng)作。目前流行的語(yǔ)義描述和語(yǔ)義處理的方法主要是屬性文法和語(yǔ)法制導(dǎo)翻譯方法。一個(gè)屬性文法是一個(gè)三元組A=(G,V,F(xiàn)):G:一個(gè)上下文無(wú)關(guān)文法V:一個(gè)屬性的有窮集F:關(guān)于屬性的斷言或謂詞的有窮集V中的每個(gè)屬性與文法的某個(gè)非終結(jié)符或終結(jié)符相聯(lián)系,可以是“類型”、“值”或“存儲(chǔ)位置”F中的每個(gè)斷言與文法的某個(gè)產(chǎn)生式相對(duì)應(yīng),可以是語(yǔ)義規(guī)則或者程序段等因此可知,一個(gè)屬性文法包含一個(gè)上下文無(wú)關(guān)文法和一系列語(yǔ)義規(guī)則,這些語(yǔ)義規(guī)則附在每個(gè)產(chǎn)生式上屬性文法的形式化定義:例如文法G為:E

T1+T2|T1orT2T

num|true|false對(duì)輸入串3+4的語(yǔ)法樹(shù)如圖:

圖8.1靜態(tài)語(yǔ)義審查屬性文法記號(hào)中常使用N.t的形式表示與非終結(jié)符N相聯(lián)的屬性t類型檢查的屬性文法如下:E→T1+T2{T1.type=intANDT2.type=int}E→T1orT2{T1.type=boolANDT2.type=bool}T→num{T.type:=int}T→true{T.type:=bool}T→false{T.type:=bool}屬性文法中,對(duì)應(yīng)于每個(gè)產(chǎn)生式A

a都有一套與之相關(guān)聯(lián)的語(yǔ)義規(guī)則,每條規(guī)則的形式為b:=f(c1,c2,…,ck)。

f是一個(gè)函數(shù),b和c1,c2,…,ck是該產(chǎn)生式文法符號(hào)的屬性(1)如果b是A的一個(gè)屬性,c1,c2,…,ck是產(chǎn)生式右部文法符號(hào)的屬性或A的其他屬性,則稱b是A的綜合屬性(2)如果b是產(chǎn)生式右部某個(gè)文法符號(hào)X的一個(gè)屬性,并且

c1,c2,…,ck是A或產(chǎn)生式右邊任何文法符號(hào)的屬性,則稱b是文法符號(hào)X的繼承屬性屬性分為兩類:綜合屬性和繼承屬性。在兩種情況下,我們說(shuō)屬性b依賴于屬性c1,c2,…,ck

(1)非終結(jié)符既可有綜合屬性也可有繼承屬性,但文法開(kāi)始符號(hào)沒(méi)有繼承屬性(2)終結(jié)符只有綜合屬性,它們由詞法程序提供綜合屬性其計(jì)算規(guī)則按“自下而上”方式進(jìn)行,即規(guī)則左部符號(hào)的某些屬性根據(jù)其右部符號(hào)的屬性和(或)自己的其他屬性計(jì)算而得。繼承屬性其計(jì)算規(guī)則按“自上而下”方式進(jìn)行,即規(guī)則右部符號(hào)的某些屬性根據(jù)其左部符號(hào)的屬性和(或)右部其他符號(hào)的某些屬性計(jì)算而得。小結(jié):例8.1簡(jiǎn)單算術(shù)表達(dá)式求值的語(yǔ)義描述:產(chǎn)生式語(yǔ)義規(guī)則(0)L→

E

print(E.val)(1)E→

E1+T

E.val:=E1.val+T.val(2)E→

T

E.val:=T.val(3)T→

T1*F

T.val:=T1.val×F.val(4)T→

F

T.val:=F.val

(5)F→

(E)

F.val:=E.val(6)F→

digit

F.val:=digit.lexval

E、T和F的val屬性是綜合屬性,digit僅有綜合屬性,它的值是由詞法分析程序提供的,L的屬性是空的例8.2描述說(shuō)明語(yǔ)句中各種變量的類型信息的語(yǔ)義規(guī)則:產(chǎn)生式語(yǔ)義規(guī)則(1)D

TL

L.in:=T.type(2)T

int

T.type:=integer(3)T

real

T.type:=real(4)L

L1,id

L1.in:=L.in

addtype(id.entry,L.in)(5)L

id

addtype(id.entry,L.in)過(guò)程addtype的功能是把每個(gè)標(biāo)識(shí)符的類型信息登錄在符號(hào)表的相關(guān)項(xiàng)中T的綜合屬性type,它的值由(int或real)決定,L.in是繼承屬性圖8.3是句子intid1,id2的語(yǔ)法樹(shù),使用表示屬性的傳遞情況圖8.3屬性信息傳遞情況8.2語(yǔ)法制導(dǎo)翻譯概論基于屬性文法的處理過(guò)程(語(yǔ)法制導(dǎo)翻譯):對(duì)單詞符號(hào)串進(jìn)行語(yǔ)法分析,構(gòu)造語(yǔ)法分析樹(shù),然后根據(jù)需要構(gòu)造屬性依賴圖,遍歷語(yǔ)法樹(shù)并在語(yǔ)法樹(shù)的各結(jié)點(diǎn)處按語(yǔ)義規(guī)則進(jìn)行計(jì)算語(yǔ)法制導(dǎo)翻譯是指在語(yǔ)法分析過(guò)程中,完成附加在所使用的產(chǎn)生式上的語(yǔ)義規(guī)則描述的動(dòng)作為文法的每個(gè)產(chǎn)生式都配備一個(gè)語(yǔ)義動(dòng)作或語(yǔ)義子程序。在語(yǔ)法分析的過(guò)程中,每當(dāng)使用一條產(chǎn)生式進(jìn)行推導(dǎo)或歸約時(shí),就執(zhí)行相應(yīng)產(chǎn)生式的語(yǔ)義動(dòng)作,從而實(shí)現(xiàn)語(yǔ)義處理。(1)語(yǔ)法制導(dǎo)翻譯法的基本思想S→……{……}………A→xy{……}………

a1a2a3…ai

ai+1…an語(yǔ)義處理的加工動(dòng)作語(yǔ)法制導(dǎo)翻譯法使用屬性文法為工具來(lái)說(shuō)明程序設(shè)計(jì)語(yǔ)言的語(yǔ)義。(2)語(yǔ)法制導(dǎo)翻譯法在語(yǔ)法分析過(guò)程中,依隨分析的過(guò)程,根據(jù)每個(gè)產(chǎn)生式所對(duì)應(yīng)的語(yǔ)義子程序(或語(yǔ)義規(guī)則描述的語(yǔ)義處理的加工動(dòng)作)進(jìn)行翻譯的方法。為文法每一產(chǎn)生式設(shè)計(jì)相應(yīng)的求值的語(yǔ)義描述(語(yǔ)義動(dòng)作):例如,設(shè)有簡(jiǎn)單算術(shù)表達(dá)式的文法:

E→E+E|E*E|(E)|digit1.E→E(1)+E(2)

{E.val

=E(1).val+E(2).val}2.E→E(1)*E(2)

{E.val

=E(1).val*E(2).val}3.E→(E(1)){E.val

=E(1).val}4.E→digit{E.val

=Lex.digit}{7+8*5,3+8,6*5,…}E.val=47E.val=8E.val=40E.val=7E.val=5+5*871.E→E(1)+E(2)

{E.val

=E(1).val+E(2).val}2.E→E(1)*E(2)

{E.val

=E(1).val*E(2).val}3.E→(E(1)){E.val

=E(1).val}4.E→digit{E.val

=Lex.digit}句子:7+8*5EEEEE一.計(jì)算語(yǔ)義規(guī)則依賴圖:是一個(gè)有向圖,用于描述分析樹(shù)中的屬性和屬性間的相互依賴關(guān)系依賴圖的構(gòu)造算法如下:

for分析樹(shù)中每一個(gè)結(jié)點(diǎn)ndofor結(jié)點(diǎn)的文法符號(hào)的每一個(gè)屬性ado

為a在依賴圖中建立一個(gè)結(jié)點(diǎn);

for分析樹(shù)中每一個(gè)結(jié)點(diǎn)ndofor結(jié)點(diǎn)n所用產(chǎn)生式對(duì)應(yīng)的每一個(gè)語(yǔ)義規(guī)則

b:=f(c1,c2,…,ck)dofori:=1tokdo

從ci結(jié)點(diǎn)到b結(jié)點(diǎn)構(gòu)造一條有向邊例8.2的句子Realid1,id2,id3分析樹(shù)的依賴圖(圖中的結(jié)點(diǎn)用數(shù)字表示)如圖8.4:DTRealLL,id3L,id2id14type5in7in9in1entry102entry83entry6從依賴圖的拓?fù)渑判蛑?,可以得到所有?jì)算語(yǔ)義規(guī)則的順序。用這個(gè)順序來(lái)計(jì)算語(yǔ)義規(guī)則就得到輸入符號(hào)串的翻譯屬性計(jì)算有樹(shù)遍歷的和一遍掃描的方法思考:P26的例子,其依賴圖的拓?fù)渑判?,和語(yǔ)義規(guī)則的計(jì)算順序分別是什么?二.S-屬性文法和自下而上翻譯S-屬性文法是只含有綜合屬性的屬性文法綜合屬性可以在分析輸入符號(hào)串的同時(shí)自下而上來(lái)計(jì)算S-屬性文法的翻譯器通??山柚贚R分析器實(shí)現(xiàn)分析器可以保存與棧中文法符號(hào)有關(guān)的綜合屬性值,每當(dāng)進(jìn)行歸約時(shí),新的屬性值就由棧中正在歸約的產(chǎn)生式右邊符號(hào)的屬性值來(lái)計(jì)算對(duì)例8.1的輸入串2+3*5語(yǔ)法樹(shù)如圖8.5:假定有一個(gè)LR語(yǔ)法分析器,現(xiàn)在把它的分析棧擴(kuò)充,使得每個(gè)文法符號(hào)都跟有語(yǔ)義值,即把棧的結(jié)構(gòu)看成圖8.6所示:同時(shí)把LR分析器的能力擴(kuò)大,使它不僅執(zhí)行語(yǔ)法分析任務(wù),還能在用某個(gè)產(chǎn)生式進(jìn)行歸約的同時(shí)調(diào)用相應(yīng)的語(yǔ)義子程序,完成在例8.1的屬性文法中描述的語(yǔ)義動(dòng)作每步工作后的語(yǔ)義值保存在擴(kuò)充棧的“語(yǔ)義值棧”欄中采用的LR分析表為表7.8,不過(guò)要將其中的i改為digit,分析和計(jì)值2+3*5的過(guò)程列在圖8.7所示:ACTIONGOTOd+*()#ETF012345678910111S5S7r4r4r4r4r3r3r3r3r6r6r6r6acc3S42S62S48S539S43S510S5S4S11S6r5r5r5r5S7r2r2r2r1r1r12+3*5的分析和計(jì)值過(guò)程-2-3-5三.L-屬性文法在自上而下分析中的實(shí)現(xiàn)一個(gè)屬性文法稱為L(zhǎng)-屬性文法,如果對(duì)于每個(gè)產(chǎn)生式

A

X1X2…Xn,其每個(gè)語(yǔ)義規(guī)則中的每個(gè)屬性或者是綜合屬性,或者是Xj(1≤j≤n)的一個(gè)繼承屬性且這個(gè)繼承屬性僅依賴于:(1)產(chǎn)生式Xj在左邊符號(hào)X1,X2,…Xj-1的屬性(2)A的繼承屬性例8.2描述變量證明語(yǔ)句中類型信息的屬性文法是L-屬性文法S-屬性文法一定是L-屬性文法,因?yàn)椋?)、(2)限制只用于繼承屬性L-屬性文法允許一次遍歷就計(jì)算出所有屬性值例8.3將中綴表達(dá)式翻譯成相應(yīng)的后綴表達(dá)式的屬性文法,其中addop表示+或-E

EaddopTprint(addop.Lexeme)|TT

numprint(num.val)

比如對(duì)串2+3-5的分析同時(shí)執(zhí)行語(yǔ)義動(dòng)作打印出23+5-如下所示:語(yǔ)法分析樹(shù)中加虛線聯(lián)結(jié)的語(yǔ)義結(jié)點(diǎn),形成一個(gè)可說(shuō)明語(yǔ)義動(dòng)作的樹(shù),如圖8.8:打印結(jié)果:23+5-例.設(shè)文法及其相應(yīng)的語(yǔ)義動(dòng)作如下:

S→bTc{print“1”}S→a{print“2”}T→R{print“3”}R→R/S{print“4”}R→S{print“5”}采用自下而上語(yǔ)法制導(dǎo)翻譯,給出輸入串bR/bTc/bSc/ac的翻譯結(jié)果分析:首先對(duì)輸入串

bR/bTc/bSc/ac畫(huà)出語(yǔ)法樹(shù):再考慮歸約時(shí)執(zhí)行相應(yīng)語(yǔ)義動(dòng)作SScTbRS/R/RS/RcTbaScTbR

S→bTc{print“1”}S→a{print“2”}T→R{print“3”}R→R/S{print“4”}R→S{print“5”}14翻譯結(jié)果為:53142431SScTbRS/R/RS/RcTbaScTbRSScTbRS/R/RS/RcTbaScTbRR→R/S

S→bTcS→aT→RR→S輸出為:1453142431輸入是bR/bTc/bSc/ac給出相應(yīng)語(yǔ)義動(dòng)作(翻譯方案){print“1”}{print“2”}{print“3”}{print“4”}{print“5”}例8.3是一個(gè)含左遞歸規(guī)則的文法,如采用LL(1)分析必須改寫(xiě)文法如下:E

TRR

addopTR1|εT

num這時(shí)2+3-5的語(yǔ)法樹(shù)如圖8.9:LL(1)這種自上而下分析文法的分析過(guò)程,從概念上說(shuō)可以看成是深度優(yōu)先建立語(yǔ)法樹(shù)的過(guò)程,因此,可以在自上而下語(yǔ)法分析的同時(shí)實(shí)現(xiàn)L屬性文法的計(jì)算例8.4(中綴表達(dá)式翻譯成相應(yīng)的后綴表達(dá)式):E

TRR

addopT{print(addop.Lexeme)}R1|εT

num{print(num.val)}把語(yǔ)義動(dòng)作嵌在右部文法符號(hào)T和R之間,這種語(yǔ)義處理的描述形式稱為翻譯模式翻譯模式是適合語(yǔ)法制導(dǎo)翻譯的另一種描述形式翻譯模式給出了使用語(yǔ)義規(guī)則進(jìn)行計(jì)算的次序,可把某些實(shí)現(xiàn)細(xì)節(jié)表示出來(lái)一般轉(zhuǎn)換左遞歸翻譯模式的方法簡(jiǎn)述如下:假設(shè)翻譯模式為:A

A1Y{A.a:=g(A1.a,Y.y)}A

X{A.a:=f(X.x)}每個(gè)文法符號(hào)都有一個(gè)綜合屬性,用相應(yīng)的小寫(xiě)字母表示,

g和f是任意函數(shù)。消除左遞歸,文法轉(zhuǎn)換成:A

XRR

YR|ε再考慮語(yǔ)義動(dòng)作,則翻譯模式為,其中使用了R的繼承屬性

i和綜合屬性s:A

X

{R.i:=f(X.x)}R{A.a:=R.s}R

Y{R1.i:=g(R.i,Y.y)}R1{R.s:=R1.s}R

ε{R.s:=R.i}四.L-屬性文法在自下而上分析中的實(shí)現(xiàn)實(shí)現(xiàn)自下而上計(jì)算繼承屬性方法:方法一:從翻譯模式中去掉嵌入在產(chǎn)生式中間的動(dòng)作引入新的非終結(jié)符N和產(chǎn)生式N

ε,把嵌入在生產(chǎn)式中間的動(dòng)作用非終結(jié)符N代替,并把這個(gè)動(dòng)作放在產(chǎn)生式后面例如下面的翻譯模式:E

TRR

+T{print(‘+’)}R1R

-T{print(‘-’)}R1R

εT

num{print(num,val)}引入M和N,變換后的翻譯模式如下,原嵌入在產(chǎn)生式中間的動(dòng)作都在產(chǎn)生式后面了E

TRR

+TMR1R

-TNR1R

εT

num{print(num.val)}M

ε{print(‘+’)}N

ε{print(‘-’)}方法二:用綜合屬性代替繼承屬性,改變基礎(chǔ)文法是一種可能的辦法例如,一個(gè)Pascal的說(shuō)明由一標(biāo)識(shí)符序列后跟類型組成,如

m,n:integer。這種說(shuō)明語(yǔ)句的文法可由下面的形式的產(chǎn)生式構(gòu)成:D

L:TT

integer|charL

L,id|id一個(gè)解決的方法是重新構(gòu)造文法,借以實(shí)現(xiàn)用綜合屬性代替繼承屬性例如一個(gè)等價(jià)的文法如下:D

idLL

,idL|:TT

integer|char屬性文法如下:D

idL{addtype(id.entry,L.type)}L

idL1{L.type:=L1.type;addtype(id.entry,L.type)}|:T{L.type:=T.type}T

integer{T.type:=int}|char{T.type:=ch}8.3中間代碼的形式用于編譯程序源程序經(jīng)過(guò)語(yǔ)義分析被譯成中間代碼序列(中間語(yǔ)言的語(yǔ)句)用中間語(yǔ)言過(guò)渡的好處:便于編譯系統(tǒng)的實(shí)現(xiàn)、移植、代碼優(yōu)化描述方法利用屬性文法描述如何將各種語(yǔ)句和表達(dá)式翻譯成中間代碼工作方式分析與綜合并行進(jìn)行每識(shí)別出一個(gè)語(yǔ)言結(jié)構(gòu)時(shí),完成相應(yīng)的語(yǔ)義檢查與中間代碼生成編譯中的語(yǔ)義分析

編譯中常用的中間代碼:逆波蘭式四元式三元式樹(shù)形表示特點(diǎn)形式簡(jiǎn)單、語(yǔ)義明確、便于翻譯獨(dú)立于目標(biāo)語(yǔ)言8.3中間代碼的形式8.3中間代碼的形式一.逆波蘭記號(hào)(后綴式)(后根遍歷)由波蘭邏輯學(xué)家盧卡西維奇發(fā)明這種表示法將運(yùn)算對(duì)象寫(xiě)在前面,把運(yùn)算符號(hào)寫(xiě)在后面圖8.11給出了程序設(shè)計(jì)語(yǔ)言中的逆波蘭表示形式:程序設(shè)計(jì)語(yǔ)言中的表示逆波蘭表示a*bab*a*b+cab*c+a*(b+c/d)abcd/+*a*b+c*dab*cd*+生成后綴式的屬性文法逆波蘭形式可以推廣到其他語(yǔ)法結(jié)構(gòu):賦值語(yǔ)句V=E逆波蘭式VE=條件語(yǔ)句逆波蘭式ifES1;elseS2ES1S2¥二.三元式和樹(shù)形表示三元式的組成:(op,ARG1,ARG2)例如:a:=b*c+b*d(1)(*,b,c)(2)(*,b,d)(3)(+,(1),(2))(4)(:=,(3),a)樹(shù)形表示是三元式表示的翻版,上述三元式可表示成右邊的樹(shù)表示:當(dāng)OP是一目運(yùn)算時(shí),常常將運(yùn)算對(duì)象定義為arg1。

1.三元式出現(xiàn)的順序和語(yǔ)法成份的計(jì)值順序相一致。三元式的特點(diǎn):2.三元式之間的聯(lián)系是通過(guò)指示器實(shí)現(xiàn)的。間接三元式(1)間接三元式表:用來(lái)存放各三元式本身。(2)間接碼表:按執(zhí)行各三元式的順序,依次列出各三元式在三元式表中的位置。注意:間接三元式表中不存放重復(fù)的三元式。例如

語(yǔ)句X=(A+B)*C

Y=D↑(A+B)三元式序列(1)(+,A,B)(2)(*,(1),C)(3)(=,X,(2))(5)(↑,D,(4))(4)(+,A,B)(6)(=,Y,(5))間接三元式間接碼表三元式表(1)(2)(3)(1)(4)(5)(1)(+,A,B)(2)(*,(1),C)(3)(=,X,(2))(4)(↑,D,(1))(5)(=,Y,(4))三.四元式四元式的組成:(op,ARG1,ARG2,RESULT)例如:a:=b*c+b*d(1)(*,b,c,t1)(2)(*,b,d,t2)(3)(+,t1,t2,t3)(4)(:=,t3,-,a)為了直觀,也把四元式的形式寫(xiě)成簡(jiǎn)單賦值形式:(1)t1:=b*c(2)t2:=b*d(3)t3:=t1+t2(4)a:=t3(jump,-,-,L)gotoL(jrop,B,C,L)ifBropCgotoL例題:寫(xiě)出算術(shù)表達(dá)式:A+B*(C-D)+E/(C-D)↑N①四元式②三元式③間接三元式④逆波蘭⑤樹(shù)形表示

①表達(dá)式的四元式序列:

(1)(-,C,D,Tl)(2)(*,B,T1,T2)(3)(+,A,T2,T3)(4)(一,C,D,T4)(5)(↑,T4,N,T5)(6)(/,E,T5,T6)

(7)(+,T3,T6,T7)

表達(dá)式:A+B*(C-D)+E/(C-D)↑N(1)(-,C,D)(2)(*,B,(1))(3)(+,A,(2))(4)(↑,(1),N)(5)(/,E,(4))(6)(+,(3),(5))②表達(dá)式的三元式序列(1)(-,C,D)

(2)(*,B,(1))(3)(+,A,(2))(4)(-,C,D)(5)(↑,(4),N)(6)(/,E,(5))(7)(+,(3),(6))表達(dá)式:A+B*(C-D)+E/(C-D)↑N間接碼表(1)(2)(3)(1)(4)(5)(6)間接碼表表明了執(zhí)行間接三元式的順序(1)(2)(3)(1)(4)(5)(6)間接碼表③表達(dá)式的間接三元式④逆波蘭:

ABCD-*+ECD-N↑/+⑤樹(shù)形表示:表達(dá)式:A+B*(C-D)+E/(C-D)↑N真題:(5分)在答題紙上給出下面表達(dá)式的逆波蘭表示

(用@表示取負(fù)操作,用-表示減法操作)

-a+b*(-c+d)答案:a@bc@d+*+8.4簡(jiǎn)單賦值語(yǔ)句的翻譯簡(jiǎn)單賦值語(yǔ)句為不包含數(shù)組元素﹑記錄的賦值語(yǔ)句四元式的組成:(op,ARG1,ARG2,ti)賦值語(yǔ)句的四元式是怎么翻譯的呢?首先對(duì)id表示的單詞定義-屬性,用做語(yǔ)義變量,用Lookup()語(yǔ)義函數(shù)審查是否出現(xiàn)符號(hào)表中,如在,則返回一指向該登錄項(xiàng)的指針,否則返回nil。語(yǔ)義過(guò)程emit:表示輸出四元式到輸出文件上語(yǔ)義過(guò)程newtemp:表示生成一臨時(shí)變量,每調(diào)用一次,生成一新的臨時(shí)變量語(yǔ)義變量E.place:表示存放非終結(jié)符E值的變量名在符號(hào)表的登錄項(xiàng)或一整數(shù)項(xiàng)(若此變量是一個(gè)臨時(shí)變量)圖8.12列出了翻譯賦值語(yǔ)句到四元式的語(yǔ)義描述:(1)Sid:=E {p:=lookup();ifp≠nilthenemit(p‘:=’E.place)elseerror}(2)EE1+E2{E.place:=newtemp;

emit(E.place‘:=’E1.place‘+’E2.place)}(3)EE1*E2{E.place:=newtemp;

emit(E.place‘:=’E1.place‘*’E2.place)}(4)E-E1{E.place:=newtemp;

emit(E.place‘:=’‘uminus’E1.place)}(5)E(E1){E.place:=E1.place)(6)Eid{p:=lookup();ifp≠nilthenE.place:=p)elseerror}運(yùn)算合法性檢查利用符號(hào)表保存的名字類型類型自動(dòng)轉(zhuǎn)換填加專用指令臨時(shí)變量空間的統(tǒng)計(jì)了解需求、及時(shí)釋放表達(dá)式翻譯中的其他問(wèn)題若考慮到變量的類型檢查和轉(zhuǎn)換,則圖8.12中的第(3)條產(chǎn)生式及其有關(guān)語(yǔ)義描述如圖8.13:{E.place∶=newtemp;ifE1.type=intANDE2.type=intthen

beginemit(E.place,′∶=′,E1.place,′*i′,E2.place);

E.type∶=int

endelseifE1.type=realANDE2.type=realthen

beginemit(E.place,′∶=′,E1.place,′*r′,E2.place);

E.type∶=real

endelseifE1.type=int/*andE2.type=real

*/

then

begint∶=newtemp;

emit(t,′∶=′,′itr′,E1.place);

emit(E.place,′∶=′,t,′*r′,E2.place);

E.type∶=real

end

else

/*E1·type=realandE2.type=int*/

begint∶=newtemp;

emit(t,′∶=′;′itr′,E2.place);

emit(E.place,′∶=′,E1.place,′*r′,t);

E.type∶=real

end;

8.5布爾表達(dá)式的翻譯布爾表達(dá)式的兩個(gè)作用:計(jì)算邏輯值用做改變控制流語(yǔ)句中的條件表達(dá)式布爾表達(dá)式是由布爾算符(not、and、or)施于布爾變量或關(guān)系表達(dá)式而成。即布爾表達(dá)式的形式為E1

ropE2,其中E1和E2都是算術(shù)表達(dá)式,rop是關(guān)系符,如<=,<,=,>=,≠E

EandE|EorE|notE|idropid|true|false,按通常習(xí)慣,約定布爾算符的優(yōu)先順序(從高到低)為not、and、or,并且and和or服從左結(jié)合一.布爾表達(dá)式的翻譯方法計(jì)算出各部分的真假值,最后計(jì)算出整個(gè)表達(dá)式的值如表達(dá)式:1or(not0and0)or0布爾表達(dá)式:aorbandnotc翻譯成的四元式序列為:(1)t1:=notc(2)t2:=bandt1(3)t3:=aort2采取某種優(yōu)化措施,只計(jì)算部分表達(dá)式布爾表達(dá)式到四元式的翻譯

A∨B解釋成

A∧B解釋成

A解釋成ifAthentrueelseBifAthenBelsefalseifAthenfalseelsetrue對(duì)a<b可看成等價(jià)的條件語(yǔ)句ifa<bthen1else0,它翻譯成的四元式序列為:(1)ifa<bgoto(4)(2)t:=0(3)goto(5)(4)t:=1(5)…其中用臨時(shí)變量t存放布爾表達(dá)式a<b的值,(5)為后續(xù)的四元式序號(hào)下面的圖8.14給出了將布爾表達(dá)式翻譯成四元式的描述,其中nextstat給出在輸出序列中下一四元式序號(hào)emit過(guò)程每被調(diào)用一次,nextstat增加1E→E1orE2

{E.place∶=newtemp;

emit(E.place’′∶=′E1.place

′or′E2.place)}E→E1andE2

{E.place∶=newtemp;

emit(E.place′∶=′E1.place′and′E2.place)}E→notE1

{E.place∶=newtemp:;

emit(E.place′∶=′not′E1.place)}E→(E1)

{E.place∶=E1.place}E→id1

ropid2

{E.place∶=newtemp;

emit(′if′id1.placeropid2.place′goto′

nextstat+3);

emit(E.Place′∶=′′0′);

emit(′goto′nextstat+2);

emit(E.place′∶=′′1′)}E→true

{E.place∶=newtemp;

emit(E.place′∶=′′1′)}E→false

{E.place∶=newtemp;

emit(E.place′∶=′′0′)}二.控制語(yǔ)句中布爾表達(dá)式的翻譯If-then、if-then-else、while-do的語(yǔ)法為:

S

ifEthenS1|ifEthenS1elseS2|whileEdoS1這些語(yǔ)句的代碼結(jié)構(gòu)示意圖分別在圖8.15中:翻譯的基本思路:對(duì)于E為aropb的形式生成代碼為:

ifaropbgoto

E.true

和goto

E.false其中,使用E.true和E.false分別表示E的真假出口轉(zhuǎn)移目標(biāo)例8.5

a<borc<dande>f翻譯為如下四元式序列:(1)ifa<bgoto

E.true(2)goto

(3)(3)ifc<dgoto

(5)//a<bisfalse,thennextcompare(4)goto

E.false(5)ife>fgoto

E.true(6)goto

E.false例if

a<borc<dande>fthenS1elseS2的四元式序列:(1)ifa<bgoto

(7)//后面不用比較了(2)goto

(3)//a<b為假,繼續(xù)比較or的其他部分(3)ifc<dgoto

(5)//還需要看e>f是否為真(4)goto

(p+1)(5)ife>fgoto

(7)//c<d與e>f都為真,故整個(gè)表達(dá)式為真(6)goto

(p+1)(7)(關(guān)于S1的四元式)┇(p)goto(q)(p+1)(關(guān)于S2的四元式)┇(q)為了記錄需回填地址的四元式,常采用一種“拉鏈”的辦法,把需回填E.true/E.false的四元式拉成一鏈,稱做真/假鏈拉鏈的方式是這樣的,若有四元式序列:則鏈成(10)…goto

(0)┇(20)…goto

(10)┇(30)…goto

(20)(10)…goto

E.true┇(20)…goto

E.true┇(30)…goto

E.true拉鏈返填地址(30)稱作鏈?zhǔn)?,地址?0)為鏈尾,0為鏈尾標(biāo)志(1)ifa<bgoto(E.true)

(2)goto(3)

(3)ifc<dgoto(5)

(4)goto(E.false)

(5)ife<fgoto(E.true)

(6)goto(E.false)(E.true)(S1的四元式序列

…………)(p)goto

(q)

(E.false)(S2的四元式序列

……

(q-1)……)例if

a<borc<dande>fthenS1elseS2的四元式序列:語(yǔ)義描述使用的量:E.true“真”鏈,E.false“假”鏈

E.codebeginE的第一個(gè)四元式

nextstat

下一四元式地址Merge(p1,p2),把p1和p2為鏈?zhǔn)椎膬蓷l鏈合并為1條,返回合并后的鏈?zhǔn)字?。即將p2的鏈尾第4區(qū)段改為p1,合并后的鏈?zhǔn)诪閜2,除非p2是空鏈Backpatch(p,t),把p所鏈接的每個(gè)四元式的第4區(qū)段都填為t其中使用語(yǔ)義值codebegin與非終結(jié)符E相連,表示表達(dá)式E的第1個(gè)四元式語(yǔ)句序號(hào)下面結(jié)合例子來(lái)分析拉鏈回填技術(shù)拉鏈返填自下而上的分析中布爾表達(dá)式的一種翻譯方案如圖8.16:(1)EE1orE2{backpatch(E1.false,E2.codebegin);

E.codebegin:=E1.codebegin;

E.true:=merge(E1.true,E2.true)

E.false:=E2.false}(2)EE1andE2{backpatch(E1.true,E2.codebegin);

E.codebegin:=E1.codebegin;

E.true:=E2.true;

E.false:=merge(E1.false,E2.false);}(3)EnotE1{E.true:=E1.false;

E.codebegin:=E1.codebegin;

E.false:=E1.true;}(4)E(E1){E.true:=E1.true;

E.codebegin:=E1.codebegin;

E.false:=E1.false;}(5)Eid1

ropid2

{E.true:=nextstat;

E.codebegin:=nextstat;

E.false:=nextstat+1;

emit(‘if’id1.place’rop’id2.place’goto’-)

emit(‘goto’-)}(6)Etrue

{E.true:=nextstat;

E.codebegin:=nextstat;

emit(‘goto’-)}(7)Efalse

{E.false:=nextstat;

E.codebegin:=nextstat;

emit(‘goto’-)}例a<borc<dande>f將分析產(chǎn)生語(yǔ)法樹(shù)時(shí)的語(yǔ)義動(dòng)作結(jié)果真、假鏈情況注釋在相應(yīng)結(jié)點(diǎn)處,如圖8.17所示:a<borc<dande>f的翻譯過(guò)程:1.a<borc<dande>fEorc<dande>f{E.code=100;E.tr=100;E.fa=101;}

ifa<bgoto-101goto-依據(jù):E->id1

ropid2的語(yǔ)義規(guī)則,設(shè)nextstat=1002.E

orc<dande>f

EorE(1)ande>f{E(1).code=102;E(1).tr=102;E(1).fa=103;}102ifc<dgoto-103goto-調(diào)用2個(gè)emit語(yǔ)句后,此時(shí)nextstat=102a<borc<dande>f的翻譯過(guò)程:3.EorEande>f

EorE

andE(2){E(2).code=104;E(2).

tr=104;E(2).fa=105;}104ife>fgoto-105goto-調(diào)用2個(gè)emit語(yǔ)句后,此時(shí)nextstat=104a<borc<dande>f的翻譯過(guò)程:4.E(0)orE(1)andE(2)E(0)orE102ifc<dgoto

103goto

依據(jù):E->E1andE2的語(yǔ)義規(guī)則E(1)andE(2)

歸約為E{bp(E(1).tr,E(2).code)=bp(102,104);

E.code=E(1).code=102

E.tr=E(2).tr=104;

E.fa=merg(E(1).fa,E(2).fa)=merg(103,105)={103,105};}104105goto

103a<borc<dande>f的翻譯過(guò)程:5.E(1)orE(2)E101ifc<dgoto

依據(jù):E->E1orE2的語(yǔ)義規(guī)則E(1)orE(2)

歸約為E{bp(E(1).fa,E(2).code)=bp(101,102);

E.code=E(1).code=100

E.fa=E(2).fa=103,105;

E.tr=merg(E(1).tr,E(2).tr)=merg(100,104)={100,104};}102104goto

100a<borc<dande>f的翻譯過(guò)程:最終的翻譯結(jié)果:100ifa<bgoto–101goto102102ifc<dgoto104103goto-104ife>fgoto100105goto103“真”鏈?zhǔn)譋.true為104“假”鏈?zhǔn)譋.false為1058.6控制結(jié)構(gòu)的翻譯一.條件轉(zhuǎn)移一般使用下面文法G[S]定義這些語(yǔ)句:(1)S

ifEthenS(2)|ifEthenSelseS(3)|whileEdoS(4)|beginLend(5)|A(6)L

L;S(7)|S

S語(yǔ)句,L語(yǔ)句串,A賦值句,E布爾表達(dá)式為了能及時(shí)地回填有關(guān)四元式串的轉(zhuǎn)移目標(biāo),對(duì)G[S]文法進(jìn)行改寫(xiě),改成G`[S]:(1)S

CS1(2)|TpS2(3)|WdS3(4)|beginLend(5)|A(6)L

LsS1(7)S2(8)C

ifEthen(9)Tp

CSelse(10)Wd

WEdo(11)W

while(12)Ls

L;下面給出這個(gè)文法的各個(gè)產(chǎn)生式相應(yīng)的語(yǔ)義動(dòng)作:S

CS1

{S.chain:=merge(C.chain,S1.chain)}S

TpS2

{S.chain:=merge(Tp.chain,S2.chain)}S

WdS3

{backpatch(S3.chain,Wd.codebegin)

emit(‘GOTO’W.codebegin)

S.chain:=Wd.chain}S

beginLend

{S.chain:=L.chain}S

A

{S.chain:0/*空鏈*/}L

LsS1

{L.chain:=S1.chain}L

S{L.chain:=S.chain}C

ifEthen{backpatch(E.true,nextstat)

C.chain:=E.false}Tp

CSelse

{q:=nextstat

emit(‘GOTO’-)

backpatch(C.chain,nextstat)

Tp.chain:=merge(S.chain,q)}W

while

{W.codebegin:=nextstat}Wd

WEdo{backpatch(E.true,nextstat

Wd.chain:=E.false

Wd.codebegin:=W.codebegin}Ls

L;{backpatch(L.chain,nextstat)}按照上述文法產(chǎn)生式相應(yīng)的語(yǔ)義動(dòng)作,加上前述關(guān)于賦值句和布爾表達(dá)的翻譯法,語(yǔ)句while(A<B)doif

(C<D)thenX:=Y+Z將被翻譯成如下的一串四元式:100

ifA<Bgoto102101

goto107102

ifC<Dgoto104103

goto100104

T:=Y+Z105

X:=T106

goto100107二.開(kāi)關(guān)語(yǔ)句假定要討論的開(kāi)關(guān)語(yǔ)句的形式為:switchEofcaseV1:S1caseV2:S2┇caseVn-1:Sn-1default:Snendcase語(yǔ)句翻譯成如下的一連串條件轉(zhuǎn)移語(yǔ)句:t:=E;L1:ift≠V1gotoL2S1;gotonext;L2:ift≠V2

gotoL3S2gotonext;┇Ln-1:ift≠Vn-1goto

LnSn-1;gotonext;Ln:Sn;next;另外一種實(shí)現(xiàn)辦法:建立一個(gè)n項(xiàng)的二元組表,第1元為Vi的值,第2元為Vi對(duì)應(yīng)的語(yǔ)句Si的標(biāo)號(hào)(或序號(hào))編譯程序構(gòu)造一張這樣的表,產(chǎn)生把選擇子E的值傳送到該表末項(xiàng)第一元的指令。該項(xiàng)的另一元是缺省情況的語(yǔ)句號(hào)并構(gòu)造一個(gè)對(duì)E值查該表的程序,即該程序把E的值和二元組表項(xiàng)中的各個(gè)Vi值相比,若與某個(gè)Vi匹配,就去執(zhí)行相應(yīng)的Si,如果找不到這樣的Vi,則末項(xiàng)自動(dòng)匹配,便去執(zhí)行Sn圖8.18給出開(kāi)關(guān)語(yǔ)句的一種翻譯結(jié)果(中間代碼),其中把所有的測(cè)試都放在最后,以便目標(biāo)代碼生成階段產(chǎn)生高質(zhì)量的目標(biāo)指令fori:=E1stepE2

utilE3doS1為了簡(jiǎn)單起見(jiàn),假定E2總是正的。在這種假定下,上述循環(huán)句的意義等價(jià)于::i:=E1;gotoOVER;AGAIN:i:=i+E2;OVER:ifi≤E3thenbeginS1;gotoAGAINend;改寫(xiě)成如下的產(chǎn)生式:F1→fori:=E1F2→

F1stepE2F3→

F2untilE3S→

F3doS1三.for循環(huán)語(yǔ)句下面是這些產(chǎn)生式相應(yīng)的語(yǔ)義動(dòng)作:F1

fori:=E1

{emit(entry(i),’:=‘,E1.place);F1.place:=entry(i);/*保存控制變量在符號(hào)表中的位置*/F1.chain:=nextstat;

emit(‘goto’-);/*gotoOVER*/F1.codebegin:=nextstat;/*保存AGAIN的地址*/}F2

F1stepE2

{F2.codebegin:=F1.codebegin;/*保存AGAIN的地址*/

F2.place:=F1.place;/*保存控制變量在符號(hào)表中的位置*/

emit(F1.place‘:=‘,E2.place,’+’F1.place);//F1.place:=entry(i)//相當(dāng)于輸出i:=i+E2.place;backpatch(F1.chain,nextstat);/*回填上面的gotoOVER*/}F3

F2untilE3

{F3.codebegin:=F2.codebegin;q:=nextstat;

emit(‘if’F2.place,’≤’,E3.place,’goto’q+2);/*若i≤E3轉(zhuǎn)去執(zhí)行循環(huán)體的第1個(gè)四元式*/;

F3.chain:=nextstat;

emit(‘goto’-);/*轉(zhuǎn)離循環(huán)*/}S

F3doS1

/*這里是語(yǔ)句S1的相應(yīng)代碼*/

{emit(‘goto’F3.codebegin)/*gotoAGAIN*/;

backpatch(S1.chain,F3.codebegin);

S.chain:=F3.chain/;*轉(zhuǎn)離循環(huán)的轉(zhuǎn)移目標(biāo)留待處理外層

S時(shí)再回填*/}例如,循環(huán)語(yǔ)句forI:=1step1untilNdoM:=M+I將被翻譯成如下的四元式序列:100

I:=1101

goto103102

I:=I+1103

ifI≤Ngoto105104

goto108105

T:=M+I106

M:=T107

goto102108

exit、break,是一種結(jié)構(gòu)化的方式跳出循環(huán)而設(shè)置的語(yǔ)句,它們的作用是引起外層循環(huán)的終止為處理exit語(yǔ)句,編譯程序?qū)γ總€(gè)循環(huán)可使用一個(gè)稱為“循環(huán)描述符”的量來(lái)記錄一些必要的信息四.出口語(yǔ)句exit語(yǔ)句所指的循環(huán)可以是無(wú)名的,即是最內(nèi)層循環(huán),可以使用一指針currentloop指向其描述符,所有打開(kāi)循環(huán)的描述符使用棧式方式存儲(chǔ)帶標(biāo)號(hào)語(yǔ)句的形式是L:S;goto語(yǔ)句的形式是gotoL如果gotoL是一個(gè)向上轉(zhuǎn)移的語(yǔ)句,那么L是定義的如果gotoL是一個(gè)向下轉(zhuǎn)移的語(yǔ)句,那么L尚未定義五.goto語(yǔ)句過(guò)程調(diào)用的實(shí)質(zhì)是把程序控制轉(zhuǎn)移到子程序(過(guò)程段)如果實(shí)在參數(shù)是一個(gè)變量或數(shù)組元素,那么就直接傳遞它的地址如果實(shí)參是其他表達(dá)式,如A+B或2,那么就先把它的值計(jì)算出來(lái)并存放在某個(gè)臨時(shí)單元T中,然后傳送T的地址,所有實(shí)在參數(shù)的地址應(yīng)存放在被調(diào)用的子程序能夠取得到的地方六.過(guò)程調(diào)用的四元式產(chǎn)生在被調(diào)用的子程序(過(guò)程)中,每個(gè)形式參數(shù)都有一個(gè)單元(形式單元)用來(lái)存放相應(yīng)的實(shí)在參數(shù)的地址,在子程序段中對(duì)形式參數(shù)的任何引用都當(dāng)作是對(duì)形式單元的間接訪問(wèn)當(dāng)通過(guò)轉(zhuǎn)子指令進(jìn)入子程序后,子程序段的第一步工作就是把實(shí)在參數(shù)的地址取到對(duì)應(yīng)的形式單元中,然后再開(kāi)始執(zhí)行本段中的語(yǔ)句傳遞實(shí)在參數(shù)地址的簡(jiǎn)單辦法,把實(shí)參的地址逐一放在轉(zhuǎn)子指令的前面如過(guò)程調(diào)用callS(A+B,Z)被翻譯成:計(jì)算A+B置于T中的代碼/*T:=A+B*/parT/*第1個(gè)實(shí)參地址*/parZ/*第2個(gè)實(shí)參地址*/callS/*轉(zhuǎn)子指令*/考慮一個(gè)描述過(guò)程調(diào)用語(yǔ)句的文法:(1)S

calli(<arglist>)(2)<arglist>

<arglist>1,E(3)<arglist>

E賦予非終結(jié)符arglist一項(xiàng)語(yǔ)義值,叫數(shù)據(jù)隊(duì)列,用它記錄每個(gè)實(shí)在參數(shù)地址。通過(guò)計(jì)數(shù)par的個(gè)數(shù)來(lái)記錄實(shí)在參數(shù)個(gè)數(shù)過(guò)程調(diào)用語(yǔ)法制導(dǎo)翻譯的基本語(yǔ)義描述:(1)S

calli(<arglist>){FOR隊(duì)列arglist.queue的每一項(xiàng)pDOGEN(par,-,-,p);//endfor

GEN(call,-,-,entry(i))}(2)<arglist>

<arglist>1,E{把E.place排在arglist1.queue的末端;

arglist.queue:=arglist1.queue}(3)<arglist>

E{建立一個(gè)arglist.queue,它只包含一項(xiàng)E.place}真題:(5分)布爾表達(dá)式

E=a<bandc<dande<forg<h四元式序列:E.codebegin____E.true____E.false____100ifa<bgoto____101goto____102ifc<dgoto____103goto____104ife<fgoto____105goto____106ifg<hgoto____107goto____108表達(dá)式為真的代碼段200表達(dá)式為假的代碼段(1)EE1orE2{backpatch(E1.false,E2.codebegin);

E.codebegin:=E1.codebegin;

E.true:=merge(E1.true,E2.true)

E.false:=E2.false}(2)EE1andE2{backpatch(E1.true,E2.codebegin);

E.codebegin:=E1.codebegin;

E.true:=E2.true;

E.false:=merge(E1.false,E2.false);}backpatch(p,t)把p所鏈接的每個(gè)四元式的第4個(gè)區(qū)段都填為tE.codebegin表示表達(dá)式E的第1個(gè)四元式語(yǔ)句序號(hào)merge(p1,p2)把p1和p2為鏈?zhǔn)椎膬蓷l鏈合并為1條,返回合并后的鏈?zhǔn)字?。即將p2的鏈尾第4區(qū)段改為p1,合并后的鏈?zhǔn)诪閜2,除非p2是空鏈E.true和E.false分別表示E的真假出口轉(zhuǎn)移目標(biāo)一旦整個(gè)布爾表達(dá)式的真假出口確定,則可沿“真”“假”鏈為相應(yīng)的四元式填上真題答案一:(5分)布爾表達(dá)式

E=a<bandc<dande<forg<h四元式序列:E.codebegin100E.true106E.false107100ifa<bgoto

102101goto

106102ifc<dgoto

104103goto

106104ife<fgoto

0/-/真出口105goto

106106ifg<hgoto

0/-/真出口107goto

0/-/假出口108表達(dá)式為真的代碼段200表達(dá)式為假的代碼段真題答案二:(5分)布爾表達(dá)式

E=a<bandc<dande<forg<h四元式序列:E.codebegin100E.true106E.false107100ifa<bgoto

102101goto

106102ifc<dgoto

104103goto

106104ife<fgoto

108105goto

200(106?)106ifg<hgoto

108107goto

200108表達(dá)式為真的代碼段200表達(dá)式為假的代碼段真題答案三:(5分)布爾表達(dá)式

E=a<bandc<dande<forg<h四元式序列:E.codebegin100E.true106E.false107100ifa<bgoto

102101goto

106102ifc<dgoto

104103goto

101104ife<fgoto

-105goto

103106ifg<hgoto

104107goto

-真題答案四:(5分)布爾表達(dá)式

E=g<hora<bandc<dande<f四元式序列:E.codebegin100E.true106E.false107100ifg<hgoto

-101goto

102102ifa<bgoto

104103goto

-104ifc<dgoto

106105goto

103106ife<fgoto

100107goto

1058.7說(shuō)明語(yǔ)句的翻譯程序設(shè)計(jì)語(yǔ)言中的說(shuō)明語(yǔ)句旨在定義各種形式的有名名體,如常量、變量、數(shù)組、記錄(結(jié)構(gòu))、過(guò)程、子程序等等,說(shuō)明語(yǔ)句的種類也多,對(duì)象說(shuō)明、變量說(shuō)明、類型說(shuō)明、過(guò)程說(shuō)明等編譯程序把說(shuō)明語(yǔ)句中定義的名字和性質(zhì)登記在符號(hào)表中,用以檢查名字的引用和說(shuō)明是否一致許多說(shuō)明語(yǔ)句的翻譯并不生成目標(biāo)代碼過(guò)程說(shuō)明和動(dòng)態(tài)數(shù)組的說(shuō)明有相應(yīng)的代碼最簡(jiǎn)單的說(shuō)明語(yǔ)句的語(yǔ)法描述為:

D

integer<namelist>|real<namelist><namelist>

<namelist>,id|id即使用關(guān)鍵字integer和real定義一串名字的性質(zhì)對(duì)這種說(shuō)明語(yǔ)句的翻譯是指在符號(hào)表中登錄該名和性質(zhì)用8.2.4的方法把上述文法改寫(xiě)成:

D

D1,id

|integerid

|realid一.簡(jiǎn)單說(shuō)明語(yǔ)句的翻譯給非終結(jié)符D一個(gè)語(yǔ)義變量D.att,用以記錄說(shuō)明語(yǔ)句所引入的名字的性質(zhì)(

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論