第八章 語法制導(dǎo)翻譯與中間代碼生成_第1頁
第八章 語法制導(dǎo)翻譯與中間代碼生成_第2頁
第八章 語法制導(dǎo)翻譯與中間代碼生成_第3頁
第八章 語法制導(dǎo)翻譯與中間代碼生成_第4頁
第八章 語法制導(dǎo)翻譯與中間代碼生成_第5頁
已閱讀5頁,還剩68頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第8章語法制導(dǎo)翻譯和中間代碼生成提綱:屬性文法翻譯模式中間代碼語句翻譯語法制導(dǎo)翻譯:在語法分析的同時(shí),完成相應(yīng)的語義處理語義分析的任務(wù):檢查靜態(tài)語義:類型、越界、維數(shù)、運(yùn)算翻譯(生成)中間(目標(biāo))代碼:變量的存儲(chǔ)分配、表達(dá)式的求值、語句的翻譯8.1屬性文法語義:語法成份的語義可以用文法符號(hào)的屬性來表示,通過屬性的計(jì)算來完成翻譯屬性文法:在上下文無關(guān)文法的基礎(chǔ)上,為每個(gè)文法符號(hào)(終結(jié)符或非終結(jié)符)配備若干相關(guān)的屬性及一些附在產(chǎn)生式上的語義規(guī)則。屬性代表與文法符號(hào)相關(guān)信息,如類型、值、代碼序列、符號(hào)表內(nèi)容等屬性可以進(jìn)行計(jì)算和傳遞語義規(guī)則:對(duì)于文法的每個(gè)產(chǎn)生式都配備了一組屬性的計(jì)算規(guī)則屬性文法的形式化定義:屬性文法A是一個(gè)三元組:A=(G,V,F)G:是一個(gè)上下文無關(guān)文法V:有窮的屬性集F:關(guān)于屬性的語義規(guī)則屬性的設(shè)定:根據(jù)文法符號(hào)的語義,為文法符號(hào)設(shè)置屬性例如:根據(jù)實(shí)際需要設(shè)置屬性表達(dá)式E:E.typeE.val屬性文法的例子:文法語義規(guī)則EE1+E2E.val:=E1.val+E2.valE(E1)E.val:=E1.valEnE.val:=n.lex屬性文法的主要思想:首先對(duì)每個(gè)文法符號(hào)引進(jìn)相關(guān)的屬性符號(hào);其次對(duì)每個(gè)產(chǎn)生式寫出屬性值計(jì)算的規(guī)則。說明:屬性有不同的類型,可以象變量一樣地被賦值.例:E.val:=E1.val+E2.val賦值過程就是語義處理過程.例:在推導(dǎo)語法樹的時(shí)候,諸屬性的值被計(jì)算并通過賦值規(guī)則層層傳遞.語法推導(dǎo)樹最后完成時(shí),就得到開始符號(hào)的屬性值.也就是整個(gè)程序的語義.屬性的分類:綜合屬性:“自下而上”傳遞信息繼承屬性:“自上而下”傳遞信息在一個(gè)屬性文法中,對(duì)應(yīng)于每個(gè)產(chǎn)生式A→都有一套與之相關(guān)聯(lián)的語義規(guī)則,每條規(guī)則的形式為:b:=f(c1,c2,…,ck)這里,f是一個(gè)函數(shù),c1,c2,…,ck是產(chǎn)生式文法符號(hào)或A的屬性b為A的綜合屬性:如果b是A的一個(gè)屬性,并且c1,c2,…,ck是產(chǎn)生式右邊文法符號(hào)的屬性或者A的其他屬性。b是文法符號(hào)X的繼承屬性:如果b是產(chǎn)生式右邊某個(gè)文法符號(hào)X的一個(gè)屬性,c1,c2,…,ck

是A或產(chǎn)生式右邊任何文法符號(hào)的屬性。兩種情況下,屬性b都依賴于屬性c1,c2,…,ck。說明:終結(jié)符屬性為綜合屬性,由詞法分析器給出非終結(jié)符既可以有綜合屬性,也可以有繼承屬性

產(chǎn)生式

L→E E→E1+T E→T T→T1*F T→F F→(E) F→digit語義規(guī)則print(E.val)E.val:=E1.val+T.valE.val:=T.valT.val:=T1.val*F.valT.val:=F.valF.val:=E.valF.val:=digit.lexvalE、T、F的Val屬性是?綜合屬性例:簡單算術(shù)表達(dá)式求值的語義描述(屬性文法)

產(chǎn)生式

語義規(guī)則

D→TL L.in:=T.type T→int T.type:=integer T→real T.type:=real L→L1,id L1.in:=L.in

addtype(id.entry,L.in)

L→id addtype(id.entry,L.in)T.type是綜合屬性L.in是繼承屬性例:說明語句中各種變量的類型信息的語義規(guī)則(屬性文法)綜合屬性在語法樹中,一個(gè)結(jié)點(diǎn)的綜合屬性的值由其子結(jié)點(diǎn)的屬性值確定。使用自底向上的方法在每一個(gè)結(jié)點(diǎn)處使用語義規(guī)則計(jì)算綜合屬性的值3*5+4的帶語義信息的語法樹digit.lexval=3F.val=3T.val=3*digit.lexval=5F.val=5T.val=15E.val=15+digit.lexval=4F.val=4T.val=4E.val=19L

產(chǎn)生式語義規(guī)則

L→Eprint(E.val)E→E1+TE.val:=E1.val+T.valE→TE.val:=T.valT→T1*FT.val:=T1.val*F.valT→F T.val:=F.valF→(E)F.val:=E.valF→digitF.val:=digit.lexval繼承屬性在語法樹中,一個(gè)結(jié)點(diǎn)的繼承屬性由此結(jié)點(diǎn)的父結(jié)點(diǎn)和/或兄弟結(jié)點(diǎn)的某些屬性確定句子realid1,id2,id3的帶語義信息的語法樹id1L,id2L,id3LrealTDT.type=realL.in=realL.in=realL.in=real產(chǎn)生式

語義規(guī)則

D→TLL.in:=T.typeT→int T.type:=integerT→realT.type:=realL→L1,idL1.in:=L.inaddtype(id.entry,L.in)L→id addtype(id.entry,L.in)8.2語法制導(dǎo)翻譯概論基于屬性文法的處理方法過程(一般情況):對(duì)單詞符號(hào)串進(jìn)行語法分析,構(gòu)造語法分析樹構(gòu)造屬性依賴圖獲得語義規(guī)則的計(jì)算順序翻譯結(jié)果(語義規(guī)則的計(jì)算)產(chǎn)生代碼在符號(hào)表中存放信息給出錯(cuò)誤信息執(zhí)行任何其它動(dòng)作對(duì)輸入符號(hào)串的翻譯也就是根據(jù)語義規(guī)則進(jìn)行計(jì)算的結(jié)果。8.2.1計(jì)算語義規(guī)則在一棵語法樹中,結(jié)點(diǎn)的繼承屬性和綜合屬性之間的相互依賴關(guān)系可以由稱作依賴圖的一個(gè)有向圖來描述為每一個(gè)包含過程調(diào)用的語義規(guī)則引入一個(gè)虛綜合屬性b,這樣把每一個(gè)語義規(guī)則都寫成b:=f(c1,c2,…,ck)

的形式依賴圖中為每一個(gè)屬性設(shè)置一個(gè)結(jié)點(diǎn),如果屬性b依賴于屬性c,則從屬性c的結(jié)點(diǎn)有一條有向邊連到屬性b的結(jié)點(diǎn)。E→E1+E2 E.val:=E1.val+E2.valE1+E2Evalvalval語義規(guī)則的計(jì)算次序一個(gè)依賴圖的任何拓?fù)渑判蚨冀o出一個(gè)語法樹中結(jié)點(diǎn)的語義規(guī)則計(jì)算的有效順序基于屬性文法的翻譯是很精確的基礎(chǔ)文法用于建立輸入符號(hào)串的語法分析樹根據(jù)語義規(guī)則建立依賴圖從依賴圖的拓?fù)渑判蛑校覀兛梢缘玫接?jì)算語義規(guī)則的順序輸入串語法樹依賴圖語義規(guī)則計(jì)算次序?qū)傩杂?jì)算1)樹遍歷通過樹遍歷的方法計(jì)算屬性的值假設(shè)語法樹已建立,且樹中已帶有開始符號(hào)的繼承屬性和終結(jié)符的綜合屬性以某種次序遍歷語法樹,直至計(jì)算出所有屬性深度優(yōu)先,從左到右的遍歷屬性計(jì)算2)一遍掃描的處理方法是在語法分析的同時(shí)計(jì)算屬性值所采用的語法分析方法屬性的計(jì)算次序8.2.2S-屬性文法和自下而上翻譯S-屬性文法:只含有綜合屬性S-屬性文法適合于一遍掃描的自下而上分析綜合屬性可以在分析輸入符號(hào)串的同時(shí)由自下而上的分析器來計(jì)算。分析器可以保存與棧中文法符號(hào)有關(guān)的綜合屬性值,每當(dāng)進(jìn)行歸約時(shí),新的屬性值就由棧中正在歸約的產(chǎn)生式右邊符號(hào)的屬性值來計(jì)算。在分析棧中使用一個(gè)附加的域來存放綜合屬性值假設(shè)語義規(guī)則A.a:=f(X.x,Y.y,Z.z)是對(duì)應(yīng)于產(chǎn)生式A→XYZ的表達(dá)式文法的SLR(1)分析表ACTIONGOTOi+*()#ETF0S5S41231S6acc2r2S7r2r23r4r4r4r44S5S48235r6r6r6r66S5S4937S5S4108S6S119r1S7r1r110r3r3r3r311r5r5r5r5文法

0:L→E 1:E→E+T2:E→T 3:T→T*F4:T→F5:F→(E)6:F→i

產(chǎn)生式

L→E E→E1+T E→T T→T1*F T→F F→(E) F→digit語義規(guī)則print(E.val)E.val:=E1.val+T.valE.val:=T.valT.val:=T1.val*F.valT.val:=F.valF.val:=E.valF.val:=digit.lexval3*5+4的分析和值計(jì)算過程輸入 state sym val 用到的產(chǎn)生式

3*5+4#0 # -

*5+4#05 #3 --

*5+4#03 #F -3 F→digit*5+4#02 #T -3 T→F5+4#027 #T* -3-

+4#0275 #T*5 -3-- ACTIONGOTOi+*()#ETF0S5S41231S6acc2r2S7r2r23r4r4r4r44S5S48235r6r6r6r66S5S4937S5S4108S6S119r1S7r1r110r3r3r3r311r5r5r5r5文法

0:L→E 1:E→E+T2:E→T 3:T→T*F4:T→F5:F→(E)6:F→i3*5+4的分析和值計(jì)算過程輸入state sym val 用到的產(chǎn)生式+4#0275 #T*5 -3-- +4#02710 #T*F -3-5 F→digitACTIONGOTOi+*()#ETF0S5S41231S6acc2r2S7r2r23r4r4r4r44S5S48235r6r6r6r66S5S4937S5S4108S6S119r1S7r1r110r3r3r3r311r5r5r5r5文法

0:L→E 1:E→E+T2:E→T 3:T→T*F4:T→F5:F→(E)6:F→i3*5+4的分析和值計(jì)算過程輸入state sym val 用到的產(chǎn)生式+4#0275 #T*5 -3-- +4#02710 #T*F -3-5 F→digit+4#02#T -15 T→T*F+4#01 #E -15 E→T4#016 #E+ -15-

#0165 #E+4 -15-4

ACTIONGOTOi+*()#ETF0S5S41231S6acc2r2S7r2r23r4r4r4r44S5S48235r6r6r6r66S5S4937S5S4108S6S119r1S7r1r110r3r3r3r311r5r5r5r5文法

0:L→E 1:E→E+T2:E→T 3:T→T*F4:T→F5:F→(E)6:F→i3*5+4的分析和值計(jì)算過程輸入 state symval 用到的產(chǎn)生式

#0165 #E+4 -15--

#0163#E+F -15-4 F→digit#0169#E+T -15-4 T→F#01 #E-19 E→E+T #L -19 L→EACTIONGOTOi+*()#ETF0S5S41231S6acc2r2S7r2r23r4r4r4r44S5S48235r6r6r6r66S5S4937S5S4108S6S119r1S7r1r110r3r3r3r311r5r5r5r5文法

0:L→E 1:E→E+T2:E→T 3:T→T*F4:T→F5:F→(E)6:F→i8.2.3L-屬性文法和自頂向下翻譯一個(gè)屬性文法稱為L-屬性文法,如果對(duì)于每個(gè)產(chǎn)生式A→X1X2…Xn,其每個(gè)語義規(guī)則中的每個(gè)屬性或者是綜合屬性,或者是Xj(1jn)的一個(gè)繼承屬性且這個(gè)繼承屬性僅依賴于:(1)產(chǎn)生式Xj的左邊符號(hào)X1,X2,…,Xj-1的屬性;(2)A的繼承屬性。S-屬性文法一定是L-屬性文法不是L-屬性文法

產(chǎn)生式

語義規(guī)則

A→LM M.i:=m(L.s) A→QR Q.i:=q(R.s)

A.s:=f(Q.s)例:將中綴表達(dá)式翻譯成后綴表達(dá)式的屬性文法E->EaddopTprint(addop.lexeme)|TT->numprint(num.val)其中,addop為+或-是L-屬性文法如果用LR分析,很容易實(shí)現(xiàn)在語法分析時(shí)進(jìn)行翻譯例:將2+3-5轉(zhuǎn)換成中綴表達(dá)式2Tprint2E3Tprint++ETprint--E5print5說明語義動(dòng)作的語法樹print3例:將2+3-5轉(zhuǎn)換成中綴表達(dá)式LR分析8.2.3L-屬性文法和自頂向下翻譯對(duì)L-屬性文法進(jìn)行自頂向下翻譯LL(1)文法適合自頂向下分析LL(1)文法不包含左遞歸文法:E->EaddopTprint(addop.lexeme)|TT->numprint(num.val)此文法含有左遞歸為了利用LL(1)方法分析,必須去除左遞歸E→TRR→addopT{print(addop.lexeme)}R1|

T→num{print(num.val)}

例:9-5+2語義動(dòng)作的語法樹-ETR9{print(‘9’)}TR5{print(‘5’)}{print(‘-’)}+T2{print(‘2’)}R{print(‘+’)}改寫后:E->EaddopTprint(addop.lexeme)|TT->numprint(num.val)這種語義處理的描述形式稱為翻譯模式8.2.3L-屬性文法和自頂向下翻譯翻譯模式:是適合語法制導(dǎo)翻譯的另一種描述形式,給出了使用語義規(guī)則進(jìn)行計(jì)算的次序在翻譯模式中,和文法符號(hào)相關(guān)的屬性和語義規(guī)則用花括號(hào){}括起來,插入到產(chǎn)生式右部的合適位置上設(shè)計(jì)翻譯模式的原則設(shè)計(jì)翻譯模式時(shí),必須保證當(dāng)某個(gè)動(dòng)作引用一個(gè)屬性時(shí)它必須是有定義的。L-屬性文法本身就能確保每個(gè)動(dòng)作不會(huì)引用尚未計(jì)算出來的屬性。當(dāng)消除一個(gè)翻譯模式的基本文法的左遞歸時(shí)同時(shí)考慮屬性

8.2.4L-屬性文法的自下而上的翻譯方法:1)從翻譯模式中去掉嵌入在產(chǎn)生式中間的動(dòng)作,把所有的語義動(dòng)作都放在產(chǎn)生式的末尾2)用綜合屬性代替繼承屬性1)轉(zhuǎn)換方法:加入新的產(chǎn)生式M→把嵌入在產(chǎn)生式中的每個(gè)語義動(dòng)作用不同的標(biāo)記非終結(jié)符M代替,并把這個(gè)動(dòng)作放在產(chǎn)生式M→的末尾翻譯模式

E→TRR→+T{print(‘+’)}R|-T{print(‘-’)}R|T→num{print(num.val)}轉(zhuǎn)換為

E→TRR→+TMR|-TNR|T→num{print(num.val)}M→{print(‘+’)}N→{print(‘-’)}8.3中間代碼的形式中間代碼:是源程序的一種內(nèi)部表示,復(fù)雜性介于源語言和目標(biāo)機(jī)語言之間中間代碼的作用:使編譯程序的邏輯結(jié)構(gòu)更加簡單明確利于進(jìn)行與目標(biāo)機(jī)無關(guān)的優(yōu)化利于在不同目標(biāo)機(jī)上實(shí)現(xiàn)同一種語言中間代碼的形式:逆波蘭式、四元式、三元式、樹8.3.1逆波蘭式逆波蘭表示法:一種表示表達(dá)式的方法,又稱后綴式表示法。4+5*2-3后綴式:452*+3-后綴式的計(jì)算要知道每個(gè)算符的目數(shù)用一個(gè)棧實(shí)現(xiàn)。一般的計(jì)算過程是:自左至右掃描后綴式,每碰到運(yùn)算量就把它推進(jìn)棧。每碰到k目運(yùn)算符就把它作用于棧頂?shù)膋個(gè)項(xiàng),并用運(yùn)算結(jié)果代替這k個(gè)項(xiàng)。8.3.1逆波蘭式可將逆波蘭表示擴(kuò)充到表達(dá)式以外的范圍例如:賦值語句a:=b*c+b*d表示:abc*bd*+:=條件語句ifEthenS1elseS2表示:ES1S2♂♂為三目運(yùn)算符8.3.2三元式和樹形表示三元式通過計(jì)算臨時(shí)變量值的語句的位置來引用這個(gè)臨時(shí)變量三個(gè)域:op(運(yùn)算符)、arg1(運(yùn)算對(duì)象)和arg2(運(yùn)算對(duì)象)

op arg1 arg2(0) - c (1) * b (0)(2) - c (3) * b (2)(4) + (1) (3)(5) := a (4)例如:a:=b*(-c)+b*(-c)例如,語句X:=(A+B)*C;Y:=D↑(A+B)的三元式表示如下表所示。三元式也可以表示成樹:=a+*b-c*b-c例如

a:=b*(-c)+b*(-c)的樹表示法8.3.3四元式四元式(普遍采用的中間代碼形式)一個(gè)帶有四個(gè)域的記錄結(jié)構(gòu),這四個(gè)域分別稱為op,arg1,arg2及result op arg1 arg2 result(0) - c T1(1) * b T1 T2(2) - c T3(3) * b T3 T4(4) + T2 T4 T5(5) := T5 a

例如:a:=b*(-c)+b*(-c)8.3.3四元式為了更直觀,也把四元式的形式寫成簡單賦值形式(1)T1:=-c(2)T2:=b*T1(3)T3:=-c(4)T4:=b*T3(5)T5:=T2+T4(6)a:=T5把(jump,-,-,L)寫成gotoL把(jrop,B,C,L)寫成ifBropCgotoL例如:a:=b*(-c)+b*(-c)8.4簡單賦值語句的翻譯在上面的四元式中,使用變量名字本身表示運(yùn)算對(duì)象在實(shí)際實(shí)現(xiàn)中,它們是指針:指向符號(hào)表的某一登陸項(xiàng)或臨時(shí)變量的整數(shù)碼翻譯的一般要求:充分了解各種語法成分的語義目標(biāo)語言的語義簡單賦值語句的翻譯:翻譯成四元式下面為翻譯中用到的信息:語義屬性:E.place:存儲(chǔ)位置或整數(shù)碼lookup():子程序,在符號(hào)表中查找emit(t:=arg1oparg2):子程序,生成四元式newtemp:產(chǎn)生新的臨時(shí)變量產(chǎn)生賦值語句的四元式翻譯模式S→id:=E {p:=lookup(); ifpnilthen emit(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)}產(chǎn)生賦值語句的四元式翻譯模式(續(xù))E→-E1 {E.place:=newtemp; emit(E.place‘:=’

‘-’E1.place)}E→(E1) {E.place:=E1.place}E→id{p:=lookup(); ifpnilthen E.place:=p elseerror}例如:將x:=y+i*j翻譯成四元式S→id:=E {p:=lookup(); ifpnilthenemit(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)}E→-E1 {E.place:=newtemp;emit(E.place‘:=’‘-’E1.place)}E→(E1){E.place:=E1.place}E→id{p:=lookup(); ifpnilthenE.place:=pelseerror}在翻譯中有時(shí)需要類型轉(zhuǎn)換用E.type表示非終結(jié)符E的類型屬性假設(shè)只有整型和實(shí)型,對(duì)應(yīng)產(chǎn)生式EE1opE2的語義動(dòng)作中關(guān)于E.type的語義規(guī)則可定義為:

{ifE1.type=integerandE2.type=integer E.type:=integer elseE.type:=real}算符區(qū)分為整型算符intop和實(shí)型算符realopx:=y+i*j

其中x、y為實(shí)型;i、j為整型。這個(gè)賦值句產(chǎn)生的四元式代碼(簡寫)為:

T1:=iint*j T3:=inttorealT1 T2:=yreal+T3 x:=T2關(guān)于產(chǎn)生式E→E1

+E2的語義動(dòng)作{E.place:=newtemp;

ifE1.type=integerandE2.type=integerthenbegin emit(E.place‘:=’E1.place‘int+’E2.place); E.type:=integerendelseifE1.type=realandE2.type=realthenbegin emit(E.place‘:=’E1.place‘real+’E2.place); E.type:=realendelseifE1.type=integerandE2.type=realthenbegin u:=newtemp; emit(u‘:=’

‘inttoreal’E1.place); emit(E.place‘:=’u‘real+’E2.palce); E.type:=realendelseifE1.type=realandE1.type=integerthenbegin u:=newtemp; emit(u‘:=’

‘inttoreal’E2.place); emit(E.place‘:=’E1.place‘real+’u); E.type:=realendelseE.type:=type_error}8.5布爾表達(dá)式的翻譯布爾表達(dá)式的兩個(gè)基本作用:計(jì)算邏輯值:a&&b||c(C語言)控制語句的條件表達(dá)式:(C語言)if(a<b)thena=a+2;while(t>5)t--;產(chǎn)生布爾表達(dá)式的文法E→Eor

E|Eand

E|notE|(E)|irop

i|true|false約定布爾算符的優(yōu)先順序從高到低為not,and,or,并且and和or服從左結(jié)合8.5.1布爾表達(dá)式的翻譯方法通常計(jì)算布爾表達(dá)式的值有兩種方法:1.如同計(jì)算算術(shù)表達(dá)式一樣,一步步算(計(jì)算值)

1or(not0and0)or0=1or(1and0)or0=1or0or0=1or0=12.采用某種優(yōu)化措施(控制語句中的條件表達(dá)式)計(jì)算AorB,若A為1,可以不計(jì)算B

8.5.1布爾表達(dá)式的翻譯方法若按第一種辦法計(jì)算布爾表達(dá)式,則aorbandnotc翻譯成的四元式序列為: (1)t1:=notc

(2)t2:=bandt1

(3)t3:=aort2對(duì)于關(guān)系表達(dá)式a<b可看成等價(jià)的條件語句

ifa<bthen1else0翻譯成的四元式序列為: (1)ifa<bgoto(4)(2)t:=0

(3)goto(5) (4)t:=1

(5)關(guān)于布爾表達(dá)式的翻譯模式過程emit生成四元式nextstat給出輸出序列中下一個(gè)四元式的地址aorbandnotc翻譯成的四元式序列為:

(1)t1:=notc

生成四元式(1)之后,nextstat的值為2

(2)t2:=bandt1

(3)t3:=aort2每產(chǎn)生一個(gè)四元式后,過程emit便把nextstat加1

布爾表達(dá)式的翻譯模式E→E1orE2{E.place:=newtemp; emit(E.place‘:=’E1.place‘or’E2.place)}E→E1andE2{E.place:=newtemp; emit(E.place‘:=’E1.place‘a(chǎn)nd’E2.place)}E→notE1{E.place:=newtemp; emit(E.place‘:=’‘not’E1.place)}E→(E1) {E.place:=E1.place}Eid1ropid2{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;E.place=1;}E→false {E.place:=newtemp;E.place=0;}對(duì)于關(guān)系表達(dá)式a<b可看成等價(jià)的條件語句

ifa<bthen1else0翻譯成的四元式序列為: (1)ifa<bgoto(4)(2)t:=0

(3)goto(5) (4)t:=1

(5)產(chǎn)生布爾表達(dá)式的文法

E→Eor

E|Eand

E|notE|(E)|irop

i|true|false

約定布爾算符的優(yōu)先順序從高到低為not,and,or,并且and和or服從左結(jié)合

給出布爾表達(dá)式a<borc<dande<f的語法樹(根據(jù)算符優(yōu)先關(guān)系,采用自下向上分析)a<bEc<dEe<fEandEorE布爾表達(dá)式a<borc<dande<f的翻譯結(jié)果

(假設(shè)nextstat從0開始)0: ifa<bgoto31: T1:=0 2: goto43: T1:=14: ifc<dgoto75: T2:=0 6: goto87: T2:=18:ife<fgoto119:T3:=010:goto1211:T3:=112:T4:=T2andT313:T5:=T1orT4E→E1orE2{E.place:=newtemp; emit(E.place‘:=’E1.place‘or’E2.place)}E→E1andE2{E.place:=newtemp; emit(E.place‘:=’E1.place‘a(chǎn)nd’E2.place)}E→notE1{E.place:=newtemp; emit(E.place‘:=’‘not’E1.place)}E→(E1) {E.place:=E1.place}Eid1ropid2{E.place:=newtemp;

emit(‘if’id1.placeropid2.place‘goto’nextstat+3);

emit(E.place‘:=’‘0’);

emit(‘goto’nextstat+2);

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論