版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第七章中間代碼生成本章內(nèi)容介紹幾種常用的中間表示:后綴表示、圖形表示和三地址代碼用語法制導(dǎo)定義和翻譯方案的方法來說明程序設(shè)計語言的結(jié)構(gòu)怎樣被翻譯成中間形式分析器靜態(tài)檢查器中間代碼生成器中間代碼記號流代碼生成器7.1
中間語言7.1.1后綴表示表達(dá)式E的后綴表示可以如下歸納定義如果E是變量或常數(shù),那么E的后綴表示就是E本身。7.1
中間語言7.1.1后綴表示表達(dá)式E的后綴表示可以如下歸納定義如果E是變量或常數(shù),那么E的后綴表示就是E本身。如果E是形式為E1opE2的表達(dá)式,那么E的后綴表示是E1E2
op,其中E1和E2分別是E1和E2的后綴表示。7.1
中間語言7.1.1后綴表示表達(dá)式E的后綴表示可以如下歸納定義如果E是變量或常數(shù),那么E的后綴表示就是E本身。如果E是形式為E1opE2的表達(dá)式,那么E的后綴表示是E1E2
op,其中E1和E2分別是E1和E2的后綴表示。如果E是形式為(E1)的表達(dá)式,那么E1的后綴表示也是E的后綴表示。
7.1
中間語言后綴表示不需要括號 (84)+2的后綴表示是842+
7.1
中間語言后綴表示不需要括號 (84)+2的后綴表示是842+
后綴表示的最大優(yōu)點是便于計算機(jī)處理表達(dá)式7.1
中間語言后綴表示不需要括號 (84)+2的后綴表示是842+
后綴表示的最大優(yōu)點是便于計算機(jī)處理表達(dá)式后綴表示很容易拓廣到含一元算符的表達(dá)式7.1
中間語言后綴表示不需要括號 (84)+2的后綴表示是842+
后綴表示的最大優(yōu)點是便于計算機(jī)處理表達(dá)式后綴表示很容易拓廣到含一元算符的表達(dá)式后綴表示也可以拓廣到表示賦值語句和控制語句,但很難用棧來描述它的計算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
中間語言構(gòu)造賦值語句抽象語法樹的語法制導(dǎo)定義 產(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表達(dá)式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無條件轉(zhuǎn)移gotoL條件轉(zhuǎn)移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
中間語言練習(xí):將表達(dá)式:-(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假設(shè)integer占4個字節(jié),real占8個字節(jié)名稱類型長度偏移符號表7.2
聲明語句7.2.1
過程中的聲明 例子: i:integer; j:real; k:array[10]ofreal; m:↑integer假設(shè)integer占4個字節(jié),real占8個字節(jié)名稱類型長度偏移iint40符號表7.2
聲明語句7.2.1
過程中的聲明 例子: i:integer; j:real; k:array[10]ofreal; m:↑integer假設(shè)integer占4個字節(jié),real占8個字節(jié)名稱類型長度偏移iint40jreal84符號表7.2
聲明語句7.2.1
過程中的聲明 例子: i:integer; j:real; k:array[10]ofreal; m:↑integer假設(shè)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假設(shè)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
聲明語句嵌套關(guān)系sortreadarrayexchangepartition Sort當(dāng)中定義了數(shù)組a,readarray中需要使用這一變量,應(yīng)該如何去組織符號表呢?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)化有利大量臨時變量會增加符號表管理的負(fù)擔(dān)也會增加運行時臨時數(shù)據(jù)占的空間7.3
賦值語句7.3.2臨時名字的重新使用大量臨時變量的使用對優(yōu)化有利大量臨時變量會增加符號表管理的負(fù)擔(dān)也會增加運行時臨時數(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
賦值語句總結(jié):對于所有的數(shù)組A[i1,i3,i3,…]來講,數(shù)組的地址都可以概括成A-C+V的格式,其中A是數(shù)組的首地址,C是編譯時可以預(yù)先確定的常數(shù),V根據(jù)下標(biāo)的變化而變化。一維: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ù)組元素地址計算的翻譯方案下標(biāo)變量訪問的產(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
賦值語句例題:設(shè)A為一個10×20的數(shù)組,即d1=10,d2=20,并設(shè)w=4,試對賦值語句x=A[y,z]進(jìn)行翻譯。假設(shè)數(shù)組的下標(biāo)從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類型轉(zhuǎn)換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
布爾表達(dá)式和控制流語句布爾表達(dá)式有兩個基本目的計算邏輯值在控制流語句中用作條件表達(dá)式7.4
布爾表達(dá)式和控制流語句布爾表達(dá)式有兩個基本目的計算邏輯值在控制流語句中用作條件表達(dá)式布爾表達(dá)式的完全計算布爾表達(dá)式的“短路”計算E1orE2定義成ifE1thentrueelseE2E1andE2定義成
ifE1thenE2elsefalse7.4
布爾表達(dá)式和控制流語句7.4.1布爾表達(dá)式的翻譯E
E
orE|EandE|notE|(E) |idrelopid|true|falsea<b的翻譯100:ifa<bgoto103101:t=0102:goto104103:t=1104:7.4
布爾表達(dá)式和控制流語句7.4.2控制流語句的翻譯SifEthenS1 |ifEthenS1
elseS2 |whileEdoS1 |S1;S2
7.4
布爾表達(dá)式和控制流語句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
布爾表達(dá)式和控制流語句布爾表達(dá)式翻譯用到的三種四元式結(jié)構(gòu)(jnz,a,-,p) ifagotop(jrop,x,y,p) ifxropygotop(j,-,-,p) gotop7.4
布爾表達(dá)式和控制流語句布爾表達(dá)式的翻譯規(guī)則先順序翻譯布爾變量和關(guān)系表達(dá)式,暫時不管布爾運算符號(not,and,or等)。其中,每一個布爾變量和關(guān)系表達(dá)式對應(yīng)兩條四元式,第一條是有條件跳轉(zhuǎn),第二條是無條件跳轉(zhuǎn)。最后一個域即跳轉(zhuǎn)到何處暫時不填,等到全部完成后再填。7.4
布爾表達(dá)式和控制流語句對于布爾變量A可以翻譯成: (1) (jnz,A,-,-) (2)(j,-,-,-)對于關(guān)系表達(dá)式AropB (1) (jrop,
A,B,-) (2)(j,-,-,-)7.4
布爾表達(dá)式和控制流語句舉例:IfAor(B<D)thens1elses27.4
布爾表達(dá)式和控制流語句舉例:IfAor(B<D)thens1elses2(jnz,A,-,-)(j,-,-,-)(j<,B,D,-)(j,-,-,-)S1的四元式序列(j,-,-,-)(p+1)S2的四元式序列(q)7.4
布爾表達(dá)式和控制流語句舉例:IfAor(B<D)thens1elses2(jnz,A,-,5)(j,-,-,3)(j<,B,D,5)(j,-,-,p+1)S1的四元式序列(j,-,-,q)(p+1)S2的四元式序列(q)選擇結(jié)構(gòu)的翻譯模版IfEthenS1elseS2ES1S2100E.FalseE.Truep(j,_,_p)7.4
布爾表達(dá)式和控制流語句條件語句翻譯舉例Ifx>0theny=x+1elsey=x+27.4
布爾表達(dá)式和控制流語句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
布爾表達(dá)式和控制流語句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
布爾表達(dá)式和控制流語句練習(xí):Ifnotaor(c<d)theny=x+1elsey=x+2循環(huán)結(jié)構(gòu)的翻譯模版DoEwhileSES
P(j,_,_,100)
P+1()100E.TCE.FC7.4
布爾表達(dá)式和控制流語句循環(huán)語句的翻譯While(A<B)doIf(C>D)thenx=y+z;7.4
布爾表達(dá)式和控制流語句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
布爾表達(dá)式和控制流語句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
布爾表達(dá)式和控制流語句練習(xí):While(iorj)and(j>5)do i=j7.4
布爾表達(dá)式和控制流語句布爾表達(dá)式的語法制導(dǎo)翻譯(1)E->E1orME2{Backpatch(E1.falselist,M.quad);E.Truelist=merge(E1.truelist,E2.truelist);E.Falselist=E2.falselist;}7.4
布爾表達(dá)式和控制流語句(2)E->E1andME2{Backpatch(E1.truelist,M.quad);E.truelist=E2.truelist;E.falselist=merge(E1.falselist,E2.falselist);}7.4
布爾表達(dá)式和控制流語句(3)E->notE1{E.truelist=E1.falselist;E.falselist=E1.truelist;}(4)E->(E1){E.truelist=E1.truelist;E.Falselist=E1.falselist;}7.4
布爾表達(dá)式和控制流語句(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
布爾表達(dá)式和控制流語句(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
布爾表達(dá)式和控制流語句布爾表達(dá)式的語法制導(dǎo)翻譯舉例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
布爾表達(dá)式和控制流語句布爾表達(dá)式的語法制導(dǎo)翻譯舉例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
布爾表達(dá)式和控制流語句控制語句的語法制導(dǎo)翻譯(1)S->ifEthenM1S1NelseM2S2{Backpatch(E.truelist,M1.quad);Backpatch(E.falselist,M2.quad);S.Nextlist=merge(S1.nextlist,N.nextlist,S2.nextlist)}7.4
布爾表達(dá)式和控制流語句(2)N->ε{N.nextlist=makelist(nextquad);Emit(‘j,-,-,-’)}(3)M->ε{M.quad=nextquad;Backpatch(E.truelist,M.quad)}7.4
布爾表達(dá)式和控制流語句(4)S->ifEthenMS1{backpatch(E.truelist,M.quad);S.Nextlist=merge(E.falselist,S1.nextlist);}7.4
布爾表達(dá)式和控制流語句(5)S->whileM1EdoM2S2{backpatch(S1.nextlist,M1.quad);Backpatch(E.truelist,M2.quad);S.Nextlist=E.falselist;Emit(‘j,-,-,’M1.quad);}7.4
布爾表達(dá)式和控制流語句(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
布爾表達(dá)式和控制流語句7.4.4開關(guān)語句的翻譯switchE begin caseV1:S1 caseV2:S2 ... caseVn-1:Sn–1 default:Sn end7.4
布爾表達(dá)式和控制流語句分支數(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
布爾表達(dá)式和控制流語句分支較多時,將分支測試的代碼集中在一起,便于生成較好的分支測試代碼。 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
布爾表達(dá)式和控制流語句中間代碼增加一種case語句,便于代碼生成器對它進(jìn)行特別處理test: caseV1 L1 caseV2 L2 ... caseVn-1 Ln-1 caset Ln
next:7.4
布爾表達(dá)式和控制流語句7.4.5
過程調(diào)用的翻譯Scallid(Elist)Elist
Elist,EElist
E7.4
布爾表達(dá)式和控制流語句過程調(diào)用id(E1,E2,…,En)的中間代碼結(jié)構(gòu)E1.place=E1的
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 上海機(jī)場公寓租賃合同范例
- 中介用工合同范例
- 養(yǎng)牛合作合同范例
- 修改補(bǔ)充合同范例
- 外包水暖合同模板
- 國企建筑合同范例
- 原料藥合同模板
- 臨建內(nèi)部裝修合同范例
- 鄉(xiāng)村旅游概念規(guī)劃合同范例
- 分款合同范例
- GB/T 27021.1-2017合格評定管理體系審核認(rèn)證機(jī)構(gòu)要求第1部分:要求
- GB/T 22796-2021床上用品
- 中國聯(lián)通LAN工程施工及驗收規(guī)范
- 中間表模式接口相關(guān)-住院與his-adt方案
- 臨床PCR檢驗的室內(nèi)質(zhì)控方法課件
- 計算機(jī)解決問題的過程-優(yōu)質(zhì)課課件
- 作文講評-“忘不了……”課件
- 深基坑安全管理(安全培訓(xùn))課件
- 12月4日全國法制宣傳日憲法日憲法知識科普宣教PPT教學(xué)課件
- 血液透析營養(yǎng)管理課件
- 神經(jīng)內(nèi)科醫(yī)療質(zhì)量評價體系考核標(biāo)準(zhǔn)
評論
0/150
提交評論