匯編語言中間代碼生成_第1頁
匯編語言中間代碼生成_第2頁
匯編語言中間代碼生成_第3頁
匯編語言中間代碼生成_第4頁
匯編語言中間代碼生成_第5頁
已閱讀5頁,還剩121頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第七章中間代碼生成本章內(nèi)容介紹幾種常用的中間表示:后綴表示、圖形表示和三地址代碼用語法制導定義和翻譯方案的方法來說明程序設計語言的結構怎樣被翻譯成中間形式分析器靜態(tài)檢查器中間代碼生成器中間代碼記號流代碼生成器7.1

中間語言7.1.1后綴表示表達式E的后綴表示可以如下歸納定義如果E是變量或常數(shù),那么E的后綴表示就是E本身。7.1

中間語言7.1.1后綴表示表達式E的后綴表示可以如下歸納定義如果E是變量或常數(shù),那么E的后綴表示就是E本身。如果E是形式為E1opE2的表達式,那么E的后綴表示是E1E2

op,其中E1和E2分別是E1和E2的后綴表示。7.1

中間語言7.1.1后綴表示表達式E的后綴表示可以如下歸納定義如果E是變量或常數(shù),那么E的后綴表示就是E本身。如果E是形式為E1opE2的表達式,那么E的后綴表示是E1E2

op,其中E1和E2分別是E1和E2的后綴表示。如果E是形式為(E1)的表達式,那么E1的后綴表示也是E的后綴表示。

7.1

中間語言后綴表示不需要括號 (84)+2的后綴表示是842+

7.1

中間語言后綴表示不需要括號 (84)+2的后綴表示是842+

后綴表示的最大優(yōu)點是便于計算機處理表達式7.1

中間語言后綴表示不需要括號 (84)+2的后綴表示是842+

后綴表示的最大優(yōu)點是便于計算機處理表達式后綴表示很容易拓廣到含一元算符的表達式7.1

中間語言后綴表示不需要括號 (84)+2的后綴表示是842+

后綴表示的最大優(yōu)點是便于計算機處理表達式后綴表示很容易拓廣到含一元算符的表達式后綴表示也可以拓廣到表示賦值語句和控制語句,但很難用棧來描述它的計算7.1

中間語言7.1.2

圖形表示語法樹是一種圖形化的中間表示

assigna++bcdcduminus(a)語法樹

a=(b+cd)+cd的圖形表示7.1

中間語言7.1.2

圖形表示抽象語法樹是一種圖形化的中間表示有向無環(huán)圖也是一種中間表示

assigna++bcdcduminusassigna++bcduminus(a)語法樹(b)dag

a=(b+cd)+cd的圖形表示7.1

中間語言構造賦值語句抽象語法樹的語法制導定義 產(chǎn)

規(guī)

則Sid:=E

S.nptr=mknode(‘a(chǎn)ssign’,mkleaf(id,id.entry),E.nptr)E

E1+E2

E.nptr=mknode(‘+’,E1.nptr,E2.nptr)E

E1E2E.nptr=mknode(‘’,E1.nptr,E2.nptr)E

E1E.nptr=mkunode(‘uminus’,E1.nptr)E(E1)E.nptr=E1.nptr

FidE.nptr=mkleaf(id,id.entry)7.1

中間語言7.1.3三地址代碼一般形式:x=yopz表達式x+y

z翻譯成的三地址語句序列是t1=y

z

t2=x+t1

7.1

中間語言三地址代碼是抽象語法樹或dag的一種線性表示 a=(b+cd)+cd 抽象語法樹的代碼 t1=b

t2=c

d

t3=t1+t2

t4=c

d

t5=t3+t4

a=t5assigna++bcdcduminus7.1

中間語言三地址代碼是語法樹或dag的一種線性表示 a=(b+cd)+cd 語法樹的代碼 dag的代碼 t1=b t1=b

t2=c

d t2=c

d

t3=t1+t2 t3=t1+t2

t4=c

d t4=t3+t2

t5=t3+t4 a=t4

a=t5assigna++bcduminus7.1

中間語言本書常用的三地址語句賦值語句x=yopz, x=opy, x=y無條件轉移gotoL條件轉移ifxrelop

ygotoL過程調(diào)用paramx

和callp,n過程返回

returny索引賦值x=y[i]和x[i]=y地址和指針賦值x=&y,x=y和x=y7.1

中間語言賦值語句生成三地址代碼的屬性文法產(chǎn)

規(guī)

則Sid:=E

S.code=E.code||gen(id.place‘=‘E.place)E

E1+E2

E

E1E27.1

中間語言賦值語句生成三地址代碼的屬性文法產(chǎn)

規(guī)

則Sid:=E

S.code=E.code||gen(id.place‘=‘E.place)E

E1+E2

E.Place=newtemp;E.Code=E1.code||E2.code||gen(E.place‘=‘E1.place‘+’E2.place)

E

E1E27.1

中間語言賦值語句生成三地址代碼的屬性文法產(chǎn)

規(guī)

則Sid:=E

S.code=E.code||gen(id.place‘=‘E.place)E

E1+E2

E.Place=newtemp;E.Code=E1.code||E2.code||gen(E.place‘=‘E1.place‘+’E2.place)

E

E1E2E.Place=newtemp;E.Code=E1.code||E2.code||gen(E.place‘=‘E1.place‘*’E2.place)7.1

中間語言賦值語句生成三地址代碼的屬性文法產(chǎn)

規(guī)

則E

E1E.Place=newtemp;E.Code=E1.code||gen(E.place‘=‘‘uminus’E1.place)E(E1)Eid7.1

中間語言賦值語句生成三地址代碼的屬性文法產(chǎn)

規(guī)

則E

E1E.Place=newtemp;E.Code=E1.code||gen(E.place‘=‘‘uminus’E1.place)E(E1)E.place=E1.place;E.Code=E1.code;Eid7.1

中間語言賦值語句生成三地址代碼的屬性文法產(chǎn)

規(guī)

則E

E1E.Place=newtemp;E.Code=E1.code||gen(E.place‘=‘‘uminus’E1.place)E(E1)E.place=E1.place;E.Code=E1.code;EidE.place=id.place;E.Code=‘’;7.1

中間語言三地址代碼的具體表現(xiàn)形式:四元式三元式間接三元式7.1

中間語言四元式:a=b*-c+b*-coparg1arg2result(0)uminuscT1(1)*bT1T2(2)uminuscT3(3)*bT3T4(4)+T2T4T5(5)=T5a7.1

中間語言三元式:a=b*-c+b*-coparg1arg2(0)uminusc(1)*b(0)(2)uminusc(3)*b(2)(4)+(1)(3)(5)=a(4)7.1

中間語言間接三元式:a=b*-c+b*-coparg1arg2(0)uminusc(1)*b(0)(2)+(1)(1)(3)=a(2)間接代碼表(0)(1)(0)(1)(2)(3)7.1

中間語言練習:將表達式:-(a+b)*((c+d)-(a+b+c))分別表示成:后綴式、抽象語法樹、DAG、三元式、間接三元式、四元式7.2

聲明語句為局部名字建立符號表條目為它分配存儲單元符號表中包含名字的類型和分配給它的存儲單元的相對地址等信息7.2

聲明語句7.2.1

過程中的聲明 例子: i:integer; j:real; k:array[10]ofreal; m:↑integer假設integer占4個字節(jié),real占8個字節(jié)名稱類型長度偏移符號表7.2

聲明語句7.2.1

過程中的聲明 例子: i:integer; j:real; k:array[10]ofreal; m:↑integer假設integer占4個字節(jié),real占8個字節(jié)名稱類型長度偏移iint40符號表7.2

聲明語句7.2.1

過程中的聲明 例子: i:integer; j:real; k:array[10]ofreal; m:↑integer假設integer占4個字節(jié),real占8個字節(jié)名稱類型長度偏移iint40jreal84符號表7.2

聲明語句7.2.1

過程中的聲明 例子: i:integer; j:real; k:array[10]ofreal; m:↑integer假設integer占4個字節(jié),real占8個字節(jié)名稱類型長度偏移iint40jreal84karray(10,real)8012符號表7.2

聲明語句7.2.1

過程中的聲明 例子: i:integer; j:real; k:array[10]ofreal; m:↑integer假設integer占4個字節(jié),real占8個字節(jié)名稱類型長度偏移iint40jreal84karray(10,real)8012mpointer(integer)492符號表7.2

聲明語句計算被聲明名字的類型和相對地址P {offset=0} DSD

D;D

Did: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}7.2

聲明語句7.2.2作用域信息的保存所討論語言的文法 P

DS DD;D|id:T|procid;D;S語義動作用到的函數(shù)mktable(previous)enter(table,name,type,offset)

addwidth(table,width)enterproc(table,name,newtable)7.2

聲明語句Programsort(input,output) vara:array[0..10]ofinteger; x:integer; procedurereadarray; vari:integer; begin...a…end{readarray}; procedureexchange(i,j:integer); begin x:=a[i];a[i]:=a[j];a[j]:=x end{exchange};7.2

聲明語句 procedurequicksort(m,n:integer); vark,v:integer; functionpartition(y,z:integer):integer; vari,j:integer; begin…a… …v… …exchange(i,j);… end{partition}; begin…end{quicksort};begin…end{sort}.7.2

聲明語句嵌套關系sortreadarrayexchangepartition Sort當中定義了數(shù)組a,readarray中需要使用這一變量,應該如何去組織符號表呢?7.2

聲明語句exchangereadarrayxa表頭空sortquicksort指向readarraypartitionvk表頭quicksortreadarrayi表頭exchange表頭指向exchangepartition7.2

聲明語句P

MDS

{addwidth(top(tblptr),top(offset));

pop(tblptr);pop(offset)}M

{t=mktable(nil); push(t,tblprt);push(0,offset)}D

D1;D2Dprocid;ND1;S{t=top(tblptr);addwidth(t,top(offset));pop(tblptr);pop(offset); enterproc(top(tblptr),,t)}Did:T{enter(top(tblptr),,T.type,top(offset)); top(offset)=top(offset)+T.width}N

{t=mktable(top(tblptr)); push(t,tblptr);push(0,offset)}7.2

聲明語句7.2.3

記錄的域名TrecordDendTrecordL

Dend {T.type=record(top(tblptr)); T.width=top(offset); pop(tblptr);pop(offset)}L

{t=mktable(nil); push(t,tblptr);push(0,offset)}7.3

賦值語句a=(b+cd)+cd 三地址代碼 t1=b

t2=c

d

t3=t1+t2

t4=c

d

t5=t3+t4

a=t5 四元式 0 (@,b,-,t1)1(*,c,d,t2)2(+,t1,t2,t3)3(*,c,d,t4)4(+,t3,t4,t5)5(=,t5,-,a)7.3

賦值語句7.3.1賦值語句的翻譯模式Sid:=E {p=lookup(id.lexeme); ifp!=

nilthen emit(p,‘=’,E.place) elseerror}E

E1+E2

{E.place=newtemp;

emit(E.place,‘=’,E1.place,‘+’,E2.place)}7.3

賦值語句7.3.1賦值語句的翻譯模式E

E1{E.place=newtemp; emit(E.place,‘=’,‘uminus’,E1.place)}E(E1){E.place=E1.place}Eid{p=lookup(id.lexeme); ifp!=

nilthenE.place=pelseerror}7.3

賦值語句7.3.2臨時名字的重新使用大量臨時變量的使用對優(yōu)化有利大量臨時變量會增加符號表管理的負擔也會增加運行時臨時數(shù)據(jù)占的空間7.3

賦值語句7.3.2臨時名字的重新使用大量臨時變量的使用對優(yōu)化有利大量臨時變量會增加符號表管理的負擔也會增加運行時臨時數(shù)據(jù)占的空間E

E1+E2的動作產(chǎn)生的代碼的一般形式為

計算E1到t1

計算E2到t2

t3=t1

+t2 (())((()())())臨時變量的生存期像配對括號那樣嵌套或并列7.3

賦值語句基于臨時變量生成期特征的三地址代碼x=ab+cdef語

c的值

0$0=ab1$1=cd2$0=$0+$11

$1=ef2$0=$0$11x=$007.3

賦值語句數(shù)組的翻譯:一維數(shù)組二維數(shù)組三維數(shù)組多維數(shù)組7.3

賦值語句7.3.3數(shù)組元素的地址計算一維數(shù)組A的第i個元素的地址計算

base+(i

low)

w7.3

賦值語句7.3.3數(shù)組元素的地址計算一維數(shù)組A的第i個元素的地址計算

base+(i

low)

w

重寫成

(base

low

w)+i

w基址變址二維數(shù)組的翻譯二維a[i1,i2]的維數(shù)d1*d2D=a+d2(i1–1)+i2–1=a–(d2+1)+i1d2+i2=Conspart+Varpart對D的四元式翻譯 *,i1,d2,T1 +,T1,i2,T2 -,a,c,T3所以A[i1,i2]的地址D=T3[T2]三維A[i1,i2,i3]的維數(shù)d1*d2*d3i1i2i3d2d3d1D=a+d2d3(i1–1)+d3(i2-1)+i3–1=a–(d2d3+d3+1)+(i1d2d3+i2d3+i3)=Conspart+Varpart對D的四元式翻譯 *,i1,d2,T1 +,T1,i2,T2 *,T2,d3,T3 +,T3,i3,T4 -,a,c,T5所以A[i1,i2,i3]的地址D=T5[T4]VarpartConspart7.3

賦值語句總結:對于所有的數(shù)組A[i1,i3,i3,…]來講,數(shù)組的地址都可以概括成A-C+V的格式,其中A是數(shù)組的首地址,C是編譯時可以預先確定的常數(shù),V根據(jù)下標的變化而變化。一維:C=1×w,V=i1×w二維:C=(d2+1)×w,V=(i1d2+i2)×w三維:C=(d2d3+d3+1)×w =(((d2+1)×d3)+1)×w7.3

賦值語句三維:V=(i1d2d3+i2d3+i3)×w =(((i1d2+i2)×d3)

+i3))×w多維:C=((…(((d2+1)×d3)+1)…)dn+1)×w V=((…(((i1d2+i2)×d3)+i3)…)dn+in)×w7.3

賦值語句7.3.4數(shù)組元素地址計算的翻譯方案下標變量訪問的產(chǎn)生式

Lid[Elist]|id Elist

Elist,E|E改成

L

Elist]|id Elist

Elist,E|id[E7.3

賦值語句所有產(chǎn)生式S

L:=EE

E+EE(E)E

LL

Elist]LidElist

Elist,EElist

id[E7.3

賦值語句Lid{L.place=id.place;L.offset=null}7.3

賦值語句Lid{L.place=id.place;L.offset=null}Elist

id[E{Elist.place=E.place;Elist.ndim=1; Elist.array=id.place}7.3

賦值語句Lid{L.place=id.place;L.offset=null}Elist

id[E{Elist.place=E.place;Elist.ndim=1; Elist.array=id.place}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.array;

Elist.place=t;Elist.ndim=m}7.3

賦值語句Lid{L.place=id.place;L.offset=null}Elist

id[E{Elist.place=E.place;Elist.ndim=1; Elist.array=id.place}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.array;

Elist.place=t;Elist.ndim=m}L

Elist] {L.place=newtemp;emit(L.place,‘=’,base(Elist.array),‘’, invariant(Elist.array));L.offset=newtemp;emit(L.offset,‘=’,Elist.place,‘’,w)}7.3

賦值語句E

L{ifL.offset==nullthen/

L是簡單變量

/

E.place=L.place

elsebeginE.place=newtemp;

emit(E.place,‘=’,L.place,‘[’,L.offset,‘]’)end}7.3

賦值語句E

L{ifL.offset==nullthen/

L是簡單變量

/

E.place=L.place

elsebeginE.place=newtemp;

emit(E.place,‘=’,L.place,‘[’,L.offset,‘]’)end}E

E1+E2{E.place=newtemp; emit(E.place,‘=’,E1.place,‘+’,E2.place)}7.3

賦值語句E

L{ifL.offset==nullthen/

L是簡單變量

/

E.place=L.place

elsebeginE.place=newtemp;

emit(E.place,‘=’,L.place,‘[’,L.offset,‘]’)end}E

E1+E2{E.place=newtemp; emit(E.place,‘=’,E1.place,‘+’,E2.place)}E(E1){E.place=E1.place}

7.3

賦值語句E

L{ifL.offset==nullthen/

L是簡單變量

/

E.place=L.place

elsebeginE.place=newtemp;

emit(E.place,‘=’,L.place,‘[’,L.offset,‘]’)end}E

E1+E2{E.place=newtemp; emit(E.place,‘=’,E1.place,‘+’,E2.place)}E(E1){E.place=E1.place}S

L=E {ifL.offset==nullthen/

L是簡單變量/

emit(L.place,‘=’,E.place) else

emit(L.place,‘[’,L.offset,‘]’,‘=’, E.place)}

7.3

賦值語句例題:設A為一個10×20的數(shù)組,即d1=10,d2=20,并設w=4,試對賦值語句x=A[y,z]進行翻譯。假設數(shù)組的下標從1開始。7.3

賦值語句S:=L.place=xL.offset=nullxE.place=t4L.place=t2L.offset=t3Elist.place=t1Elist.ndim=2Elist.array=A,Elist.place=yElist.ndim=1Elist.array=AE.place=zL.place=zL.offset=nullE.place=yL.place=yL.offset=nullA[z]y

x:=A[y,z]的注釋分析樹7.3

賦值語句S:=L.place=xL.offset=nullxE.place=t4L.place=t2L.offset=t3Elist.place=t1Elist.ndim=2Elist.array=A,Elist.place=yElist.ndim=1Elist.array=AE.place=zL.place=zL.offset=nullE.place=yL.place=yL.offset=nullA[z]y

x:=A[y,z]的注釋分析樹t1=y20t1=t1+z

7.3

賦值語句S:=L.place=xL.offset=nullxE.place=t4L.place=t2L.offset=t3Elist.place=t1Elist.ndim=2Elist.array=A,Elist.place=yElist.ndim=1Elist.array=AE.place=zL.place=zL.offset=nullE.place=yL.place=yL.offset=nullA[z]y

x:=A[y,z]的注釋分析樹t1=y20t1=t1+z

t2=A84t3=4t1

7.3

賦值語句S:=L.place=xL.offset=nullxE.place=t4L.place=t2L.offset=t3Elist.place=t1Elist.ndim=2Elist.array=A,Elist.place=yElist.ndim=1Elist.array=AE.place=zL.place=zL.offset=nullE.place=yL.place=yL.offset=nullA[z]y

x:=A[y,z]的注釋分析樹t1=y20t1=t1+z

t2=A84t3=4t1

t4=t2[t3]7.3

賦值語句S:=L.place=xL.offset=nullxE.place=t4L.place=t2L.offset=t3Elist.place=t1Elist.ndim=2Elist.array=A,Elist.place=yElist.ndim=1Elist.array=AE.place=zL.place=zL.offset=nullE.place=yL.place=yL.offset=nullA[z]y

x:=A[y,z]的注釋分析樹t1=y20t1=t1+z

t2=A84t3=4t1

t4=t2[t3]x=t4

7.3

賦值語句T1=y×20T1=T1+zT2=A-84T3=4*T1T4=T2[T3]X=T4T1=y×20T2=T1+zT3=A-84T4=4*T1T5=T3[T4]X=T57.3

賦值語句7.3.5類型轉換x=y+ij(x和y的類型是real,i和j的類型是integer)中間代碼t1=iintjt2=inttorealt1

t3=yreal+t2

x=t37.3

賦值語句E

E1+E2E.place=newtempifE1.type==integer&&E2.type==integerthenbegin

emit(E.place,‘=’,E1.place,‘int+’,E2.place);

E.type=integerendelseifE1.type==integer&&E2.type==realthenbegin u=newtemp; emit(u,‘=’,‘inttoreal’,E1.place); emit(E.place,‘=’,u,

‘real+’,E2.place); E.type=realend...7.4

布爾表達式和控制流語句布爾表達式有兩個基本目的計算邏輯值在控制流語句中用作條件表達式7.4

布爾表達式和控制流語句布爾表達式有兩個基本目的計算邏輯值在控制流語句中用作條件表達式布爾表達式的完全計算布爾表達式的“短路”計算E1orE2定義成ifE1thentrueelseE2E1andE2定義成

ifE1thenE2elsefalse7.4

布爾表達式和控制流語句7.4.1布爾表達式的翻譯E

E

orE|EandE|notE|(E) |idrelopid|true|falsea<b的翻譯100:ifa<bgoto103101:t=0102:goto104103:t=1104:7.4

布爾表達式和控制流語句7.4.2控制流語句的翻譯SifEthenS1 |ifEthenS1

elseS2 |whileEdoS1 |S1;S2

7.4

布爾表達式和控制流語句E.codeS1.codeE.true:...指向E.true指向E.false(a)if-thenE.codeS1.codeE.true:...指向E.true指向E.falseE.false:gotoS.nextS2.code(b)if-then-elseE.codeS1.codeE.true:...指向E.true指向E.falsegotoS.beginS.begin:(c)while-doS1.codeS2.codeS1.next:...(d)S1;S27.4

布爾表達式和控制流語句布爾表達式翻譯用到的三種四元式結構(jnz,a,-,p) ifagotop(jrop,x,y,p) ifxropygotop(j,-,-,p) gotop7.4

布爾表達式和控制流語句布爾表達式的翻譯規(guī)則先順序翻譯布爾變量和關系表達式,暫時不管布爾運算符號(not,and,or等)。其中,每一個布爾變量和關系表達式對應兩條四元式,第一條是有條件跳轉,第二條是無條件跳轉。最后一個域即跳轉到何處暫時不填,等到全部完成后再填。7.4

布爾表達式和控制流語句對于布爾變量A可以翻譯成: (1) (jnz,A,-,-) (2)(j,-,-,-)對于關系表達式AropB (1) (jrop,

A,B,-) (2)(j,-,-,-)7.4

布爾表達式和控制流語句舉例:IfAor(B<D)thens1elses27.4

布爾表達式和控制流語句舉例:IfAor(B<D)thens1elses2(jnz,A,-,-)(j,-,-,-)(j<,B,D,-)(j,-,-,-)S1的四元式序列(j,-,-,-)(p+1)S2的四元式序列(q)7.4

布爾表達式和控制流語句舉例:IfAor(B<D)thens1elses2(jnz,A,-,5)(j,-,-,3)(j<,B,D,5)(j,-,-,p+1)S1的四元式序列(j,-,-,q)(p+1)S2的四元式序列(q)選擇結構的翻譯模版IfEthenS1elseS2ES1S2100E.FalseE.Truep(j,_,_p)7.4

布爾表達式和控制流語句條件語句翻譯舉例Ifx>0theny=x+1elsey=x+27.4

布爾表達式和控制流語句Ifx>0theny=x+1elsey=x+2100 (j>,x,0,-)101 (j,-,-,-)102 (+,x,1,t1)103 (=,t1,-,y)104 (j,-,-,-)105 (+,x,2,t2)106 (=,t2,-,y)1077.4

布爾表達式和控制流語句Ifx>0theny=x+1elsey=x+2100 (j>,x,0,102)101 (j,-,-,105)102 (+,x,1,t1)103 (=,t1,-,y)104 (j,-,-,107)105 (+,x,2,t2)106 (=,t2,-,y)1077.4

布爾表達式和控制流語句練習:Ifnotaor(c<d)theny=x+1elsey=x+2循環(huán)結構的翻譯模版DoEwhileSES

P(j,_,_,100)

P+1()100E.TCE.FC7.4

布爾表達式和控制流語句循環(huán)語句的翻譯While(A<B)doIf(C>D)thenx=y+z;7.4

布爾表達式和控制流語句While(A<B)doIf(C>D)thenx=y+z;(j<,A,B,-)101(j,-,-,-)102(j>,C,D,-)103(j,-,-,-)104(+,y,z,t1)105(=,t1,-,x)106(j,-,-,100) 7.4

布爾表達式和控制流語句While(A<B)doIf(C>D)thenx=y+z;(j<,A,B,102)101(j,-,-,107)102(j>,C,D,104)103(j,-,-,100)104(+,y,z,t1)105(=,t1,-,x)106(j,-,-,100) 7.4

布爾表達式和控制流語句練習:While(iorj)and(j>5)do i=j7.4

布爾表達式和控制流語句布爾表達式的語法制導翻譯(1)E->E1orME2{Backpatch(E1.falselist,M.quad);E.Truelist=merge(E1.truelist,E2.truelist);E.Falselist=E2.falselist;}7.4

布爾表達式和控制流語句(2)E->E1andME2{Backpatch(E1.truelist,M.quad);E.truelist=E2.truelist;E.falselist=merge(E1.falselist,E2.falselist);}7.4

布爾表達式和控制流語句(3)E->notE1{E.truelist=E1.falselist;E.falselist=E1.truelist;}(4)E->(E1){E.truelist=E1.truelist;E.Falselist=E1.falselist;}7.4

布爾表達式和控制流語句(5)E->id1relopid2{E.truelist=makelist(nextquad);E.falselist=makelist(nextquad+1);Emit(‘j’relop.op‘,’id1.place‘,’id2.place,‘,’‘0’);Emit(‘j,-,-,0’);}7.4

布爾表達式和控制流語句(6)E->id{E.truelist=makelist(nextquad);E.falselist=makelist(nextquad+1);Emit(‘jnz’‘,’id.place‘,’‘-’,‘,’‘0’);Emit(‘j,-,-,0’);}(7)M->ε{M.quad=nextquad;}7.4

布爾表達式和控制流語句布爾表達式的語法制導翻譯舉例a<borc<dande<forE.tc=100E.fc=101a<bE.tc=104E.fc={103,105}E.tc=102E.fc=103a<borc<dande<f的注釋分析樹M.q=102εc<dandM.q=104εE.tc=104E.fc=105e<fE.tc={100,104}E.fc={10.,105}7.4

布爾表達式和控制流語句布爾表達式的語法制導翻譯舉例a<borc<dande<f100(j<,a,b,0)101(j,-,-,102)102(j<,c,d,104)103(j,-,-,0)104(j<,e,f,0)105(j,-,-,0)7.4

布爾表達式和控制流語句控制語句的語法制導翻譯(1)S->ifEthenM1S1NelseM2S2{Backpatch(E.truelist,M1.quad);Backpatch(E.falselist,M2.quad);S.Nextlist=merge(S1.nextlist,N.nextlist,S2.nextlist)}7.4

布爾表達式和控制流語句(2)N->ε{N.nextlist=makelist(nextquad);Emit(‘j,-,-,-’)}(3)M->ε{M.quad=nextquad;Backpatch(E.truelist,M.quad)}7.4

布爾表達式和控制流語句(4)S->ifEthenMS1{backpatch(E.truelist,M.quad);S.Nextlist=merge(E.falselist,S1.nextlist);}7.4

布爾表達式和控制流語句(5)S->whileM1EdoM2S2{backpatch(S1.nextlist,M1.quad);Backpatch(E.truelist,M2.quad);S.Nextlist=E.falselist;Emit(‘j,-,-,’M1.quad);}7.4

布爾表達式和控制流語句(6)S->beginLend{S.nextlist=L.nextlist}(7)S->A{S.nextlist=makelist()}(8)L->L1;MS{backpatch(L1.nextlist,M.quad);L.Nextlist=S.nextlist}(9)L->S{L.nextlist=S.nextlist}7.4

布爾表達式和控制流語句7.4.4開關語句的翻譯switchE begin caseV1:S1 caseV2:S2 ... caseVn-1:Sn–1 default:Sn end7.4

布爾表達式和控制流語句分支數(shù)較少時 t=E的代碼 |Ln-2:ift!=

Vn-1gotoLn-1

ift!=

V1gotoL1| Sn-1的代碼

S1的代碼 | gotonext gotonext |Ln-1:Sn的代碼

L1: ift!=

V2gotoL2|next: S2的代碼 gotonextL2: ... ...7.4

布爾表達式和控制流語句分支較多時,將分支測試的代碼集中在一起,便于生成較好的分支測試代碼。 t=E的代碼 |Ln: Sn的代碼 gototest

| gotonext

L1: S1的代碼 |test:ift==V1gotoL1

gotonext | ift==V2gotoL2

L2: S2的代碼

| ...

gotonext | ift==Vn-1gotoLn-1 ... | gotoLnLn-1: Sn-1的代碼

|next:

gotonext7.4

布爾表達式和控制流語句中間代碼增加一種case語句,便于代碼生成器對它進行特別處理test: caseV1 L1 caseV2 L2 ... caseVn-1 Ln-1 caset Ln

next:7.4

布爾表達式和控制流語句7.4.5

過程調(diào)用的翻譯Scallid(Elist)Elist

Elist,EElist

E7.4

布爾表達式和控制流語句過程調(diào)用id(E1,E2,…,En)的中間代碼結構E1.place=E1的

溫馨提示

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

評論

0/150

提交評論