第7章語義和中間代碼產(chǎn)生_第1頁
第7章語義和中間代碼產(chǎn)生_第2頁
第7章語義和中間代碼產(chǎn)生_第3頁
第7章語義和中間代碼產(chǎn)生_第4頁
第7章語義和中間代碼產(chǎn)生_第5頁
已閱讀5頁,還剩74頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第七章語義分析和中間代碼產(chǎn)生優(yōu)化器語法分析器靜態(tài)檢查器中間代碼產(chǎn)生器中間代碼

一般情況下,在詞法分析程序和語法分析程序?qū)υ闯绦虻恼Z法結(jié)構(gòu)進(jìn)行分析之后,要么,由語法分析程序直接調(diào)用相應(yīng)的語義子程序進(jìn)行語義處理;要么,首先生成語法樹或該結(jié)構(gòu)的某種表示,再進(jìn)行語義處理。1語義處理分兩步:

1、審查每個語法結(jié)構(gòu)的靜態(tài)語義(靜態(tài)語義分析/靜態(tài)審查),即驗證語法結(jié)構(gòu)合法的程序是否真正有意義。

2、若靜態(tài)語義正確,語義處理則要執(zhí)行真正的翻譯。即要么生成程序的一種中間表示形式(中間代碼),要么生成實際的目標(biāo)代碼。靜態(tài)語義檢查包括:(1)類型檢查;(2)控制流檢查;(3)一致性檢查;(4)相關(guān)名字檢查。2中間代碼:即中間語言,獨立于機(jī)器的,復(fù)雜性介于源 語言和機(jī)器語言之間的一種表示形式。采用中間語言的好處:(1)便于進(jìn)行與機(jī)器無關(guān)的代碼優(yōu)化工作;(2)使編譯程序改變目標(biāo)機(jī)更容易;(3)使編譯程序的結(jié)構(gòu)在邏輯上更為簡單明確。3

7.1中間語言

7.2說明語句

7.3賦值語句的翻譯

7.4布爾表達(dá)式的翻譯

7.5控制語句的翻譯

7.6過程調(diào)用的處理(略)

7.7類型檢查(略)4§7.1中間語言中間語言形式: 后綴式 三地址代碼 圖表示法三元式四元式間接三元式DAG 抽象語法樹5一、后綴式(逆波蘭式)§7.1中間語言規(guī)則:E—常量/變量

(2)E—

E1opE2

(3)E—

(E1)

(4)E—

opE1

例子:a*(b+c) (a+b)*(c+d) x+y≤z∨a>0∧(8+z)>3后綴式為:E本身后綴式為:E1’E2’op后綴式為:E1’′后綴式為:E1’op后綴式為:abc+*后綴式為:ab+cd+*后綴式為:xy+z≤a0>8z+3>∧∨6后綴式的特點:(1)運算對象出現(xiàn)的順序與原有順序呢(從左到右)相同;(2)運算符按實際運算順序(從左到右)出現(xiàn);(3)運算符緊跟在運算對象的后面出現(xiàn),且沒有括號。產(chǎn)生式語義規(guī)則E→E1OPE2E→(E1)E→idE.code:=E1.code||E2.code||opE.code:=E1.codeE.code:=id屬性文法:7例:給出串a(chǎn)*(b+c)的翻譯過程:aEEE()EEE+*bc.code=a.code=b.code=c.code=bc+.code=bc+.code=abc+*8§7.1中間語言二、圖表示法1、DAG(無循環(huán)有向圖)

與抽象語法樹對比,其相同點在于,對表達(dá)式中的每個子表達(dá)式,它們都有一個結(jié)點,一個內(nèi)部結(jié)點代表一個操作符,它的孩子代表操作數(shù);其不同點在于,在一個DAG中代表公共子表達(dá)式的結(jié)點具有多個父結(jié)點,而在一棵抽象語法樹中公共子表達(dá)式被表示為重復(fù)的子樹。1、DAG2、抽象語法樹9§7.1中間語言例:如圖所示,為a+a*(b-c)+(b-c)*d的DAGa+*bc-*d+10§7.1中間語言2、抽象語法樹例:(1)a:=b*-c+b*-c的圖表示法 assigna +* *buminusbuminus c c語法樹 assigna +* buminus cDAG11§7.1中間語言(2)a:=b*-c+b*-c的抽象語法樹的兩種表示法assignid a+*id buminusid c*uminusid cid bidbIdcuminus1*02idbidcuminus5*46+37idaassign9801234567891011…§7.1中間語言三、三地址代碼1、三地址代碼:是由下面一般形式的語句構(gòu)成的序列 x:=yopz

如:T1:=y*z,T2:=x+T1x,y,z:名字,常數(shù),編譯時產(chǎn)生的臨時變量

op:運算符號(如定點運算符、浮點運算//邏輯運算符等)稱為三地址代碼的原因:

每條語句通常包含三個地址,兩個用來表示操作數(shù),一個用來存放結(jié)果。具體實現(xiàn):用記錄表示,其中包含運算符和操作數(shù)的域。13P170

三地址語句種類14產(chǎn)生式語義規(guī)則S→id:=EE→E1+

E2

E→E1*

E2E→-E1E→(E1)E→idS.code:=E.code||gen(id.place’:=‘E.place)E.place:=newtemp;E.code:=E1.code||E2.code||gen(E.place’:=‘E1.place’+’E2.place)E.place:=newtemp;E.code:=E1.code||E2.code||gen(E.place’:=‘E1.place’*’E2.place)E.place:=id.place;E.code:=‘’;15例:給出串d:=a*(b+c)的翻譯過程:aEEE()EEE+*bc.place=a.code=‘’.place=b.code=‘’.place=c.code=‘’.place=T1.code=T1:=b+c.place=T1.code=T1:=b+c.place=T2.code=T1:=b+c

T2:=a*T1Sd:=S.code=T1:=b+c

T2:=a*T1d:=T2162、三地址代碼的三種實現(xiàn)方式:(1)四元式(2)三元式(3)間接三元式§7.1中間語言17§7.1中間語言(1)四元式:帶有四個域的記錄結(jié)構(gòu)

(op,arg1,arg2,result)內(nèi)容均是指針,指向有關(guān)名字的符號表入口T1:=-cT2:=b*T1T3:=-cT4:=b*T3T5:=T2+T4a:=T5oparg1arg2result(0)(1)(2)(3)(4)(5)uminuscT1*bT1T2uminuscT3*bT3T4+T2T4T5:=T5a§7.1中間語言(2)三元式:為了避免把臨時變量填入符號表,可通過 計算該臨時變量值的語句的位置來引用該臨 時變量。 (op,arg1,arg2)或是指向符號表的指針—對程序中的名字或常量而言或是指向三元式表的指針—對臨時變量而言19T1:=-cT2:=b*T1T3:=-cT4:=b*T3T5:=T2+T4a:=T5Oparg1arg2(0)(1)(2)(3)(4)(5)uminusc*b(0)uminusc*b(2)

+(1)(3)

:=a(4)20§7.1中間語言(3)間接三元式:便于代碼優(yōu)化處理 方法:間接碼表+三元式表按運算的先后順序列出有關(guān)三元式在三元表中的位置oparg1arg2例,語句X:=(A+B)*C;Y:=D↑(A+B)的間接三元式表示如下所示:間接碼表三元式表(1)(2)(3)(1)(4)(5)(1)+AB(2)*(1)C(3):=X(2)(4)↑D(1)(5):=Y(4)21§7.1中間語言(4)比較三元式、四元式、間接三元式22§7.2說明語句編譯過程中,對“說明語句”要做的工作:

對一個過程或分程序的一系列說明語句考察時,需要為局部于該過程的名字分配存儲空間;對每個局部名字,都需在符號表中建立相應(yīng)的表項,并填入有關(guān)的信息如類型、在存儲器中的相對地址等。

23§7.2說明語句一、過程中的說明語句1、產(chǎn)生“說明語句”的文法:PMDMε {offset:=0}DD;DDid:T {enter(,T.type,offset); offset:=offset+T.width}Tinteger {T.type:=integer;T.width:=4}Treal {T.type:=real;T.width:=8}Tarray[num]ofT1 {T.type:=array(num.val,T1.type); T.width:=num.val×T1.width}T↑T1 {T.type:=pointer(T1.type);T.width:=4}24§7.2說明語句說明:(1)Offset:全程變量,代表變量在過程數(shù)據(jù)區(qū)中的相對地 址,用來跟蹤下一個可用的相對地址的位置。(2)enter(name,type,offset):把名字name符號表,并給 出此名字的類型type及在過程數(shù)據(jù)區(qū)中的相對地 址offset。(3)綜合屬性:T.type-名字的類型; T.width-名字的域?qū)?即該類型名字所占 用的存儲單元個數(shù))。25例:給出下面串的翻譯過程:

a:integer;b:array[10]of↑realPDDD;T:aintegerT:bT[array10]ofT↑real.type=integer.width=4Mεoffset=0nametypeoffset符號表

ainteger04.type=real.width=8.type=pointer(real).width=4.type=array(10,pointer(real)).width=40

barray(10,pointer(real))44426練習(xí):給出下面串的翻譯結(jié)果

a:real;b:↑integer;c:array[3]ofinteger;d:integernametypeoffset符號表

areal0

bpointer(integer)

8

carray(3,integer)12

dinteger2427§7.2說明語句2、處理方式: 處理第一條說明語句之前,先置offset為0,以后每次遇到一個新的名字,便將該名字、類型、相對地址填入符號表中并置相對地址為當(dāng)前offset之值,然后使offset加上該名字所表示的數(shù)據(jù)對象的域?qū)挕?8PMDMε

DD;DDid:T Tinteger Treal Tarray[num]ofT1

T↑T1

29§7.2說明語句二、保留作用域信息1、嵌套過程中的說明語句

(1)相應(yīng)的文法:PD DD;D|id;T|procid;D;S (2)程序舉例:30§7.2說明語句2、含嵌套說明的翻譯模式:PMD 31§7.2說明語句(1)語義規(guī)則中的操作:

mktable(previous):創(chuàng)建一張新符號表,并返回指向 新表的一個指針;

enter(table,name,type,offset):在指針table指示 的符號表中為名字name建立一個新頂,并把類型type、

相對地址offset填入到該項中;

addwidth(table,width):在指針table指示的符號表 表頭中記錄下該表中所有名字占用的總寬度;

enterproc(table,name,newtable):在指針table指 示的符號表中為名字name的過程建立一個新項。參數(shù)newtable指向過程name的符號表。32§7.2說明語句(2)棧

tblptr:存放指向符號表的指針,棧頂為指向當(dāng)前正在處理過程的符號表指針;

offset:存放變量在數(shù)據(jù)區(qū)中的相對地址,棧頂為當(dāng)前正在處理過程的下一個變量的相對地址。(3)top(…):取當(dāng)前棧頂元素;

push(a,B):將a推進(jìn)B棧棧頂;

pop(A):將A棧棧頂元素出棧。33PDDD;T:aintegerMεDD;DD;;AprocSDNεDD;34sort

aarray(11,integer)0

xinteger

44

niltblptroffset

sort

0

44

48

readarraysort

readarray

0

iinteger0

4

4

exchangesort

0

readarray

exchange

0

exchange

quicksortpartition

kint0

vint4

partion

iint0

jint4quicksort

quicksort

0

4

8

8

partition

0

4

8

8

48§7.3賦值語句的翻譯一、簡單算術(shù)表達(dá)式及賦值語句1、產(chǎn)生“賦值語句”三地址代碼的翻譯模式:Sid:=E {p:=lookup(); ifp≠nilthenemit(p‘:=’E.place)elseerror}EE1+E2 {E.place:=newtemp;

emit(E.place‘:=’E1.place‘+’E2.place)}EE1*E2 {E.place:=newtemp; emit(E.place‘:=’E1.place‘*’E2.place)}E-E1 {E.place:=newtemp; emit(E.place‘:=’‘uminus’E1.place)}E(E1) {E.place:=E1.place}Eid {p:=lookup(); ifp≠nilthenE.place:=pelseerror}36§7.3賦值語句的翻譯2、說明:

-id所代表的名字本身

lookup()-檢查符號表中是否存在相應(yīng)此 名字的入口

≠nil:返回一個該表項的指針

=nil:未找到

emit(--)-將生成的三地址語句發(fā)送到輸出文件中

E.place-存放E值的名字

newtemp-產(chǎn)生“臨時變量”37例:給出d:=a*(b+c)的翻譯結(jié)果輸出的四元式:(+,b,c,T1)(*,a,T1,T2)(:=,T2,,d)aEEE()EEE+*bc.place=a.place=b.place=c.place=T1.place=T2Sd:=.place=T138狀態(tài) 已歸約串 PLACE 輸入串 語義動作

# X:=-B*(C+D)# #X X :=-B*(C+D)# #X:= X_ -B*(C+D)# #X:=- X__ B*(C+D)# #X:=-B X__B *(C+D)# #X:=-E X__B *(C+D)# {E.place:=p=<B>} #X:=E X_T1 *(C+D)# {E.place:=newtemp=T1

生成四元式(1)} … … … … #X:=E*(C X_T1__C +D)# #X:=E*(E1 X_T1__C +D)# {E1.place:=p=<C>} … … … … #X:=E*(E1+D X_T1__C_D )# #X:=E*(E1+E2 X_T1__C_D )# {E2.place:=p=<D>} #X:=E*(E’ X_T1__T2 )# {E1’.place:=newtemp=T2;

生成四元式(2)} #X:=E*(E’) X_T1__T2_ # #X:=E*E’’ X_T1_T2 # {E’’.place=E’.place=T2} #X:=E X_T3 # {E.place=T3;生成四元式(3)} #S #{p:=lookup(X.name)生成四元式(4)}§7.3賦值語句的翻譯3、例題:寫出下列代碼段中表達(dá)式的翻譯制導(dǎo)過 程及其所產(chǎn)生的四元式

begin B、C、D、X:Integer; X:=-B*(C+D); endOparg1arg2result(1)(2)(3)(4)-+*:=<B><C>T1T3<D>T2T1T2T3Xnametypeoffset<B>BInt0<C>CInt4<D>DInt8<X>XInt12四元式

符號表40§7.3賦值語句的翻譯二、數(shù)組元素的引用1、數(shù)組元素在存儲器中的存放:(行序為主序)一維:A[i]base+(i-low)*w=(base-low*w)+i*w二維:A[i1,i2]base+((i1-low1)*n2+(i2-low2))*w=

base-(low1*n2+low2)*w

+(i1*n2+i2)*wk維:A[i1,i2,…,ik]

41三維:A[i1,i2,i3]base+(((i1-low1)*n2*n3+(i2-low2)*n3+(i3-low3)))*w=

base-((low1*n2+low2)*n3+low3)*w+((i1*n2+i2)*n3+i3)*w

A[1,1,1]A[1,1,2]A[1,2,1]A[1,2,2]A[1,3,1]A[1,3,2]A[2,1,1]A[2,1,2]A[2,2,1]A[2,2,2]A[2,3,1]A[2,3,2]i=1i=2j=1j=2j=3j=1j=2j=342k維:A[i1,i2,…,ik]base-((…((low1*n2+low2)*n3+low3)…)*nk+lowk)*w

+((…((i1*n2+i2)*n3+i3)...)*nk+ik)*w

Ce1=i1e2=e1*n2+i2e3=e2*n3+i3...em=em-1*nm+im43§7.3賦值語句的翻譯改寫產(chǎn)生式的原因:使我們在整個下標(biāo)表達(dá)式串Elist的翻譯過程中隨時都能知道符號表中相應(yīng)于數(shù)組名字id的符號表入口,從而隨時能了解登記在符號表中的有關(guān)數(shù)組id的全部信息。2、產(chǎn)生數(shù)組元素的產(chǎn)生式:

Lid[Elist]|id LElist]|id ElistElist,E|E ElistElist,E|id[E443、數(shù)組元素的翻譯模式:

A、文法:(1)SL:=E (5)LElist] (2)EE+E (6)Lid (3)E(E) (7)ElistElist,E (4)EL (8)Elistid[E§7.3賦值語句的翻譯45§7.3賦值語句的翻譯B、說明:id.place-id的符號表入口

E.place-存放E的名字/值

L.offset-L僅為簡單名字,則為null ≠null,則L為數(shù)組元素引用,存放臨時變量的 值(常量部分的值) L.place-L-簡單名字,則指向符號表中相應(yīng)此名字表 項的指針,即此名字的符號表入口

L-數(shù)組引用,則L.place存放臨時變量的值(常 量部分的值) Elist.array-用來記錄指向符號表中相應(yīng)數(shù)組名字表項 的指針數(shù)組變量的入口

Elist.place-表示臨時變量,用來臨時存放由Elist中的下 標(biāo)表達(dá)式計算出的值

Elist.ndim-記錄Elist中的下標(biāo)表達(dá)式的個數(shù),即維數(shù)

Limit(array,j)-返回nj,即由array所指示的數(shù)組的第j維長度§7.3賦值語句的翻譯4、舉例已知:A為10×20的數(shù)組,即n1=10,n2=20,設(shè)w=4,x:=A[y,z] x:=A[y,z]

其相應(yīng)的三地址語句序列如下: (1)T1:=y*20 (2)T1:=T1+z (3)T2:=A-84 (4)T3:=4*T1 (5)T4:=T2[T3] (6)x:=T447ElistE.place=x.offset=nullSx:=LEL]ElistAE[LyLz.place=y.offset=null.place=y.place=y.ndim=1.array=A.place=z.offset=null.place=z.array=A.place=T1.ndim=2t=T1m=2輸出的四元式:T1:=y*20T1:=T1+zT2:=A-84T3:=4*T1T4:=T2[T3]x:=T4.place=T2.offset=T3.place=T448,§7.3賦值語句的翻譯練習(xí):假設(shè)有賦值語句A[x,y]:=B[x,y,z]+t。其中:A是10*20的數(shù)組,B是10*20*30的數(shù)組,數(shù)組下界都是0。請給出該數(shù)組的翻譯結(jié)果。輸出的四元式:T1:=x*20T1:=T1+yT2:=AT3:=4*T1T4:=x*20T4:=T4+yT5:=T4*30T5:=T5+zT6:=BT7:=4*T5T8:=T6[T7]T9:=T8+tT2[T3]:=T949§7.4布爾表達(dá)式的翻譯前言:1、布爾表達(dá)式的兩個基本作用

(1)用來計算邏輯值

(2)用作控制流語句的條件表達(dá)式

2、布爾表達(dá)式的組成及形式 組成:布爾運算符號、布爾變量、關(guān)系表達(dá)式 形式:and,or,not E1relopE2(<,≤,=,≠,>,≥)50§7.4布爾表達(dá)式的翻譯3、產(chǎn)生布爾表達(dá)式的文法: EEorE EEandE EnotE E(E) Eidrelopid Eid51§7.4布爾表達(dá)式的翻譯一、數(shù)值表示法1、計算布爾表達(dá)式值的兩種方法:

(1)逐步計算(與算術(shù)表達(dá)式計算類似)

例:1or(not0and0)or0 =1or(1and0)or0 =1or0or0 =1or0 =1

(2)采取某種優(yōu)化措施

AorB-ifAthenTrueelseB AandB-ifAthenBelseFalse notA-ifAthenFalseelseTrue52§7.4布爾表達(dá)式的翻譯2、采取“逐步計算法”計算布爾表達(dá)式 分析:(1)布爾式 aorbandnotc ?T1:=notc T2:=bandT1 T3:=aorT2 (2)關(guān)系式 a<b?ifa<bthen1else0 ?100:ifa<bgoto103 101:T:=0 102:goto104 103:T:=1 104:……53§7.4布爾表達(dá)式的翻譯3、布爾表達(dá)式“逐步計算法”的翻譯模式:

Emit(--):過程,將產(chǎn)生的三地址代碼送到輸出 文件中

Nextstat:給出輸出序列中下一條三地址語句的地 址索引,每產(chǎn)生一條三地址語句后,過

程emit將nextstat加154關(guān)于布爾表達(dá)式的數(shù)值表示法的翻譯模式:EE1orE2 {E.place:=newtemp; emit(E.place‘:=’E1.place‘or’E2.place)}EE1andE2 {E.place:=newtemp; emit(E.place‘:=’E1.place‘a(chǎn)nd’E2.place)}EnotE1 {E.place:=newtemp; emit(E.place‘:=’‘not’E1.place)}E(E) {E.place:=E1.place}Eid1relopid2 {E.place:=newtemp; emit(‘if’id1.placerelop.opid2.place ‘goto’nextstat+3); emit(E.place‘:=’‘0’); emit(‘goto’nextstat+2); emit(E.place‘:=’‘1’);Eid {E.place:=id.place}§7.4布爾表達(dá)式的翻譯4、舉例:a<borc<dande<f ?100:ifa<bgoto103 101:T1:=0 102:goto104 103:T1:=1

104:ifc<dgoto107 105:T2:=0 106:goto108 107:T2:=1 108:ife<fgoto111 109:T3:=0 110:goto112 111:T3:=1 112:T4:=T2andT3 113:T5:=T1orT456§7.4布爾表達(dá)式的翻譯二、作為條件控制的布爾式的翻譯1、以布爾式為條件控制的語句

SifEthenS1|ifEthenS1elseS2|whileEdoS1相應(yīng)的代碼結(jié)構(gòu):E的代碼S1的代碼E.True

E.falseGotoS.nextS2的代碼E的代碼S1的代碼E.True

E.falseS.next……beginGotobeginE的代碼S1的代碼E.TrueE.false ……57§7.4布爾表達(dá)式的翻譯注:

這里的布爾式作用僅在于控制對S1和S2的選擇,無須將E的值最終保留某個臨時單元之中。 ?設(shè)置兩種出口:真出口E.true,假出口E.false58§7.4布爾表達(dá)式的翻譯2、初步分析

E→E1orE2

?E1.true

E.trueE2.true

E.true E2.false

E.false

E→E1andE2

?E1.false

E.falseE2.true

E.true E2.false

E.false59§7.4布爾表達(dá)式的翻譯3、翻譯模式

說明:(1)E.truelist/E.falselist (2)四元式(jnz,a,-,p)ifagotop (jrop,x,y,p)ifxropygotop (j,-,-,p) gotop (3)鏈:60§7.4布爾表達(dá)式的翻譯變量和過程:變量nextquad-指向下一條將要產(chǎn)生但尚未形成的四元式的地址,初值為1,執(zhí)行一次emit后自動加1函數(shù)makelist(i)-函數(shù)merge(p1,p2)-把鏈?zhǔn)诪閜1和p2的兩條鏈合并為一,作為函數(shù)值,回送合并后的鏈?zhǔn)走^程backpatch(p,t)-功能是完成“回填”,把p所鏈接的每個四元式的第四個區(qū)段都填為t61E→E1orME2 {backpatch(E1.falselist,M.quad)E.truelist:=merge(E1.truelist,E2.truelsit)E.falselist:=E2.falselist}E→E1andME2 {backpatch(E1.truelist,M.quad)E.truelist:=E2.truelsitE.falselist:=merge(E1.falselist,E2.falselist)}62E→notE1E→(E1)M→ε{E.truelist:=E1.falselistE.falselist:=E1.truelist}{E.truelist:=E1.truelistE.falselist:=E1.falselist}{M.quad:=nextquad}63E→id1relopid2E→id{E.truelist:=makelist(nextquad);E.falselist:=makelist(nextquad+1);emit(‘j’relop.op‘,’id1.place‘,’id2.place‘,’‘0’)emit(‘j,-,-,0’)}{E.truelist:=makelist(nextquad);E.falselist:=makelist(nextquad+1);emit(‘jnz’

‘,’id.place‘,’

‘-’

‘,’‘0’);emit(‘j,-,-,0’)}64§7.4布爾表達(dá)式的翻譯5、例題:a<borc<dande<fM.tl={100}.fl={101}EEorEεMEandEεba<dc<fe<100(j<,a,b,0)101(j,-,-,0)102(j<,c,d,0)103(j,-,-,0).quad=102.tl={102}.fl={103}.quad=104.tl={104}.fl={105}104(j<,e,f,0)105(j,-,-,0).tl={104}.fl={103,105}104.tl={100,104}.fl={103,105}10265§7.4布爾表達(dá)式的翻譯6、練習(xí)(a>b)and(c>d)or(e<f)66§7.5控制語句的翻譯一、控制流語句

SifEthenS1

|ifEthenS1elseS2

|whileEdoS167§7.5控制語句的翻譯E.true:E.false:E.codeS1.codeS→ifEthenS1E.true:=newlableE.false:=S.nextS1.next:=S.nextS.code:=E.code||gen(E.true’:’)||S1.code68§7.5控制語句的翻譯S→ifEthenS1elseS2E.true:=newlableE.false:=newlableS1.next:=S.nextS2.next:=S.nextS.code:=E.code||gen(E.true’:’)||S1.code||gen(‘goto’S.next)||gen(E.false’:’)||S2.codeE.codeS1.codegotoS.nextS2.codeE.true:E.false:S.next:69§7.5控制語句的翻譯S→whileEdoS1S.begin:=newlableE.true:=newlableE.false:=S.nextS1.next:=S.beginS.code:=gen(S.begin‘:’)||E.code||gen(E.true’:’)||S1.code||gen(‘goto’S.begin)E.codeS1.codegotoS.beginE.true:

溫馨提示

  • 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

提交評論