版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
編譯原理下第五章語(yǔ)法制導(dǎo)翻譯333語(yǔ)法表述的是語(yǔ)言的形式,或者說(shuō)是語(yǔ)言的樣子和結(jié)構(gòu)程序設(shè)計(jì)語(yǔ)言中更重要的一個(gè)方面,是附著在語(yǔ)言結(jié)構(gòu)上的語(yǔ)義語(yǔ)義揭示了程序本身的涵義、施加于語(yǔ)言結(jié)構(gòu)上的限制或者要執(zhí)行的動(dòng)作―老鼠吃貓?問(wèn)題 語(yǔ)法正確的句子,它的語(yǔ)義可能 存在問(wèn)題334語(yǔ)義分析的任務(wù):①檢查語(yǔ)言結(jié)構(gòu)的語(yǔ)義是否正確
②執(zhí)行所規(guī)定的語(yǔ)義動(dòng)作 如表達(dá)式的求值、符號(hào)表的填寫、 中間代碼的生成335對(duì)于文法:EE1+TETTFFdigitdigitlexval為digit的屬性;F.val、T.val、E.val為文法符號(hào)F、T、E對(duì)應(yīng)的屬性值語(yǔ)法制導(dǎo)翻譯的基本思想: 將語(yǔ)言結(jié)構(gòu)的語(yǔ)義以屬性(attribute)的形 式賦予代表此結(jié)構(gòu)的文法符號(hào),336
當(dāng)digit為常數(shù)時(shí),digitlexval為digit在 常數(shù)表中的入口當(dāng)digit為標(biāo)識(shí)符時(shí),digitlexval為digit在符號(hào)表中的入口;
F.val、T.val、E.val可以看作是中間變 量337FdigitTFETEE1+TFval:=digitlexvalTval:=FvalEval:=TvalEval:=E1val+Tval而屬性的計(jì)算以語(yǔ)義規(guī)則(semanticrules)的形式賦予由文法符號(hào)組成的產(chǎn)生式;在語(yǔ)法分析推導(dǎo)或歸約的每一步驟中,通過(guò)語(yǔ)義規(guī)則實(shí)現(xiàn)對(duì)屬性的計(jì)算,以達(dá)到對(duì)語(yǔ)義的處理338
換句話說(shuō)是:為每一個(gè)產(chǎn)生式配上語(yǔ)義規(guī)則并且在適當(dāng)?shù)臅r(shí)候執(zhí)行這些規(guī)則。 即當(dāng)歸約(或推導(dǎo))到某個(gè)產(chǎn)生式時(shí), 除了按照產(chǎn)生式進(jìn)行相應(yīng)的代換之外(語(yǔ)法分析),還要按照產(chǎn)生式所對(duì)應(yīng)的語(yǔ)義規(guī)則執(zhí)行相應(yīng)的語(yǔ)義動(dòng)作,如計(jì)算表達(dá)式、查填符號(hào)表、產(chǎn)生中間代碼(語(yǔ)義分析)339
語(yǔ)法分析—建立語(yǔ)法分析樹
語(yǔ)義分析---遍歷語(yǔ)法分析樹
語(yǔ)法制導(dǎo)翻譯---建立與遍歷同時(shí)完成語(yǔ)法制導(dǎo)翻譯是目前最常用的語(yǔ)義分析技術(shù)340例1臺(tái)式計(jì)算器程序的語(yǔ)法制導(dǎo)定義
產(chǎn)生式LEnEE1+TETTT1*FTFF(E)Fdigit
語(yǔ)義規(guī)則
print(Eval) Eval:=E1val+Tval Eval:=TvalTval:=T1val*FvalTval:=Fval Fval:=Eval Fval:=digitlexval3*5+4的分析過(guò)程12341*FTF3E+T F4ET
53*5+4的語(yǔ)法分析過(guò)程342
Fval:=3digitlexval:=3Tval:=3Fval:=5*Eval:=15 Tval:=15+digitlexval:=4Tval:=4 Fval:=4Eval:=19Ln
digitlexval:=53*5+4的語(yǔ)義分析過(guò)程3435.1語(yǔ)法制導(dǎo)定義(Syntax-directeddefinitions)通
語(yǔ)法制導(dǎo)定義也叫屬性文法,它是在上下文無(wú)關(guān)文法的基礎(chǔ)上,通過(guò)每個(gè)文法 符號(hào)和一個(gè)屬性集合相關(guān)聯(lián),過(guò)每一個(gè)產(chǎn)生式和一個(gè)語(yǔ)義規(guī)則集合相關(guān)聯(lián)。語(yǔ)義規(guī)則用來(lái)計(jì)算與產(chǎn)生式中出現(xiàn)的符號(hào)相關(guān)聯(lián)的屬性的值。9344
綜合屬性
◆屬性 繼承屬性 屬性可以代表任何對(duì)象:字符串、數(shù)字、類型、內(nèi)存單元或其它對(duì)象3455.1.1屬性
在一個(gè)語(yǔ)法制導(dǎo)定義中,A→P
都有與之相關(guān)聯(lián)的一套語(yǔ)義規(guī)則,規(guī)則可表示為:b=f(c1,c2,…,ck)其中:f是一個(gè)函數(shù),且滿足下面兩種情況之一:1.b是A屬性,c1,c2,…,ck是中的文法符號(hào)的屬性,或者A的其它屬性,則 稱b是A的綜合屬性;3462.c1,c2,…,ck是A或中的任何文法 符號(hào)的屬性,則稱b是中的符號(hào)的 一個(gè)繼承屬性。在兩種情況下,都說(shuō)屬性b依賴于屬性c1,c2,…,ck。347
5.1.2綜合屬性S-屬性定義:只使用綜合屬性的語(yǔ)法制導(dǎo)定義。 利用S-屬性定義進(jìn)行語(yǔ)義分析時(shí),結(jié)點(diǎn)屬 性值的計(jì)算正好和自底向上分析建立分析 樹結(jié)點(diǎn)同步進(jìn)行。 綜合屬性從下到上包括自身,其屬性可 從后代和自身的其它屬性計(jì)算得到348例1臺(tái)式計(jì)算器程序的S-屬性定義
產(chǎn)生式LEnEE1+TETTT1*FTFF(E)Fdigit
語(yǔ)義規(guī)則
print(Eval) Eval:=E1val+Tval Eval:=TvalTval:=T1val*FvalTval:=Fval Fval:=Eval Fval:=digitlexval3*5+4的分析過(guò)程349*FTF3E+TF4ET
53*5+4的語(yǔ)法分析過(guò)程digitlexval:=3 Fval:=3Tval:=15Eval:=15lexval:=4lexval:=5val:=4val:=5val:=4val:=3val:=19\nL19350digitlexval:=3Tval:=3 Fval:=3
Fval:=5digitlexval:=5*Eval:=15 Tval:=15+digitlexval:=4Tval:=4 Fval:=4Eval:=19Ln351在建立每一個(gè)結(jié)點(diǎn)處
使用語(yǔ)義規(guī)則來(lái)計(jì)算綜合屬性值,即在用哪個(gè)產(chǎn)生式進(jìn)行歸約后,就執(zhí)行那個(gè)產(chǎn)生式的s-屬性定義計(jì)算屬性的值, 從葉結(jié)點(diǎn)到根結(jié)點(diǎn)進(jìn)行計(jì)算
在分析樹中為每個(gè)文法符號(hào)上加上它們的屬性,則稱為帶注釋的分析樹,簡(jiǎn)稱注釋分析樹綜合屬性值的計(jì)算方法
對(duì)于s-屬性定義,通常使用自底向上的分析方法,3525.1.3繼承屬性
繼承屬性值是由此結(jié)點(diǎn)的父結(jié)點(diǎn)和/或兄弟結(jié)點(diǎn)的某些屬性值來(lái)決定的。繼承屬性從上到下包括兄弟,也即繼承屬性從前輩和兄弟的屬性計(jì)算得到353表2帶有繼承屬性L.in的語(yǔ)法制導(dǎo)定義
產(chǎn)生式
DTL Tint Treal LL1,idLid
語(yǔ)義規(guī)則
Lin:=Ttype Ttype:=integer Ttype:=real L1in:=Lin addtype(identry,Lin)addtype(identry,Lin)354練習(xí):設(shè)AS為文法的綜合屬性集,AI為繼承屬性集,則下列語(yǔ)法制導(dǎo)定義中
產(chǎn)生式P→xQRQ→u語(yǔ)義規(guī)則
Q.b=R.d R.c=1 R.e=Q.a Q.a=3355
P→yQRR→v
Q.b=R.f R.c=Q.a R.e=2R.d=R.c
R.f=R.e試求AS和AI356解:由1知:Q.b,R.e∈AI
由3知:R.c∈AI
由4知:R.d,R.f∈AS
由2知:Q.a=3∈AS
整理:AS={Q.a,R.d,R.f} AI={Q.b,R.c,R.e}3575.2語(yǔ)義規(guī)則語(yǔ)義規(guī)則也叫語(yǔ)義子程序或語(yǔ)義動(dòng)作語(yǔ)義規(guī)則通常有兩種表現(xiàn)形式:語(yǔ)法制導(dǎo)定義和翻譯模式3585.2.1語(yǔ)法制導(dǎo)定義語(yǔ)法制導(dǎo)定義是關(guān)于語(yǔ)言翻譯高層次規(guī)格說(shuō)明,它隱藏了具體實(shí)現(xiàn)細(xì)節(jié),用使
戶不用顯式地說(shuō)明翻譯發(fā)生的順序例:下面是將中綴表達(dá)式轉(zhuǎn)化為后綴表達(dá)式的文法和相應(yīng)的語(yǔ)法制導(dǎo)定義359產(chǎn)生式
L→E E→E1+E2 E→digit語(yǔ)法制導(dǎo)定義
print(E.val)
E.val=E1.val||E2.val||?+?
E.val=Digit.lexval語(yǔ)法制導(dǎo)定義只考慮?做什么?,用抽象的屬性表示文法符號(hào)所代表的語(yǔ)義3605.2.2翻譯模式翻譯模式也叫翻譯方案一個(gè)翻譯模式是一個(gè)上下文無(wú)關(guān)文法,
其中被稱為語(yǔ)義動(dòng)作的程序段被嵌入 到產(chǎn)生式的右部。一個(gè)翻譯模式類似于語(yǔ)法制導(dǎo)定義,只是語(yǔ)義規(guī)則的計(jì)算順序是顯式給出的。361
這是一種語(yǔ)法分析和語(yǔ)義動(dòng)作交錯(cuò)的表示法,他表達(dá)在按深度優(yōu)先遍歷分 析樹的過(guò)程中何時(shí)執(zhí)行語(yǔ)義動(dòng)作。 翻譯模式給出了使用語(yǔ)義規(guī)則進(jìn)行 計(jì)算的順序。可看成是分析過(guò)程中翻譯 的注釋。362例2:一個(gè)簡(jiǎn)單的翻譯模式(中綴變后綴)
E→TR R→addopT
{print(addop.lexeme)}R1|ε T→num{print(num.val)}3633+5的語(yǔ)義翻譯過(guò)程
ERTPr‘3‘3T+Pr‘+‘5RPr‘5‘
ε
結(jié)果:35+364翻譯方案不僅要考慮?做什么?,還要考慮?怎么做?某種意義上說(shuō),語(yǔ)法制導(dǎo)定義類似于算法,而翻譯方案更象程序365帶有繼承屬性L.in的翻譯方案DT{Lin:=Ttype}LTint{Ttype:=integer}Treal{Ttype:=real}
L{L1in:=Lin}
L1,id{addtype(identry,Lin)}
Lid{addtype(identry,Lin)}例5.3變量說(shuō)明的類型定義inta,b,c
366DL.in=t.typeLrealL1.in=L.in,id 3L1.in=L.in,id2id1句子realid1,id2,id3的帶繼承屬性的分析樹TT.type=realLLAdd(L.in)Add(L.in)Add(L.in)367例:文法G的產(chǎn)生式如下:S→(L)S→aL→L,SL→S1.試寫出一個(gè)語(yǔ)法制導(dǎo)定義,輸出配對(duì)括號(hào)個(gè)數(shù)2.寫一個(gè)翻譯方案,打印每個(gè)a的嵌套深度368解:1.為S,L引入屬性h產(chǎn)生式S→(L)S→aL→L1,SL→SS‘→S語(yǔ)法制導(dǎo)定義
S.h=L.h+1 S.h=0 L.h=L1.h+S.h L.h=s.h print(S.h)369(SL,(L.h=0S.h=0LL.h=0)SS.h=1L)S S.h=0L.h=1S.h=2
a S(a,(a))的分析過(guò)程
a3702.為S,L引入屬性d,翻譯方案如下S‘→{S.d=0}SS→({L.d=S.d+1}L)S→a{print(s.d)}L→{L1.d=L.d}L1,{S.d=L.d}SL→{S.d=L.d}SS‘S.h=0S(L.d=1L)L.d=1L,S.d=1S
S.d=1 Print(1)
Sa
(LS
L.d=2 S.d=2Print(2)
)a
371(a,(a))的分析過(guò)程ZZ.valYY.valZZ.val…………372stateval
5.3S-屬性定義及其自底向上的計(jì)算 在分析棧中使用一個(gè)附加的域來(lái)存 放綜合屬性值。 下圖為一個(gè)帶有綜合屬性值域的分析棧:
top373Ab:=f(c1,c2,…,ck)Ab
其中:b是A的綜合屬性,ci(1ik)是
中符號(hào)的屬性。綜合屬性的值在自底 向上的分析過(guò)程中,每步歸約時(shí),計(jì)算相應(yīng)的屬性值。 例:AXYZAb:=f(Xx,Yy,Zz)XXxY
YyZZzAAA.b......374statevaltop歸約后,分析棧為:定義式A.b=f(X.x,Y.y,Z.z)(抽象)變成val[ntop]=f(val[top-2],val[top-1],val[top])(具體可執(zhí)行代碼)。在執(zhí)行代碼段之前執(zhí)行:ntop:=top-r+1
其中:r是句柄的長(zhǎng)度,ntop為歸約后棧頂 執(zhí)行代碼段后執(zhí)行:top:=ntop;375例5.10用LR分析器實(shí)現(xiàn)臺(tái)式計(jì)算器
代碼段(和表5.1對(duì)比)
printf(val[ntop]) val[ntop]:=val[top-2]+val[top]val[ntop]:=val[top-2]*val[top] val[ntop]:=val[top-1]產(chǎn)生式LEnEE+TETTT*FTFF(E)Fdigit376表5.5翻譯輸入3*5+4n所做的移動(dòng)輸入3*5+4n *5+4n *5+4n *5+4n 5+4n +4n +4nstate
- 3 F T T* T*5 T*Fval
- 3 3 3 3- 3-5 3-5使用的產(chǎn)生式
Fdigit TF Fdigit377
L19
LEn輸入
+4n +4n 4n n n n nstate
T E E+ E+4 E+F E+T E Enval
15 15 15- 15-4 15-4 15-4 19 19-使用的產(chǎn)生式
TT*F ET Fdigit TF EE+T378,然總結(jié): 采用自底向上分析,例如LR分析首先 給出S-屬性定義,后,把S-屬性定義變成可執(zhí)行的代碼段,這就構(gòu)成了翻譯程序。歸
象一座建筑,語(yǔ)法分析是構(gòu)架,約處有一個(gè)?掛鉤?,語(yǔ)義分析和翻譯的代碼段(語(yǔ)義子程序)就掛在這個(gè)鉤子上。這樣,隨著語(yǔ)法分析的進(jìn)行,約前調(diào)用歸相應(yīng)的語(yǔ)義子程序,
379
在這種分析模式中,語(yǔ)法分析是主動(dòng)的,語(yǔ)義分析是從動(dòng)的,語(yǔ)法分析制導(dǎo)著語(yǔ)義分析3805.4L-屬性定義 在語(yǔ)法分析過(guò)程中進(jìn)行語(yǔ)義分析和翻譯,屬性的計(jì)算順序受到語(yǔ)法分 析建立分析樹結(jié)點(diǎn)順序的限制。 一種自然的計(jì)算屬性的順序是按深 度優(yōu)先訪問(wèn)分析樹結(jié)點(diǎn)的順序,它適應(yīng) 多種自底向上和自頂向下的翻譯方法。381◆深度優(yōu)先順序計(jì)算屬性PROCEDUREdfvisit(n:node); BEGIN FORn的每個(gè)子結(jié)點(diǎn)m,從左至右DO BEGIN
計(jì)算m的繼承屬性;
dfvisit(m) END;
計(jì)算n的綜合屬性
END;3825.4.1L-屬性定義 一個(gè)語(yǔ)法制導(dǎo)定義是L-屬性定義, 如果A→X1X2…XnP,其每一個(gè)語(yǔ)義規(guī)則中的每一個(gè)屬性都是一個(gè)綜合屬性,
或是Xj(1jn)的一個(gè)繼承屬性, 這個(gè)繼承屬性僅依賴于1、產(chǎn)生式中Xj的左邊符號(hào)X1,X2,…Xj-1
的屬性;2.A的繼承屬性。每一個(gè)S-屬性定義都是L-屬性定義。383例.一個(gè)簡(jiǎn)單的翻譯模式
E→TR R→addopT
{print(addop.lexeme)}R1|ε T→num{print(num.val)}把語(yǔ)義動(dòng)作看成終結(jié)符號(hào),輸入9-5+2,其分析樹如圖,當(dāng)按深度優(yōu)先遍歷它,
執(zhí)行遍歷中訪問(wèn)的語(yǔ)義動(dòng)作,將輸出:
95–2+它是輸入表達(dá)式9-5+2的后綴式。384T9Pt(′+′)R
-Pt(′9′)
5
Pt(′-′)
TPt(′5′)+R T2Pt(′2′)R
9-5+2的帶語(yǔ)義動(dòng)作的分析樹
E385設(shè)計(jì)翻譯模式(根據(jù)語(yǔ)法制導(dǎo)定義)條件:語(yǔ)法制導(dǎo)定義是L-屬性定義,保證語(yǔ)義動(dòng)作不會(huì)引用還沒有計(jì)算的屬性值。1.只需要綜合屬性的情況: 為每一個(gè)語(yǔ)義規(guī)則建立一個(gè)包含賦值的動(dòng)作,并把這個(gè)動(dòng)作放在相應(yīng)的產(chǎn)生式右邊的末尾。例如:
TT1*FTval:=T1val*Fval TT1*F{Tval:=T1val*Fval}386以后才能計(jì)算。2.既有綜合屬性又有繼承屬性
?產(chǎn)生式右邊的符號(hào)的繼承屬性必須在 這個(gè)符號(hào)以前的動(dòng)作中計(jì)算出來(lái)。
?一個(gè)動(dòng)作不能引用這個(gè)動(dòng)作右邊符號(hào) 的綜合屬性。
?產(chǎn)生式左邊非終結(jié)符號(hào)的綜合屬性只 有在它所引用的所有屬性都計(jì)算出來(lái)?計(jì)算這種屬性的動(dòng)作通常可放在產(chǎn)生式右端的未尾。387下面的翻譯模式不滿足要求:SA1A2{A1in:=1;A2in:=2}Aa{print(Ain)}
S
A2
A1 a
Pr(A.in)A1.in=1,A2.in=2
end388
5.5自頂向下的翻譯--用翻譯模式構(gòu)造自頂向下翻譯。
5.5.1從翻譯模式中消除左遞歸對(duì)于一個(gè)翻譯模式,若采用自頂向下分析,必須消除左遞歸和提取左公因子,在改寫基本文法時(shí)考慮屬性值的計(jì)算。389EE1+T{Eval:=E1val+Tval}EE1-T{Eval:=E1val-Tval}ET{E.val:=Tval}
T(E){Tval:=Eval}
Tnum{Tval:=numval}圖5.13帶左遞歸的文法的翻譯模式390E→T{Ri:=Tval} R{Eval:=Rs}
R→+
T{R1i:=R.i+T.val} R1{R.s:=R1s} R→- T{R1i:=Ri-Tval} R1{Rs:=R1s} R→ε{Rs:=Ri} T→(E){Tval:=E.val} T→num{Tval:=numval}經(jīng)過(guò)轉(zhuǎn)換的帶有右遞歸文法的翻譯模式6769391ETR.i=T.valRE.val=R.s9t.val=9-TR1.i=R.i-T.valR1R.s=R1.s5T.val=5+TR1.i=R.i+T.valR1R.s=R1.s
2T.val=2εR.s=R.i392關(guān)于左遞歸翻譯模式更一般化的討論左遞歸翻譯模式
A→A1Y{A.a:=g(A1.a,Y.y)} A→X{A.a:=f(X.x)}(5.2)每一個(gè)文法符號(hào)都有一個(gè)綜合屬性,用相應(yīng)的小寫字母表示,g和f是任意函數(shù)。消除左遞歸,文法轉(zhuǎn)換成
A→XR R→YR|ε393?再考慮語(yǔ)義動(dòng)作,翻譯模式變?yōu)椋?/p>
A→X{Ri:=f(Xx)} R{Aa:=Rs} R→Y{R1i:=g(Ri,Yy)} R1{Rs:=R1s} R→ε{Rs:=Ri}(5.4)經(jīng)過(guò)轉(zhuǎn)換的翻譯模式與圖5.14中一樣,使用R的繼承屬性i和綜合屬性s。(5.2)和(5.4)的結(jié)果是一樣的,
為什么?394Y2Y1Aa=g(f(Xx),Y1y) Aa=f(Xx) X(a)
輸入:XY1Y2Aa=g(g(f(Xx),Y1y),Y2y)395ARi=f(Xx) Ri=g(f(Xx),Y1y)Y1X
Y2
Ri=g(g(f(Xx),Y1y),Y2y)(b)
ε3965.5.2預(yù)測(cè)翻譯器的設(shè)計(jì)算法5.1預(yù)測(cè)語(yǔ)法制導(dǎo)翻譯器的建立輸入:一個(gè)帶有適合預(yù)測(cè)分析的文法的語(yǔ)法制導(dǎo)翻譯模式。 輸出:一個(gè)語(yǔ)法制導(dǎo)翻譯器的代碼。397方法:在預(yù)測(cè)分析器中加入語(yǔ)義動(dòng)作代碼。1.AVN,建立一個(gè)可遞歸調(diào)用的函數(shù)過(guò)程A。為A的每一個(gè)繼承屬性都設(shè)臵一個(gè)形式參數(shù),函數(shù)的返回值是A的綜合屬性值。2.函數(shù)過(guò)程A的代碼(指用符號(hào)形式表示的數(shù)據(jù)和程序)要根據(jù)當(dāng)前的輸入符號(hào)來(lái)決定使用哪一個(gè)產(chǎn)生式。3983.與每一個(gè)產(chǎn)生式有關(guān)的代碼,從左到右根椐產(chǎn)生式右部是單詞符號(hào)、非終結(jié)符號(hào)還是語(yǔ)義動(dòng)作,分別是:(a)對(duì)于帶有綜合屬性x的單詞符號(hào)X,x存放在X.x中,Match(X)。 (b)對(duì)于BVN,編寫一個(gè)賦值語(yǔ)句
c:=B(b1,b2,…,bk),其中,
b1,b2,…,bk是繼承屬性,c是綜合屬性。 (c)對(duì)于每個(gè)動(dòng)作,動(dòng)作的代碼抄進(jìn)語(yǔ)法分 析器中,用代表屬性的變量來(lái)代替對(duì)屬性的 每一次引用。399ProcedureR;{
iflookahead=addopthen{ advance; T;R;}}非終結(jié)符R的遞歸過(guò)程400FunctionR(I:pointer):pointer;{varnptr,il,sl,s:pointer;
iflookahead=addopthen{
addop.lexeme=?+‘;
advance;nptr=T;
il=f(addop.lexeme,I,nptr); Sl=R(il);S=sl;}}
Elses=l;Returns;}嵌入語(yǔ)義的非終結(jié)符R的遞歸過(guò)程401
左遞歸翻譯模式
A→A1Y{A.a:=g(A1.a,Y.y)} A→X{A.a:=f(X.x)}(5.2)?再考慮語(yǔ)義動(dòng)作,翻譯模式變?yōu)椋?/p>
A→X{Ri:=f(Xx)} R{A.a:=R.s} R→Y{R1i:=g(Ri,Yy)} R1{Rs:=R1s} R→ε{Rs:=Ri}(5.4)第六章中間代碼403
中間代碼生成6.1中間語(yǔ)言6.2常用語(yǔ)句的翻譯6.2.1說(shuō)明語(yǔ)句6.2.2賦值語(yǔ)句6.2.3布爾表達(dá)式6.2.4過(guò)程語(yǔ)句404:
序
?中間代碼生成?程序的任務(wù)是把經(jīng)過(guò)語(yǔ)法 分析和語(yǔ)義分析而獲得的源程序中間表示翻 譯為中間代碼表示。方法:語(yǔ)法制導(dǎo)翻譯。采用獨(dú)立于機(jī)器的中間代碼的好處:
1.便于編譯系統(tǒng)建立和編譯系統(tǒng)的移植;
2.便于進(jìn)行獨(dú)立于機(jī)器的代碼優(yōu)化工作。4056.1中間語(yǔ)言?語(yǔ)法樹?后綴式?三地址代碼表示6.1.1圖表示法 語(yǔ)法樹,有向非循環(huán)圖和后綴式表示源程序的自然層次結(jié)構(gòu),例如:
a:=b*-c+b*-c406=a+*b-c
(a)語(yǔ)法樹*
-cb407賦值語(yǔ)句:中綴式:a:=b*-c+b*-c后綴式:
abc-*bc-*+=408=a+*b-
c(b)dag(DirectedAcyclicGraph)4096.1.2三地址代碼一般形式x:=y(tǒng)opz相應(yīng)于圖6.1的樹和dag的三地址代碼t1:=-ct2:=b*t1t5:=t2+t2a:=t5對(duì)于dag的代碼
t1:=-c t2:=b*t1 t3:=-c t4:=b*t3 t5:=t2+t4 a:=t5對(duì)于語(yǔ)法樹的代碼410運(yùn)算符號(hào)relop(<,=,>=等等);
6.1.3三地址語(yǔ)句的種類(1)賦值語(yǔ)句x:=y(tǒng)opz,op為二目算術(shù)算符或邏輯算符;(2)賦值語(yǔ)句x:=opy,op為一目算符,如一目減uminus、邏輯非not、移位算符及轉(zhuǎn)換算符;(3)無(wú)條件轉(zhuǎn)移語(yǔ)句gotoL;(4)條件轉(zhuǎn)移語(yǔ)句ifxrelopygotoL,關(guān)系411(5)復(fù)制語(yǔ)句x:=y(tǒng);(6)過(guò)程調(diào)用語(yǔ)句paramx和callp,n;
過(guò)程返回語(yǔ)句returny;(7)索引賦值x:=y[i]及x[i]:=y;(8)地址和指針賦值x=&y,x=*y
和*x=y(tǒng)。在設(shè)計(jì)中間代碼形式時(shí),選擇多少種算 符需要tradeoff.4126.1.4語(yǔ)法制導(dǎo)翻譯生成三地址代碼幾個(gè)用到的量:(1)E.place表示存放E值的名字。(2)E.code表示對(duì)E求值的三地址語(yǔ)句序列。(3)newtemp是個(gè)函數(shù),對(duì)它的調(diào)用將產(chǎn)生一個(gè)新的臨時(shí)變量。產(chǎn)生式語(yǔ)義規(guī)則S→id:=ES.code:=E.code║gen(id.place':='E.place)E→E1+E2E.place:=newtemp;E.code:=E1.code║E2.code║gen(E.place':=? E1.place'+'E2.place)413產(chǎn)生式語(yǔ)義規(guī)則E→E1*E2E.place:=newtemp;E.code:=E1.code║E2.code ║gen(E.place':=? E1.place'*'E2.place)E.place:=newtemp;E.code:=E1.code‖gen( E.place′:=′uminus′E1.place)E→-E1414415
語(yǔ)義規(guī)則E.place:=E1.place;E.code:=E1.code
產(chǎn)生式E→(E1)產(chǎn)生賦值語(yǔ)句三地址代碼的語(yǔ)法制導(dǎo)定義E→idE.place:=id.place;E.code:=?‘416三地址語(yǔ)句序列是語(yǔ)法樹的線性表示,用臨時(shí)變量代替語(yǔ)法樹中的結(jié)點(diǎn)。
實(shí)際實(shí)現(xiàn)中,三地址語(yǔ)句序列往往是被存放 到一個(gè)輸出文件中,而不是將三地址語(yǔ)句序 列臵入code屬性之中4176.1.5三地址代碼的具體實(shí)現(xiàn)
1.四元式op,arg1,arg2,result 2.三元式op,arg1,arg2 3.間接三元式間接碼表+三元式表四元式需要利用較多的臨時(shí)單元,四元式之間的聯(lián)系通過(guò)臨時(shí)變量實(shí)現(xiàn)。中間代碼優(yōu)化處理時(shí),四元式比三元式方便的多,間接三元式與四元式同樣方便,兩種實(shí)現(xiàn)方式需要的存儲(chǔ)空間大體相同。418常用三地址碼的四元式表示:1、x=yopz2、x=opy3、gotoL4、ifxropygotoL5、x=y6、parmxcallp,n7、x=y[i]x[i]=y8、x=&yx=*y(op,y,z,x)(op,y,,x)(j,,,L)(jrop,x,y,L)(=,y,,x)419對(duì)于語(yǔ)句a:=b*-c+b*-c的三種表示方法 三地址語(yǔ)句的四元式表示
(-,c,,t1) (*,b,t1,t2) (-,c,,t3) (*,b,t1,t4) (+,t2,t4,t5)
(=,t5,,a)oparg1arg2(0)(1)(2)(3)(4)(5)uminus *uminus * + assign
c b c b(1)
a(0)(2)(3)(4)420
三地址語(yǔ)句的三元式表示三元式中使用指向三元式語(yǔ)句的指針。oparg1arg2(14)(15)(16)(17)(18)(19)uminus *uminus * + assign
c b c b15 a(14)(16)(17)(18)statement(0)(1)(2)(3)(4)(5)(14)(15)(16)(17)(18)(19)421三地址語(yǔ)句的間接三元式表示 語(yǔ)句的移動(dòng)僅改變左邊的語(yǔ)句表422
6.2常用語(yǔ)句的翻譯6.2.1說(shuō)明語(yǔ)句說(shuō)明語(yǔ)句的翻譯:對(duì)每個(gè)局部名字在,符號(hào)表中建立相應(yīng)的表項(xiàng),填寫有關(guān)的信息.如類型、嵌套深度、相對(duì)地址,內(nèi)情向量等。相對(duì)地址:相對(duì)靜態(tài)數(shù)據(jù)區(qū)基址或活動(dòng)記錄中局部數(shù)據(jù)區(qū)基址的一個(gè)偏移值423下面是類型說(shuō)明和數(shù)組說(shuō)明的文法和翻譯方案P→DD→D;DD→id:TT→integerT→realx:integer;y:real
一、過(guò)程中的說(shuō)明語(yǔ)句 一個(gè)過(guò)程中的所有說(shuō)明語(yǔ)句作為一個(gè)類 集來(lái)處理。用一個(gè)全程變量Offset來(lái)記錄下 一個(gè)數(shù)據(jù)在符號(hào)表中的相對(duì)地址。T→array[num]ofT1T→↑T1
424D→id:TT→integerT→realT→↑T1P→D{offset:=0}DD→D;D{enter(,T.type,offset); offset:=offset+T.width}{T.type:=integer;T.width:=4}{T.type:=real;T.width:=8}T→array[num]ofT1 {T.type:=array(num.val,T1.type); T.width:=num.val*T1.width}{T.type:=pointer(T1.type);
T.width:=4}425Nametypekind……addrXY…………
intreal
簡(jiǎn)單變量簡(jiǎn)單變量
04x:integer;y:realPOffset=0DD;x:TY:TEnter;offsetEnter;offsetOffset=4Offset=0Offset=12
DIntrealT.typeT.widthT.typeT.widthT.type=intT.width=4T.type=realT.width=8426
二、保留作用域信息
1.問(wèn)題的提出 一般的語(yǔ)言中,標(biāo)識(shí)符的作用在程序正文中有一個(gè)確定的范圍。因此,同一個(gè)標(biāo)識(shí)符在不同的程序正文中可能標(biāo)識(shí)不同的對(duì)象,具有不同的性質(zhì),要求分配不同的存儲(chǔ)空間。427于是提出下面的問(wèn)題:如何組織符號(hào)表,使得同一個(gè)標(biāo)識(shí)符在不同的作用域中得到正確的引用而不產(chǎn)生混亂。進(jìn)一步我們考慮一下具有嵌套定義的程序結(jié)構(gòu)4282.嵌套sort(input2012/12/14…program的程序結(jié)構(gòu),output);
varx,a:array[0..10]ofinteger;
procedurereadarray;
vari:integer;begin…end;
begin…begin計(jì)算機(jī)學(xué)院end.end;
procedureexchange;
begin…end;procedurequicksort(m,n:integer);
vari,k:integer;
procedurepartition(y,z:integer)
vari,j:integer;
begin…end;429嵌套說(shuō)明的文法:P→DD→D;DD→id:TD→procid;D;S……..此處的T用于產(chǎn)生類型;S用于產(chǎn)生語(yǔ)句430
嵌套說(shuō)明的程序結(jié)構(gòu)首先要解決的問(wèn)題是:非局部數(shù)據(jù)的訪問(wèn)綜合上述情況,對(duì)于程序結(jié)構(gòu)采用分程序結(jié)構(gòu)的程序來(lái)說(shuō),要解決的問(wèn)題是:
1.局部數(shù)據(jù)的訪問(wèn)
2.非局部數(shù)據(jù)的訪問(wèn)解決方法:為每一個(gè)過(guò)程建立一個(gè)符號(hào)表431
具體翻譯時(shí),每當(dāng)碰到過(guò)程說(shuō)明
D→procid;D1;S時(shí),便創(chuàng)建一張符號(hào)表,并且把
D1中的所有說(shuō)明都填入此符號(hào)表中 新表中有一個(gè)指針,指向其直接外圍過(guò)程 符號(hào)表,用于解決非局部數(shù)據(jù)的訪問(wèn) 過(guò)程名id作為直接外圍過(guò)程的局部名字記 錄在直接外圍過(guò)程符號(hào)表中;同時(shí)還要在直接外圍過(guò)程符號(hào)表中增加一個(gè)指向該過(guò)程D1符號(hào)表的指針NilheaderxareadarrayexchangequicksortHeaderIkpatitionHeaderIjheaderi432sort
readarray exchange
header
quicksortpatition嵌套過(guò)程的符號(hào)表433指)創(chuàng)建一張指向,外層
指向直接外層1.mktable(previous向當(dāng)前過(guò)程符新符號(hào)表
號(hào)表
2.Enter(table,name,type直接offset)插入表項(xiàng)
符號(hào)表 內(nèi)嵌過(guò)程
符號(hào)表 程的符號(hào)表
4.enterproc(table,name,newtable)
在外圍過(guò)程符號(hào)表中建立內(nèi)嵌過(guò)程的新表項(xiàng)434
翻譯時(shí)用到的數(shù)據(jù)結(jié)構(gòu):Tblptr是一個(gè)棧,用于存放指向嵌套外層過(guò)程的符號(hào)表指針Offset是一個(gè)棧,用于存放變量的相對(duì)地址,當(dāng)過(guò)程結(jié)束時(shí),offset里記錄的是過(guò)程占用的所有字節(jié)數(shù)。435處理嵌套過(guò)程中的說(shuō)明語(yǔ)句翻譯方案P→MD{addwidth(top(tblptr),top(offset));①pop();pop(offset)}M→ε{t:=mktable(nil);②push(t,tblptr);push(0,offset)}D→D1;D2D→procid;ND1;S {t:=top(tblptr); addwidth(t,top(offset));③
pop(tblptr);pop(offset);enterproc(top(tblptr),,t)}436D→id:T {enter(top(tblptr),,T.type,top(offset));④top(offset):=top(offset)+T.width}例:procedurequicksort(m,n:integer);begin…end;vari:integer;
procedurepartition(y,z:integer)
vari,j,x,v:integer;begin…end;N→ε{t:=mktable(top(tblptr));⑤push(t,tblptr);push(0,offset)}437PMDprocQ;ND;S③①εε⑤procP;Nε⑤D;S③j:Tint*④②438
上述語(yǔ)法樹對(duì)應(yīng)的語(yǔ)句:
ProcQ;procR;j:int;S;S遍歷語(yǔ)法樹所得到的翻譯序列:②⑤⑤*④③③①
執(zhí)行上面翻譯序列符號(hào)表及棧的變化0R4Jint00QQ計(jì)算機(jī)學(xué)院439tabptroffset
主tT=QPQ
主t.type=intt.width=4 40 0 0T=pt②⑤⑤*④③③①{t:=(2012/12/14enterproc(top(tblptr),,t)}
pop(tblptr);pop(offset)}{enter(top(tblptr),,T.type,top(offset)); addwidth(t,top(offset)); pop(tblptr);pop(offset);440
編譯過(guò)程:用先根次序遍歷上一頁(yè)中的樹,用棧來(lái)存儲(chǔ)編譯過(guò)程中使用的量,象table和offset。使用兩個(gè)棧,分別保存剛編譯過(guò)的符號(hào)表箭頭table和offset的值。進(jìn)入過(guò)程partition,quicksort過(guò)程的編譯并未結(jié)束,活動(dòng)記錄的設(shè)計(jì)和符號(hào)表的建立尚未完成,因此,要把quicksort過(guò)程使用的table和offset保存于棧中。441
一組嵌套過(guò)程,每個(gè)過(guò)程說(shuō)明為局部名字建立一個(gè)符號(hào)表,所有正在翻譯過(guò)程的符號(hào)表組成整個(gè)源程序的符號(hào)表。 翻譯語(yǔ)句部分時(shí)查找符號(hào)表,查找過(guò)程的 符號(hào)表的路線相當(dāng)于當(dāng)前被翻譯過(guò)程的靜 態(tài)鏈。442三、記錄中的域名T→recordLDend {T.type:=record(top(tblptr));
T.width:=top(offset);
pop(tblptr);pop(offset)}L→ε{t:=mktable(nil);
push(t,tblptr);push(0,offset))}
為-個(gè)記錄中的域名建立一張符號(hào)表
該翻譯模式強(qiáng)調(diào)了作為一個(gè)語(yǔ)言結(jié)構(gòu)的記錄的設(shè)計(jì)與活動(dòng)記錄之間的相似處.443
6.2.2賦值語(yǔ)句 賦值語(yǔ)句的翻譯:表達(dá)式的成分可以是整型量、實(shí)型量、數(shù)組元素和記錄 一、符號(hào)表中的名字 名字可以理解為指向符號(hào)表中相應(yīng)該名字表 項(xiàng)的指針
如何根據(jù)名字查找符號(hào)表的表項(xiàng)?
◆過(guò)程lookup()檢查是否在符號(hào)表中 存在相應(yīng)此名字的表項(xiàng)。444若找到,返回有關(guān)信息。用最近嵌套作用域規(guī)則查找非局部名字
lookup過(guò)程先通過(guò)top(tblptr)指針在當(dāng)前符號(hào)表中查找名字為name的表項(xiàng)。若未找到,lookup就利用當(dāng)前符號(hào)表表頭的指針找到該符號(hào)表的外圍符號(hào)表, 名字為name的表項(xiàng),
然后在那里查找直到所有外圍過(guò)程則的符號(hào)表中均無(wú)此name表項(xiàng),lookup返回nil,表明查找失敗。445
二、簡(jiǎn)單算術(shù)表達(dá)式及賦值語(yǔ)句
lookup()=id.entry nilemit它將生成的三地址代碼送到輸出文件上。例:emit(E.place?:=‘E1.place?+‘E2.place)或emit(=,E1.place,E2.place,E.place)446
產(chǎn)生賦值語(yǔ)句三地址代碼的翻譯模式
S→id:=E{p:=lookup(); ifp<>nilthenemit(p':='E.place) elseerror} E→E1+E2{E.place=newtemp; emit(E.place':='E1.place'+'E2.place')}E→E1*E2{E.place=newtemp; emit(E.place':='E1.place'+'E2.place')}447E→(E1)E→idE→-E{E.place:=newtemp; emit(E.place′:=′′uminus′E1.place}{E.place:=E1.place}{p:=lookup();ifp<>nilthenE.place:=pelseerror}448語(yǔ)義動(dòng)作應(yīng)包括類型分析,文法符號(hào)應(yīng)有類型屬性,在類型分析的基礎(chǔ)上,進(jìn)行相容和賦值相容檢查,生成類型轉(zhuǎn)換的三地址代碼。449數(shù)組首
地址
三、數(shù)組元素地址分配(復(fù)雜賦值語(yǔ)句) 數(shù)組元素的三地址代碼是什么? 如何生成數(shù)組元素的三地址代碼?1、數(shù)組元素地址的計(jì)算公式
①一維數(shù)組的數(shù)組元素計(jì)算公式
VARa:ARRAY[low..high]OFreal;
每個(gè)數(shù)組元 素的寬度base+(i-low)*w =bace-low*w+i*w450數(shù)組地址計(jì)算:
常量部分+變量部分:
bace-low*w+i*w
可在編譯時(shí)計(jì)算出來(lái)
②對(duì)于一個(gè)二維數(shù)組,可以按行或按列存放。 若按行存放,則可用如下公式計(jì)算:A[1,1]A[1,2]A[1,3]A[2,1]A[2,2]A[2,3]A[2,3]按行存放451
A[1,2]=base-(1*3+1)+(1*3+2) =base+1令c=((low1*n2)+low2)*w
則常量部分=a[low1,low2]-cA[i1,i2]的地址:
base+((i1一low1)*n2+i2一low2)*w)
=base-((low1*n2)+low2)*w
+((i1*n2)+i2)*w452
③多維數(shù)組A[i1,i2,...,ik]的地址的計(jì)算
((...((i1*n2+i2)*n3+i3...)*nk+ik)*w+base- ((...((low1*n2+low2)*n3+low3...)*nk+lowk)*w整理后:常量部分:c=((...((low1*n2+low2)*n3+low3)...)*nk
+lowk)*w變量部分v=((...((i1*n2+i2)*n3+i3...)*nk+ik)*wa[i1,i2,…in]的地址
=base-c+v453x:=a[i1,….,in]的三地址代碼結(jié)構(gòu):
t1:=v t2:=base-c t3:=t2[t1] x:=t3454a嵌套深度偏移量類型名字表內(nèi)情向量
C=84 low1=1high1=10 n1=10 low2=1high2=20 n2=20
基類型
int標(biāo)準(zhǔn)類型
82、數(shù)組的類型信息:
VARa:ARRAY[1..10,1..20]OFint;
符號(hào)表中的信息可組織如下:4553、引用數(shù)組元素的文法
L→id[Elist]|id Elist→Elist,E|E為了便于語(yǔ)義處理,上述方法改寫為:
L→Elist]|id Elist→Elist,E|id[E
地址計(jì)算變量部分:
((i1*n2+i2)*n3+i3)*n4+……
可利用遞歸公式計(jì)算:e1=i1,e2=e1*n2+i2;e3=e2*n3+i3…em=em-1*nm+im
456指示的數(shù)組,所4、有關(guān)變量與函數(shù)的說(shuō)明Elist.ndim:記錄Elist中的下標(biāo)表達(dá)式的個(gè)數(shù),即維數(shù)函數(shù)limit(array,j):返回nj,即由
array對(duì)于A[1..10,1..20]的第j維長(zhǎng)度;
Limit(A,2)=20 Limit(A,1)=10
Elist中的下標(biāo)表達(dá)式計(jì)算出來(lái)的值;Elist引進(jìn)綜合屬性array,指向數(shù)組名a在符號(hào)表中的入口地址.457
L有兩個(gè)屬性值:L.Place和L.offsetL.Place:如果L為一個(gè)簡(jiǎn)單名字,則L.Place為指向該名字在符號(hào)表中的入口的指針;如果L不為一個(gè)簡(jiǎn)單名字,則L.Place為數(shù)組計(jì)算中的常數(shù)部分,base-cL.offset=null:表示L為一個(gè)簡(jiǎn)單名字L.offset不為空,表示數(shù)組元素引用458
5、訪問(wèn)數(shù)組元素的翻譯模式給定文法G(S):
(0)M→ε
(1)S→L:=ME
(2)E→E+E
(3)E→(E)
(4)E→L
(5)L→Elist]
(6)L→id
(7)Elist→Elist,E
(8)Elist→id[E4596、相應(yīng)語(yǔ)義動(dòng)作?若L是一個(gè)簡(jiǎn)單的名字,將生成一般的賦值; 若L為數(shù)組元素引用,則生成對(duì)L所指示地 址的索引賦值
1.S→L:=
ME
{ifS.offset=null thenemit(S.place':='E.place)else emit(S.place'[?S.offset']':='E.Place)}4600.M→ε
{S.place:=L.place; S.offset=L.offset}2.E→E1+E2
{E.place:=newtemp; emit(E.place':='E1.place'+'E2.place)}
3.E→(E1)
{E.place:=E1.place}461使用索引來(lái)獲得地址L.place[L.offset]的內(nèi)容:
4.E→L
{ifL.offset=null thenE.place:=L.place/*Lisasimpleid*/ elsebegin E.place:=newtemp; emit(E.place':='L.place'[L.offset']') end}462
5.L→Elist]
{L.place:=newtemp; emit(L.place':='Elist.array'-'c) L.offset:=newtemp; emit(L.offset':='w'*'Elist.place)}一個(gè)空的offset表示一個(gè)簡(jiǎn)單的名字:
6.L→ld
(L.place:=id.place;L.offset:=null}463應(yīng)用遞歸公式掃描下一個(gè)下標(biāo)表達(dá)式
7.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.a(chǎn)rray;Elist.place:=t; Elist.ndim:=m}em-1*nmem-1*nm+im464設(shè)w=4,若數(shù)組第一個(gè)元素為A[1,1]。則有,C=((low1*n2)+low2)*w=(1*20+1)*4=84。
8.Elist→id[E
{Elist.place:=E.place; Elist.ndim:=1:
Elist.array:=id.place}例:設(shè)A為一個(gè)10*20的數(shù)組,即n1=10,n2=20;act8465LX=ELE,EA[ELyact61 EListact62
Lact41z
]act7act5act43
act42act63Mεacc0對(duì)賦值語(yǔ)句x:=A[y,z]的帶注釋的分析樹如圖所示。
S act1L.placext2zyL.offsetnullnullnullt3E.placezt4yElist.placet1yElist.ndim21Elist.array
mAA2Elist.place:=E.place;='1E.place)Elist.ndim:=1else(E.place:=newtemp;'*'‘elset':=t;'Elist1.placeElist.place:E.place:=newtemp;Act5L.place:=id.place;L.offset:=null;}s.place=L.place::s.place四元式表Act424140864675{.{t{L:if→ldL.offsetnullnull(Elist(E→Elist1,E)))emit{(if→ld'→id[E‘null'null’→L→L→Elist]6..Elist=L.offset=+(SE.place=)E的屬性值MifL→→ldnewtemp;LS.L.place:=newtemp;非終結(jié)符);tεoffset==t(E(L→L))act7{mthenemit(S.place'ndimarray;;-'c)else(then=:L.place':='Elist.array'E.place:..+act43elseE.place:=newtemp;=Act43Elist.ndim:=:=id.place}='E.Place})}}emitemits.place'['L.offset']':Elist.arraym}((L.offset':='w'*'Elist.place)}limit(act1emit(E.place':='L.place'[L.offset']')}466act62
act41Act8Act63act8act63t1=y*20Act61遍歷后得屬性計(jì)算順序:act0
t1=t1+zAct62
t2=A-84t3=4*t1t4=t2[t3] X=t4{:
xs.offsetnullAct7L.offset==:
then:Elist1 L.offset:=newtemp; emitact1467
該賦值語(yǔ)句在由底向上的分析中被翻譯成如下三地址語(yǔ)句序列:
t1:=y*20 t1:=t1+z t2:=A-84 t3:=4*t1 t4:=t2[t3] x:=t4注意:20、84、4都是編譯中引入的常量。所指
表中查找。明影辛468向的符號(hào)四、訪問(wèn)記錄中的域編譯器將記錄的域的類型和相對(duì)地址保存在相應(yīng)域名的符號(hào)表表項(xiàng)之中,可以把用在符號(hào)表中查找名字的程序同樣用來(lái)查找域名。例如:表達(dá)式:p↑.info+1
變量P是一個(gè)指向某個(gè)記錄類型的指針,info為其中一個(gè)算術(shù)型類型的域名。 編譯程序內(nèi)部把p表示為:pointer(record(t)),域名info將可以在t469pinfonextTYPE link=node; node=RECORD info:integer; next:link END;VARp:link;取 取L L(level,offsetp) 0(L)470
7.2.3布爾表達(dá)式 布爾表達(dá)式:用布爾運(yùn)算符號(hào)(and,or,not)作用到布爾變量或關(guān)系表達(dá)式上而組成 布爾表達(dá)式的作用:
1.用作計(jì)算邏輯值
2.用作控制流語(yǔ)句如if-then,if-then-else
和while-do等之中的條件表達(dá)式 本節(jié)考慮由如下文法生成的布爾表達(dá)式:
E→EorE|EandE|notE|(E)|
idrelopid|true|false
471And、or左結(jié)合
not右結(jié)合一、翻譯布爾表達(dá)式的方法1、表示一個(gè)布爾表達(dá)式的值
?方法一:用數(shù)值表示真和假,從而對(duì)布 爾表達(dá)式的求值可以象對(duì)算術(shù)表達(dá)式的求 值那樣一步一步地來(lái)計(jì)算例1or(not0and0)or0 =1or(1and0)or先級(jí):not、and、or優(yōu)0=1or0or0=1or0=1472方法二:另一種方法是根據(jù)布爾表達(dá)式的特點(diǎn),采用了某種優(yōu)化措施。 例:AorB如果A為真,那么B的值就不必計(jì)算,此時(shí)AorB的值已定,為真。 同理,AandB如果A為假,那么B的值就不必計(jì)算,此時(shí)AandB的值已定,為假。方法二用于翻譯控制流語(yǔ)句中的布爾表達(dá)式尤其方便。473二、數(shù)值表示法 用1表示真,0表示假來(lái)實(shí)現(xiàn)布爾表達(dá)式的翻 譯布爾表達(dá)式:aorbandnotc
翻譯成三地址代碼序列:
100:t1:=notc 101:t2:=bandt1 102:t3:=aort1474100:ifa<bgotol03101:t:=0102:gotol04。103:t:=1104:
關(guān)系表達(dá)式:a<b
等價(jià)于ifa<bthen1else0翻譯成三地址代碼序列:四元式序列:100:(j<,a,b,103)101:(=,0,,t)102:(j,,,104)103:(=,1,,t)104:475每執(zhí)行一次emit后,nextquat自動(dòng)加1
也就是即100:(j<,a,b,103)101:(=,0,,t)102:(j,,,104)103:(=,1,,t)104
nextquat三、布爾表達(dá)式的數(shù)值表示法的翻譯模式emit用于將一個(gè)三地址語(yǔ)句輸送到文件中Nextquat是一個(gè)計(jì)數(shù)器,指向下一個(gè)三地址語(yǔ)
句在輸出序列中的索引序號(hào),將生成的三地址語(yǔ)句序號(hào)。476E→E1orE2{E.place:=newtemp;E→notE1{E.place:=newtemp;②emit(E.place':=''not'E1.place)}
emit(E.place':='E1.place'orE2.place)}E→E1andE2{E.place:=newtemp;①emit(E.place':='E1.place'andE2.place)}477E→id1relopid2{E.place:=newtemp; emit('if'id1.placerelop.op id2.place'goto'nextstart+3); emit(E.place':=''0');③E→ture④E→false⑤emit('goto'nextstat+2); emit(E.place':=''1')}
{E.place:=newtemp; emit(E.place':=''1')}
{E.place:=newtemp; emit(E.place':=''0')}478EEEE例:布爾表達(dá)式a<bandc<dande<f對(duì)應(yīng)的語(yǔ)法樹
E①
③a<bandc<dande<f③③①動(dòng)計(jì)執(zhí)
③語(yǔ)義2012/12/14作算機(jī)學(xué)院行順序:③
①③①110:t4=0id1.placeE1.place113:t5=t3and‘?0t4emit(E.place?=‘E1.place?1‘)}emit(E.place?=‘‘E2.place)}4792012/12/14例:布爾表達(dá)式a<bandc<dande<f可以生成如下的三地址碼100:ifa<bgoto103101:t1=0102:goto104103:t1=1104:ifc<dgoto107105:t2=0106:goto104107:t2=1計(jì)算機(jī)學(xué)院emit(E.place?=?andrelop.op111:goto113id2.place=‘112:t4=1108:t3=t1andt2109:ife<fgoto112{E.place=newtemp; emit(?if‘ {E.place=newtemp; emit(E.place?goto‘ nextstart+3){E.place=newtemp;‘E2.place)}emit(?goto‘nextstart+2) ?and
480四、控制流語(yǔ)句中的布爾表達(dá)式的翻譯 對(duì)于出現(xiàn)在條件語(yǔ)句ifEthens1elses2中的布 爾表達(dá)式E,其作用就是控制對(duì)S1和S2的選擇 因此,作為條件的布爾表達(dá)式,把它設(shè)計(jì)成 兩個(gè)出口:E.true和E.false
考慮E的上下文,對(duì)于IF語(yǔ)句,E.true指向S1,
E.false指向S2; 對(duì)于while語(yǔ)句E.true指向循環(huán)的開始,
E.false指向while的下一語(yǔ)句481E.true:ifa<bgotoE.true(真出口)E.false:gotoE.false(假出口)
溫馨提示
- 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 醫(yī)院業(yè)務(wù)副院長(zhǎng)職責(zé)(五篇)
- 網(wǎng)絡(luò)課程設(shè)計(jì)的分類
- 網(wǎng)頁(yè)課程設(shè)計(jì)摘要模板
- 網(wǎng)上書店c 課程設(shè)計(jì)
- 微機(jī)原理通訊錄課程設(shè)計(jì)
- 聯(lián)想記憶課程設(shè)計(jì)
- 電話禮儀課程設(shè)計(jì)
- 職工系統(tǒng)Delphi課程設(shè)計(jì)
- 家政保潔公司營(yíng)業(yè)員服務(wù)總結(jié)
- 美的物流課程設(shè)計(jì)
- (八省聯(lián)考)2025年高考綜合改革適應(yīng)性演練 語(yǔ)文試卷(含答案解析)
- 數(shù)字媒體技術(shù)應(yīng)用基礎(chǔ)知識(shí)單選題及答案解析
- GB/T 45002-2024水泥膠砂保水率測(cè)定方法
- 2025年高考?xì)v史復(fù)習(xí)之小題狂練300題(選擇題):世界多極化與經(jīng)濟(jì)全球化(20題)
- ISO 56001-2024《創(chuàng)新管理體系-要求》專業(yè)解讀與應(yīng)用實(shí)踐指導(dǎo)材料之1:0 引言(雷澤佳編制-2025B0)
- 2024版環(huán)衛(wèi)清潔班車租賃服務(wù)協(xié)議3篇
- 生產(chǎn)安全事故事件管理知識(shí)培訓(xùn)課件
- 項(xiàng)目施工單位與當(dāng)?shù)卣按迕竦膮f(xié)調(diào)措施
- 藥劑科工作人員的專業(yè)提升計(jì)劃
- 2024年《論教育》全文課件
- 浙江省溫州市鹿城區(qū)2023-2024學(xué)年三年級(jí)上學(xué)期期末數(shù)學(xué)試卷
評(píng)論
0/150
提交評(píng)論