第七章語(yǔ)義分析和中間代碼的產(chǎn)生_第1頁(yè)
第七章語(yǔ)義分析和中間代碼的產(chǎn)生_第2頁(yè)
第七章語(yǔ)義分析和中間代碼的產(chǎn)生_第3頁(yè)
第七章語(yǔ)義分析和中間代碼的產(chǎn)生_第4頁(yè)
第七章語(yǔ)義分析和中間代碼的產(chǎn)生_第5頁(yè)
已閱讀5頁(yè),還剩69頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第七章

語(yǔ)義分析和中間代碼的產(chǎn)生上海電力學(xué)院彭源內(nèi)容7.1中間代碼的形式7.2說(shuō)明語(yǔ)句的處理7.3賦值語(yǔ)句的翻譯(表達(dá)式、數(shù)組的翻譯)7.4布爾表達(dá)式的翻譯7.5控制語(yǔ)句的翻譯(if、while、switch)

何謂中間代碼:

源程序的一種內(nèi)部表示,不依賴(lài)目標(biāo)機(jī)的結(jié)構(gòu),易于機(jī)械生成目標(biāo)代碼的中間表示。可以使編譯程序的結(jié)構(gòu)清晰、簡(jiǎn)單、明確。

為什么要此階段及使用原則形式簡(jiǎn)單、語(yǔ)義明確、便于翻譯獨(dú)立于目標(biāo)語(yǔ)言。

中間代碼的幾種形式后綴式,三地址代碼(包括三元式/四元式/間接三元式),DAG圖表示,抽象語(yǔ)法樹(shù)表示

7.1中間代碼(源程序的中間形式)7.1.1后綴式(逆波蘭式)將運(yùn)算對(duì)象寫(xiě)在前面,把運(yùn)算符號(hào)寫(xiě)在后面表達(dá)式逆波蘭式a+ba+b*c(a+b)*ca=b*c+b*dab+abc*+ab+c*abc*bd*+=一個(gè)表達(dá)式的后綴式可以如下定義:

(1)如果E是一個(gè)變量或常量,則E的后綴式是E自身。(2)如果E是E1opE2形式的表達(dá)式,這里op是任何二元操作符,則E的后綴式為E1’E2’op,這里E1’和E2’分別為E1和E2的后綴式。(3)如果E是(E1)形式的表達(dá)式,則E1的后綴式就是E的后綴式??梢?jiàn)后綴式中用不到括號(hào)后綴式的計(jì)算機(jī)處理后綴式的最大優(yōu)點(diǎn)是易于計(jì)算機(jī)處理處理過(guò)程: 從左到右掃描后綴式,每碰到運(yùn)算對(duì)象就推進(jìn)棧;碰到運(yùn)算符就從棧頂彈出相應(yīng)目數(shù)的運(yùn)算對(duì)象施加運(yùn)算,并把結(jié)果推進(jìn)棧。最后的結(jié)果留在棧頂。

bt1dct1t2t1t3t1=-bt2=c*dt3=t1+t2例:表達(dá)式-b+c*d的后綴式b@cd*+的計(jì)值過(guò)程把表達(dá)式翻譯成后綴式的語(yǔ)義規(guī)則產(chǎn)生式語(yǔ)義規(guī)則E->E1opE2E.code:=E1.code||E2.code||opE->(E1)E.code:=E1.codeE->idE.code:=id說(shuō)明:E1,E2,E為同一個(gè)文法符號(hào),加下標(biāo)只是為了在定義語(yǔ)義規(guī)則的時(shí)候區(qū)分不同位置的E77a+b的中間代碼生成過(guò)程:步驟 符號(hào) 輸入串 語(yǔ)義動(dòng)作1 # a+b# 初始化2 #a +b# 3 #E +b# E.code:=“a”4 #E+ b# 5 #E+b # 6 #E+E1 # E1.code:=“b”7 #E # E.code:=“ab+”產(chǎn)生式語(yǔ)義規(guī)則E->E1opE2E.code:=E1.code||E2.code||opE->(E1)E.code:=E1.codeE->idE.code:=id逆波蘭(后綴式)表示法的擴(kuò)充

逆波蘭法很容易擴(kuò)充到表達(dá)式以外的范圍 例如:語(yǔ)句逆波蘭表示備注a:=b+cGOTOLIfEthenS1elseS2:=看作二目運(yùn)算符jmp看成一目運(yùn)算符,表示GOTO把¥看成三目運(yùn)算符,表示if–then–elseabc+:=LjmpES1S2¥7.1.2圖表示法包括DAG與抽象語(yǔ)法樹(shù)。抽象語(yǔ)法樹(shù):

操作符和關(guān)鍵字都不作為葉節(jié)點(diǎn)出現(xiàn),而是把它們作為內(nèi)部節(jié)點(diǎn)即葉節(jié)點(diǎn)的父節(jié)點(diǎn).S->ifBthenS1elseS2If_then_elseBS2S1=a+**bcbdSaETTbcbd**+=Ea=b*c+b*d7.1.2圖表示法無(wú)循環(huán)有向圖(DirectedAcyclicGraph,簡(jiǎn)稱(chēng)DAG):

與抽象語(yǔ)法樹(shù)一樣,對(duì)于表達(dá)式中的每個(gè)子表達(dá)式,DAG圖中都有一個(gè)結(jié)點(diǎn)。一個(gè)內(nèi)部結(jié)點(diǎn)代表一個(gè)操作符,它的孩子代表操作數(shù)。兩者不同的是,在一棵抽象語(yǔ)法樹(shù)中公共子表達(dá)式被表示為重復(fù)的子樹(shù),而在DAG圖中代表公共子表達(dá)式的結(jié)點(diǎn)具有多個(gè)父結(jié)點(diǎn)。即:

把抽象語(yǔ)法樹(shù)中的公共部分合并起來(lái)=a+**bcbd=a+**bcda+a*(b-c)+(b-c)*d+a+**a--dbcbc++**a-dbcE->E+T|E-T|TT->T*F|FF->(E)|i7.1.3三地址代碼

三地址代碼是由下面一般形式的語(yǔ)句構(gòu)成的序列:

X:=yopz

其中,x、y、z為名字、常數(shù)或編譯時(shí)產(chǎn)生的臨時(shí)變量;op代表運(yùn)算符號(hào)如定點(diǎn)運(yùn)算符、浮點(diǎn)運(yùn)算符、邏輯運(yùn)算符等。每個(gè)語(yǔ)句的右邊只能有一個(gè)運(yùn)算符。例如:x+y*z的三地址代碼:t1:=y*zt2:=x+t1例如:a+a*(b-c)+(b-c)*d的三地址代碼:t1:=b-ct2:=a*t1t3:=a+t2t4:=b-ct5:=t4*dt6:=t3+t5+a+**a--dbcbc++**a-dbct1:=b-ct2:=a*t1t3:=a+t2t5:=t1*dt6:=t3+t5例:表達(dá)式a+(-b*c+d)*e的三地址代碼為:

t1:=-bt2:=t1*ct3=t2+dt4=t3*et5=a+t4三地址語(yǔ)句的種類(lèi):種類(lèi):x:=yopz雙目運(yùn)算

x:=opy單目運(yùn)算

x:=y賦值

ifagotoL條件轉(zhuǎn)移

ifa>bgotoLgotol無(wú)條件轉(zhuǎn)移

paramx實(shí)在參數(shù)

callp,n(n是參數(shù)個(gè)數(shù))過(guò)程調(diào)用

returnx過(guò)程返回

x:=y[i] 數(shù)組運(yùn)算

x[i]:=yx:=&y 指針運(yùn)算

x:=*y*x=y三地址代碼是中間代碼的抽象形式,其具體實(shí)現(xiàn)可用記錄表示,記錄中包含表示運(yùn)算符和操作數(shù)的域。有以下三種表示方法:三元式四元式間接三元式四元式是一個(gè)帶有四個(gè)域的記錄結(jié)構(gòu),格式如下:

(算符,第一運(yùn)算對(duì)象,第二運(yùn)算對(duì)象,結(jié)果)如:a=b*c+b*d

(1) (*,b,c,t1)

(2) (*,b,d,t2)

(3) (+,t1,t2,t3)

(4) (=,t3,-,a)三元式格式:

(算符,第一運(yùn)算對(duì)象,第二運(yùn)算對(duì)象)例:A+B*C可表示成:

(1)(*,B,C)

(2)(+,A,(1))特點(diǎn):

(1)把存放結(jié)果的單元推遲到代碼生成階段;

(2)在格式上比四元式緊湊,節(jié)省空間;

(3)三元式不利于優(yōu)化。例:a+b*(c-d)-e/f**g(1)(-,c,d)(2)(*,b,(1))(3)(+,a,(2))(4)(**,f,g)(5)(/,e,(4))(6)(-,(3),(5))(1)(-,c,d)(2)(*,b,(1))(3)(**,f,G)(4)(/,e,(3))(5)(-,(2),(4))(6)(+,a,(5))E->E+T|E-T|TT->T*F|T/F|FF->F**M|MM->(E)|iE->E+E|E-E|TT->T*T|T/T|FF->F**F|MM->(E)|i多目運(yùn)算的三元式表示x[i]:=yoparg1arg2(0)=[]xi(1)assign(0)yx:=y[i]oparg1arg2(0)[]=yi(1)assignx(0)間接三元式為了便于優(yōu)化(1)三元式表,登記迄今生成的所有三元式;(2)操作碼表(間接碼表),按引用三元式的順序存放三元式在三元式表中的序號(hào)。如:X:=(A+B)*C;Y:=D↑(A+B)

三元式表(1)(+,A,B)(2)(*,(1),C)(3)(:=,X,(2))(4)(↑,D,(1))(5)(:=,Y,(4))操作碼表(1)(2)(3)(1)(4)(5)練習(xí)7.1選擇題:

(1)四元式之間的聯(lián)系是通過(guò)

實(shí)現(xiàn)的。

a.指示器

b.臨時(shí)變量

c.符號(hào)表

d.程序變量

(2)間接三元式表示法的優(yōu)點(diǎn)為

。

a.采用間接碼表,便于優(yōu)化處理

b.節(jié)省存儲(chǔ)空間,不便于表的修改

c.便于優(yōu)化處理,節(jié)省存儲(chǔ)空間

d.節(jié)省存儲(chǔ)空間,不便于優(yōu)化處理7.2將下列中綴式改寫(xiě)為逆波蘭式:(-A*(B+C))^(D-E)((a*d+c)/d+e)*f+ga+x≦4∨(c∧d*3)(┐A∨B)∧(C∨D)解:A-BC+*DE-^ad*c+d/e+f*g+ax+4≦cd3*∧∨A┐B∨CD∨∧7.3將下列表達(dá)式分別用逆波蘭式、DAG圖、三地址語(yǔ)句、及三地址語(yǔ)句的三種具體實(shí)現(xiàn)方法:三元式、間接三元式、四元式表示:A+B*(C-D)+E/(C-D)^N逆波蘭:ABCD-*+ECD–N^/+DAG圖:

A+*BC-D^N/E+三地址碼:T1:=C-DT2:=B*T1T3:=A+T2T4:=C-DT5:=T4^NT6:=E/T5T7:=T3+T6四元式:(1)(-CDT1)(2)(*BT1T2)(3)(+AT2T3)(4)(-CDT4)(5)(^T4NT5)(6)(/ET5T6)(7)(+T3T6T7)

A+B*(C-D)+E/(C-D)^N三元式:(1)(-CD)(2)(*B(1))(3)(+A(2))(4)(-CD)(5)(^(4)N)(6)(/E(5))(7)(+(3)(6))

間接三元式:(1)(-CD)(2)(*B(1))(3)(+A(2))(4)(^(1)N)(5)(/E(4))(6)(+(3)(5))

間接碼表:

(1)(2)(3)(1)(4)(5)(6)A+B*(C-D)+E/(C-D)^N賦值語(yǔ)句的語(yǔ)義規(guī)則S→id:=E{p:=lookup(); ifp<>nilthenemit(:=,E.place,,p) elseerror}E→E1+E2{E.place=newtemp; emit(+,E1.place,E2.place,E.place)}說(shuō)明:newtemp:函數(shù),返回一臨時(shí)變量序號(hào);

lookup(i):函數(shù),查找變量i的入口地址;

emit(OP,ARG1,ARG2,RESULT):語(yǔ)義過(guò)程,產(chǎn)生一個(gè)四元式,并填入四元式表;

E.place:與E相關(guān)的語(yǔ)義變量,可能是某變量的入口地址,或者為臨時(shí)變量序號(hào)等。7.3賦值語(yǔ)句的語(yǔ)義翻譯(接上頁(yè))

E→E1*E2{E.place=newtemp; emit(*,E1.place,E2.place,E.place)}E→-E1{E.place:=newtemp;emit(-,E1.place,,E.place)}

E→(E1) {E.place:=E1.place}

E→id {p:=lookup(); ifp<>nilthenE.place:=p elseerror}

E→num{E.place:=num}語(yǔ)義翻譯過(guò)程用自下而上的分析方法。最終所得的語(yǔ)義動(dòng)作如下:1.E11.place:=P(注:指向->c)2.(-,E11.place,,E1.place)

3.E21.place:=P(注:指向->b)4.E22.place:=345.(*,E21.place,E22.place,E2.place)6.(+,E1.place,E2.place,E.place)

7.(:=,E.place,,P(注:指向->a))例:翻譯a:=-c+b*34

翻譯中的其他問(wèn)題類(lèi)型轉(zhuǎn)換:表達(dá)式中,可能出現(xiàn)不同類(lèi)型的變量或常量進(jìn)行運(yùn)算,編譯程序必須做到拒絕接受混合運(yùn)算或者產(chǎn)生有關(guān)類(lèi)型轉(zhuǎn)換的指令。若允許混合運(yùn)算,則需對(duì)語(yǔ)義規(guī)則進(jìn)行擴(kuò)充。用E.MODE表示E的類(lèi)型,其值為r(實(shí)型)或int(整型)。如:產(chǎn)生式E->E1opE2的語(yǔ)義動(dòng)作中關(guān)E.MODE的規(guī)則可定義為:

IFE1.MODE=intandE2.MODE=int

THENE.MODE=intELSEE.MODE=real另需生成一個(gè)類(lèi)型轉(zhuǎn)換的四元式:

(inttoreal,A1,--,T)類(lèi)型轉(zhuǎn)換如:X:=Y+I*J,X,Y為實(shí)型,I,J為整型,則相應(yīng)的四元式序列應(yīng)為:

(*int,I,J,T1)

(inttoreal,T1,--,T2)

(+real,Y,T2,T3)

(:=,T3,--,X)數(shù)組元素引用(1)按行存放(2)按列存放如:A:array[1:2,1:3]

A[1,1]A[1,2]A[1,3]A[2,1]A[2,2]A[2,3]A[1,1]A[2,1]A[1,2]A[2,2]A[1,3]A[2,3]數(shù)組元素地址的計(jì)算設(shè)A是一個(gè)二維數(shù)組,每個(gè)元素占w個(gè)字節(jié)。若按行存放,則A[i1,i2]地址為:

base+((i1-low1)*n2+i2-low2)*w若按列存放,則A[i1,i2]地址為:

base+((i2-low2)*n1+i1-low1)*w可推廣到n維數(shù)組。數(shù)組A的起始地址行標(biāo)下界列寬列標(biāo)下界Low1,low2i1,i2行高n1列寬n2數(shù)組引用的中間代碼形式以二維數(shù)組按行存放為例:A[i1,i2]地址=base+((i1-low1)*n2+i2-low2)*w=base-(low1*n2+low2)*w

+(i1*n2+i2)*w則可用基址[變址]來(lái)表示數(shù)組元素的地址。同理:按列存放時(shí)候A[i1,i2]地址=base+((i2-low2)*n1+i1-low1)*w=base-(low2*n1+low1)*w

+(i2*n1+i1)*w基址變址數(shù)組翻譯舉例A是一個(gè)10*20數(shù)組,首地址為A。下標(biāo)從1開(kāi)始,按行存儲(chǔ),元素長(zhǎng)度為4。那么X:=A[i,j]的中間代碼序列為(語(yǔ)義規(guī)則定義見(jiàn)書(shū)page182):T1:=i*20T1:=T1+jT2:=A-84T3:=4*T1T4:=T2[T3]X:=T4base-(low1*n2+low2)*w+(i1*n2+i2)*w將下列賦值語(yǔ)句翻譯成三地址代碼(下標(biāo)從0開(kāi)始,按行存儲(chǔ),行列寬為10,A,B,C,D為數(shù)組的首地址,數(shù)組元素寬度為4):A[i,j]:=B[i,j]+C[A[k,1]]+D[i+j]t1:=i*10t1:=t1+jt2:=At3:=4*t1t4:=i*10t4:=t4+jt5:=Bt6:=4*t4t7:=t5[t6]t8:=k*10t8:=t8+1t9:=At10:=4*t8t11:=t9[t10]t12:=Ct13:=4*t11t14:=t12[t13]t15:=t7+t14t16:=i+jt17:=Dt18:=4*t16t19:=t17[t18]t20:=t15+t19t2[t3]:=t20base-(low1*n2+low2)*w+(i1*n2+i2)*w數(shù)組vara:array[1..10,1..20]ofreal;按列存放,其首址addA,每個(gè)實(shí)數(shù)占8?jìng)€(gè)字節(jié)編址,則語(yǔ)句b:=x+a[i,j];

的四元式序列是什么?*j10t1+it1t1-addrA88t2*8t1t3[]=t2t3t4+xt4t5:=t5_bbase-(low2*n1+low1)*w+(i2*n1+i1)*w例:數(shù)組A:array[2…10,3…8];B:array[-3,3],按列存放,A的首地址為100,每個(gè)元素占2個(gè)字節(jié);B的首地址為200,每個(gè)元素占1字節(jié)編址;

對(duì)于語(yǔ)句A[m+1,n+2]:=A[B[k+2],5]求:B[k+2]的地址求:A[m+1,n+2]的地址將該語(yǔ)句翻譯成四元式子序列解:1.=base-low*w+i*w=200-(-3)*1+(k+2)*1=205+k2.=base-(low2*n1+low1)*w+(i2*n1+i1)*w=100-(3*9+2)*2+((n+2)*9+m+1)*2

=80+(m+9n)*2

例:數(shù)組A:array[2…10,3…8];B:array[-3,3],按列存放,A的首地址為100,每個(gè)元素占2個(gè)字節(jié);B的首地址為200,每個(gè)元素占1字節(jié)編址;

對(duì)于語(yǔ)句A[m+1,n+2]:=A[B[k+2],5]求:B[k+2]的地址求:A[m+1,n+2]的地址將該語(yǔ)句翻譯成四元式子序列解:3.(+,m,1,t1)(+,n,2,t2)(*,t2,9,t3)(+,t3,t1,

t3)(-,100,58,t4)(*,2,t3

,t5

)base-(low2*n1+low1)*w+(i2*n1+i1)*w(+,k,2,t6)(-,200,-3,t7)(*,t6,1,t8)([]=,t7,t8,t9)(*,5,9,t10)(+,t10,t9,t11)base-low*w+i*w(-,100,58,t12)(*,2,t11,t11)([]=,t12,t11,t13)(=[],t4,t5

,t14)(:=,t13,_,t14)課后作業(yè):將上三題改為按列(第二題按行)存放,給出相應(yīng)的答案.7.4布爾表達(dá)式的翻譯關(guān)系表達(dá)式:形如E1relopE2的表達(dá)式,其中E1,E2為算術(shù)表達(dá)式,relop為關(guān)系運(yùn)算符(<,>,<=,>=,!=)布爾表達(dá)式:用布爾運(yùn)算符(and,or,not)作用到布爾變量(常量)或關(guān)系表達(dá)式上而組成的表達(dá)式。文法如下:

E->EandE|EorE|notE|(E)|id|ErelopE布爾表達(dá)式的作用用于計(jì)算邏輯值用于控制語(yǔ)句之中的條件表達(dá)式,如if-then,if-then-else和while-do等之中的條件表達(dá)式7.4布爾表達(dá)式的翻譯用于計(jì)算邏輯值時(shí)的翻譯用數(shù)值表示真和假,對(duì)布爾表達(dá)式的求值可以象對(duì)算術(shù)表達(dá)式的求值那樣一步一步地來(lái)計(jì)算。兩者的翻譯過(guò)程非常相似。如:AorBandnotC翻譯成三地址代碼為:T1:=notCT2:=BandT1T3:=AorT27.4布爾表達(dá)式的翻譯用于計(jì)算邏輯值時(shí)的翻譯對(duì)于關(guān)系表達(dá)式

arelopb可等價(jià)的解釋成:

ifarelopbthen1else0如a<b翻譯成三地址代碼序列:

100:ifa<bgotol03101:t:=0102:gotol04103:t:=1104:100:ifa<bgoto103101:t1:=0102:goto104103:t1:=1104:ifc<dgoto107105:t2:=0106:goto1087.4布爾表達(dá)式的翻譯例:a<borc<dande<f翻譯成三地址代碼序列:107:t2:=1

108:ife<fgoto111109:t3:=0110:goto112111:t3:=1112:t4:=t2andt3113:t5:=t1ort47.4布爾表達(dá)式的翻譯用于條件控制的布爾表達(dá)式的翻譯

作為條件的布爾表達(dá)式作用僅在于控制對(duì)S1和S2的選擇??刂普Z(yǔ)句S?ifEthenS1

elseS2

out:

把作為轉(zhuǎn)移條件的布爾表達(dá)式E翻譯成一系列的跳轉(zhuǎn)指令(條件真轉(zhuǎn)和無(wú)條件轉(zhuǎn))的四元式E.

true:S1的代碼goto

outE.false:S2的代碼E的代碼E.

true:E.false:E1.codeE2.codeE.code:E1.codeE2.codeE.code:控制語(yǔ)句中的布爾表達(dá)式(1)E→E1andE2truefalsetruetoE.truetoE.falsetruetoE.truefalsetoE.falsefalsetoE.false(2)E→E1orE2

falsetoE.truetrue控制語(yǔ)句中的布爾表達(dá)式(3)E→notE1

(4)E→(E1)

E1.codetruefalseE.codetoE.falsetoE.true

E1.codetruefalseE.codetoE.truetoE.false控制語(yǔ)句中的布爾表達(dá)式(5)E→id1relopid2(relop為關(guān)系運(yùn)算符)

(6)E→true

(7)E→falseE.codeifid1relopid2thengotoE.truegotoE.falsetoE.falsetoE.trueE.codegotoE.truetoE.trueE.codegotoE.falsetoE.false如某控制語(yǔ)句中的條件:a<borc<dande<f可翻譯成如下代碼:

ifa<bgotoE.truegotoL1L1:ifc<dgotoL2gotoE.falseL2:ife<fgotoE.truegotoE.false

…E.ture:…GotooutE.false:…Out:

如if(a<borc<dande<f)a=1elseb=1;可翻譯成:100:(j<,a,b,107)102:(j,_,_,103)103:(j<,c,d,105)104:(j,_,_,109)105:(j<,e,f,107)106:(j,_,_,109)107:(:=,1,_,a)108:(j,_,_,109)109:(:=,1,_,b)110:在生成100這條四元式的時(shí)候,最后一個(gè)域(指向107的指針)怎么得來(lái)的?暫時(shí)不能確定

100:(j<,a,b,__)102:(j,_,_,__)

103:(j<,c,d,__)104:(j,_,_,__)105:(j<,e,f,__)106:(j,_,_,__)107:(:=,1,_,a)108:(j,_,_,__)109:(:=,1,_,b)110:當(dāng)知道了條件為真時(shí)和條件為假時(shí)分別應(yīng)做哪些事時(shí)就可以進(jìn)行回填。例重新考慮表達(dá)式a<borc<dande<f103105107107109109110回填技術(shù):

記錄需回填地址的四元式,把需回填E.true的四元式拉成一鏈,把需回填E.false的四元式拉成一鏈,分別稱(chēng)做“真”鏈和“假”鏈,并在適當(dāng)?shù)臅r(shí)候進(jìn)行回填(10)…gotoE.true

…(20)…gotoE.true

…(30)…gotoE.true則鏈成(10)…goto(0)

…(20)…goto(10)

…(30)…goto(20)把地址(30)稱(chēng)作“真”鏈鏈?zhǔn)?,0為鏈尾?biāo)志,即地址(10)為“真”鏈鏈尾。例:寫(xiě)出Aand(Bandnot(CorD))的四元式序列,并給出真假鏈。(1)jnzA_(3)(2)j___(3)jnzB_(5)(4)j__(2)(5)jnzC_(4)

(6)j__(7)(7)jnzD_(5)

(8)j___

(2)真鏈:(8)(4)->假鏈:(7)->(5)->例:將下列布爾表達(dá)式表示為四元式:A∧(B∨(C∨D∧F)),并給出真假鏈。(1)jnzA_(3)(2)j___(3)jnzB__(4)j__(5)(5)jnzC_(3)(6)j__(7)(7)jnzD_(9)(8)j__(2)(9)jnzF_(5)(10)j__(8)真鏈:假鏈:9->10->235->8->作業(yè)寫(xiě)出Aand(BorC)的四元式序列,并給出真假鏈。四類(lèi)控制語(yǔ)句:無(wú)條件轉(zhuǎn)移:

goto(轉(zhuǎn)向某標(biāo)號(hào)所在位置)

exit、break(退出某個(gè)范圍)條件轉(zhuǎn)移:

if_then,if_then_else

循環(huán):

while_do:for分支:

switch7.4控制語(yǔ)句的翻譯控制流語(yǔ)句的翻譯:1.SifEthenS1E.codeS1.codeE.true:...E.false:toE.truetoE.falseifEgotoL1gotooutL1:S1Out:控制流語(yǔ)句的翻譯:1.SifEthenS1elseS2E.codeS1.codeE.true:S2.codeE.false

:gotoS.next...S.next:toE.truetoE.falseifEgotoL1gotoL2L1:S1

gotooutL2:S2Out:控制流語(yǔ)句的翻譯:2.SwhileEdoS1E.codeS1.codeE.true:E.false:gotoS.begin...S.begin:toE.falsetoE.trueL1:ifEgotoL2gotooutL2:S1gotoL2Out:先記錄要回填的轉(zhuǎn)移指令地址,在適當(dāng)?shù)臅r(shí)候進(jìn)行回填,以便賦值和布爾表達(dá)式的求值得到合適的連接,以完成程序的控制流程??刂屏髡Z(yǔ)句的翻譯模式:1.SifEthenM1

S1E.codeS1.codeE.true:...E.false:toE.truetoE.falseM1處反填E.true控制流語(yǔ)句的翻譯模式:2.SifEthenM1S1NelseM2S2E.codeS1.codeE.true:S2.codeE.false:gotoS.next...S.next:toE.truetoE.falseM1處反填E.trueM2處反填E.falseN出生成

′gotoS.next′控制流語(yǔ)句的翻譯模式:2.SwhileM1EdoM2S1NE.codeS1.codeE.true:E.false:gotoS.begin...S.begin:toE.falsetoE.trueM1處生成標(biāo)號(hào)S.beginM2處反填E.trueN處生成gotoS.begin例3:翻譯下列語(yǔ)句whilea<bdoifc<5thenwhilex>ydoz:=x+1;elsex:=ywhilea<bdoifc<5thenwhilex>ydoz:=x+1;elsex:=y100ifa<bgoto102;101goto111;102ifc<5goto104;103goto109;104ifx>ygoto106;105goto108;106x:=z+1;107goto104;108goto110;109x:=y;110goto100;E.codeE1.codeS11.codeS12.codeS1.code例其中A1,A2和A3均表示賦值語(yǔ)句

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論