版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
匯編語(yǔ)言中間代碼生成匯編語(yǔ)言中間代碼生成匯編語(yǔ)言中間代碼生成7.1中間語(yǔ)言7.1.1后綴表示表達(dá)式E的后綴表示可以如下歸納定義如果E是變量或常數(shù),那么E的后綴表示就是E本身。2020/11/1427.1
中間語(yǔ)言7.1.1后綴表示表達(dá)式E的后綴表示可以如下歸納定義如果E是變量或常數(shù),那么E的后綴表示就是E本身。2020/11/1427.1
中間語(yǔ)言7.1.1后綴表示表達(dá)式E的后綴表示可以如下歸納定義如果E是變量或常數(shù),那么E的后綴表示就是E本身。如果E是形式為E1opE2的表達(dá)式,那么E的后綴表示是E1E2
op,其中E1和E2分別是E1和E2的后綴表示。2020/11/1437.1
中間語(yǔ)言7.1.1后綴表示表達(dá)式E的后綴表示可以如下歸納定義如果E是變量或常數(shù),那么E的后綴表示就是E本身。如果E是形式為E1opE2的表達(dá)式,那么E的后綴表示是E1E2
op,其中E1和E2分別是E1和E2的后綴表示。如果E是形式為(E1)的表達(dá)式,那么E1的后綴表示也是E的后綴表示。
2020/11/1447.1
中間語(yǔ)言后綴表示不需要括號(hào) (84)+2的后綴表示是842+
2020/11/1457.1
中間語(yǔ)言后綴表示不需要括號(hào) (84)+2的后綴表示是842+
后綴表示的最大優(yōu)點(diǎn)是便于計(jì)算機(jī)處理表達(dá)式2020/11/1467.1
中間語(yǔ)言后綴表示不需要括號(hào) (84)+2的后綴表示是842+
后綴表示的最大優(yōu)點(diǎn)是便于計(jì)算機(jī)處理表達(dá)式后綴表示很容易拓廣到含一元算符的表達(dá)式2020/11/1477.1
中間語(yǔ)言后綴表示不需要括號(hào) (84)+2的后綴表示是842+
后綴表示的最大優(yōu)點(diǎn)是便于計(jì)算機(jī)處理表達(dá)式后綴表示很容易拓廣到含一元算符的表達(dá)式后綴表示也可以拓廣到表示賦值語(yǔ)句和控制語(yǔ)句,但很難用棧來描述它的計(jì)算2020/11/1487.1
中間語(yǔ)言7.1.2
圖形表示語(yǔ)法樹是一種圖形化的中間表示
assigna++bcdcduminus(a)語(yǔ)法樹
a=(b+cd)+cd的圖形表示2020/11/1497.1
中間語(yǔ)言7.1.2
圖形表示抽象語(yǔ)法樹是一種圖形化的中間表示有向無環(huán)圖也是一種中間表示
assigna++bcdcduminusassigna++bcduminus(a)語(yǔ)法樹(b)dag
a=(b+cd)+cd的圖形表示2020/11/14107.1
中間語(yǔ)言構(gòu)造賦值語(yǔ)句抽象語(yǔ)法樹的語(yǔ)法制導(dǎo)定義 產(chǎn)
生
式
語(yǔ)
義
規(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)2020/11/14117.1
中間語(yǔ)言7.1.3三地址代碼一般形式:x=yopz表達(dá)式x+y
z翻譯成的三地址語(yǔ)句序列是t1=y
z
t2=x+t1
2020/11/14127.1
中間語(yǔ)言三地址代碼是抽象語(yǔ)法樹或dag的一種線性表示 a=(b+cd)+cd 抽象語(yǔ)法樹的代碼 t1=b
t2=c
d
t3=t1+t2
t4=c
d
t5=t3+t4
a=t5assigna++bcdcduminus2020/11/14137.1
中間語(yǔ)言三地址代碼是語(yǔ)法樹或dag的一種線性表示 a=(b+cd)+cd 語(yǔ)法樹的代碼 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++bcduminus2020/11/14147.1
中間語(yǔ)言本書常用的三地址語(yǔ)句賦值語(yǔ)句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=y2020/11/14157.1
中間語(yǔ)言賦值語(yǔ)句生成三地址代碼的屬性文法產(chǎn)
生
式
語(yǔ)
義
規(guī)
則Sid:=E
S.code=E.code||gen(id.place‘=‘E.place)E
E1+E2
E
E1E22020/11/14167.1
中間語(yǔ)言賦值語(yǔ)句生成三地址代碼的屬性文法產(chǎn)
生
式
語(yǔ)
義
規(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
E1E22020/11/14177.1
中間語(yǔ)言賦值語(yǔ)句生成三地址代碼的屬性文法產(chǎn)
生
式
語(yǔ)
義
規(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)2020/11/14187.1
中間語(yǔ)言賦值語(yǔ)句生成三地址代碼的屬性文法產(chǎn)
生
式
語(yǔ)
義
規(guī)
則E
E1E.Place=newtemp;E.Code=E1.code||gen(E.place‘=‘‘uminus’E1.place)E(E1)Eid2020/11/14197.1
中間語(yǔ)言賦值語(yǔ)句生成三地址代碼的屬性文法產(chǎn)
生
式
語(yǔ)
義
規(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;Eid2020/11/14207.1
中間語(yǔ)言賦值語(yǔ)句生成三地址代碼的屬性文法產(chǎn)
生
式
語(yǔ)
義
規(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=‘’;2020/11/14217.1
中間語(yǔ)言三地址代碼的具體表現(xiàn)形式:四元式三元式間接三元式2020/11/14227.1
中間語(yǔ)言四元式:a=b*-c+b*-coparg1arg2result(0)uminuscT1(1)*bT1T2(2)uminuscT3(3)*bT3T4(4)+T2T4T5(5)=T5a2020/11/14237.1
中間語(yǔ)言三元式:a=b*-c+b*-coparg1arg2(0)uminusc(1)*b(0)(2)uminusc(3)*b(2)(4)+(1)(3)(5)=a(4)2020/11/14247.1
中間語(yǔ)言間接三元式:a=b*-c+b*-coparg1arg2(0)uminusc(1)*b(0)(2)+(1)(1)(3)=a(2)間接代碼表(0)(1)(0)(1)(2)(3)2020/11/14257.1
中間語(yǔ)言練習(xí):將表達(dá)式:-(a+b)*((c+d)-(a+b+c))分別表示成:后綴式、抽象語(yǔ)法樹、DAG、三元式、間接三元式、四元式2020/11/14267.2
聲明語(yǔ)句為局部名字建立符號(hào)表?xiàng)l目為它分配存儲(chǔ)單元符號(hào)表中包含名字的類型和分配給它的存儲(chǔ)單元的相對(duì)地址等信息2020/11/14277.2
聲明語(yǔ)句7.2.1
過程中的聲明 例子: i:integer; j:real; k:array[10]ofreal; m:↑integer假設(shè)integer占4個(gè)字節(jié),real占8個(gè)字節(jié)名稱類型長(zhǎng)度偏移符號(hào)表2020/11/14287.2
聲明語(yǔ)句7.2.1
過程中的聲明 例子: i:integer; j:real; k:array[10]ofreal; m:↑integer假設(shè)integer占4個(gè)字節(jié),real占8個(gè)字節(jié)名稱類型長(zhǎng)度偏移iint40符號(hào)表2020/11/14297.2
聲明語(yǔ)句7.2.1
過程中的聲明 例子: i:integer; j:real; k:array[10]ofreal; m:↑integer假設(shè)integer占4個(gè)字節(jié),real占8個(gè)字節(jié)名稱類型長(zhǎng)度偏移iint40jreal84符號(hào)表2020/11/14307.2
聲明語(yǔ)句7.2.1
過程中的聲明 例子: i:integer; j:real; k:array[10]ofreal; m:↑integer假設(shè)integer占4個(gè)字節(jié),real占8個(gè)字節(jié)名稱類型長(zhǎng)度偏移iint40jreal84karray(10,real)8012符號(hào)表2020/11/14317.2
聲明語(yǔ)句7.2.1
過程中的聲明 例子: i:integer; j:real; k:array[10]ofreal; m:↑integer假設(shè)integer占4個(gè)字節(jié),real占8個(gè)字節(jié)名稱類型長(zhǎng)度偏移iint40jreal84karray(10,real)8012mpointer(integer)492符號(hào)表2020/11/14327.2
聲明語(yǔ)句計(jì)算被聲明名字的類型和相對(duì)地址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}2020/11/14337.2
聲明語(yǔ)句7.2.2作用域信息的保存所討論語(yǔ)言的文法 P
DS DD;D|id:T|procid;D;S語(yǔ)義動(dòng)作用到的函數(shù)mktable(previous)enter(table,name,type,offset)
addwidth(table,width)enterproc(table,name,newtable)2020/11/14347.2
聲明語(yǔ)句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};2020/11/14357.2
聲明語(yǔ)句 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}.2020/11/14367.2
聲明語(yǔ)句嵌套關(guān)系sortreadarrayexchangepartition Sort當(dāng)中定義了數(shù)組a,readarray中需要使用這一變量,應(yīng)該如何去組織符號(hào)表呢?2020/11/14377.2
聲明語(yǔ)句exchangereadarrayxa表頭空sortquicksort指向readarraypartitionvk表頭quicksortreadarrayi表頭exchange表頭指向exchangepartition2020/11/14387.2
聲明語(yǔ)句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),id.name,t)}Did:T{enter(top(tblptr),id.name,T.type,top(offset)); top(offset)=top(offset)+T.width}N
{t=mktable(top(tblptr)); push(t,tblptr);push(0,offset)}2020/11/14397.2
聲明語(yǔ)句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)}2020/11/14407.3
賦值語(yǔ)句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)2020/11/14417.3
賦值語(yǔ)句7.3.1賦值語(yǔ)句的翻譯模式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)}2020/11/14427.3
賦值語(yǔ)句7.3.1賦值語(yǔ)句的翻譯模式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}2020/11/14437.3
賦值語(yǔ)句7.3.2臨時(shí)名字的重新使用大量臨時(shí)變量的使用對(duì)優(yōu)化有利大量臨時(shí)變量會(huì)增加符號(hào)表管理的負(fù)擔(dān)也會(huì)增加運(yùn)行時(shí)臨時(shí)數(shù)據(jù)占的空間2020/11/14447.3
賦值語(yǔ)句7.3.2臨時(shí)名字的重新使用大量臨時(shí)變量的使用對(duì)優(yōu)化有利大量臨時(shí)變量會(huì)增加符號(hào)表管理的負(fù)擔(dān)也會(huì)增加運(yùn)行時(shí)臨時(shí)數(shù)據(jù)占的空間E
E1+E2的動(dòng)作產(chǎn)生的代碼的一般形式為
計(jì)算E1到t1
計(jì)算E2到t2
t3=t1
+t2 (())((()())())臨時(shí)變量的生存期像配對(duì)括號(hào)那樣嵌套或并列2020/11/14457.3
賦值語(yǔ)句基于臨時(shí)變量生成期特征的三地址代碼x=ab+cdef語(yǔ)
句
c的值
0$0=ab1$1=cd2$0=$0+$11
$1=ef2$0=$0$11x=$002020/11/14467.3
賦值語(yǔ)句數(shù)組的翻譯:一維數(shù)組二維數(shù)組三維數(shù)組多維數(shù)組2020/11/14477.3
賦值語(yǔ)句7.3.3數(shù)組元素的地址計(jì)算一維數(shù)組A的第i個(gè)元素的地址計(jì)算
base+(i
low)
w2020/11/14487.3
賦值語(yǔ)句7.3.3數(shù)組元素的地址計(jì)算一維數(shù)組A的第i個(gè)元素的地址計(jì)算
base+(i
low)
w
重寫成
(base
low
w)+i
w基址變址2020/11/1449二維數(shù)組的翻譯二維a[i1,i2]的維數(shù)d1*d22020/11/1450D=a+d2(i1–1)+i2–1=a–(d2+1)+i1d2+i2=Conspart+Varpart對(duì)D的四元式翻譯 *,i1,d2,T1 +,T1,i2,T2 -,a,c,T3所以A[i1,i2]的地址D=T3[T2]2020/11/1451三維A[i1,i2,i3]的維數(shù)d1*d2*d3i1i2i3d2d3d12020/11/1452D=a+d2d3(i1–1)+d3(i2-1)+i3–1=a–(d2d3+d3+1)+(i1d2d3+i2d3+i3)=Conspart+Varpart對(duì)D的四元式翻譯 *,i1,d2,T1 +,T1,i2,T2 *,T2,d3,T3 +,T3,i3,T4 -,a,c,T5所以A[i1,i2,i3]的地址D=T5[T4]VarpartConspart2020/11/14537.3
賦值語(yǔ)句總結(jié):對(duì)于所有的數(shù)組A[i1,i3,i3,…]來講,數(shù)組的地址都可以概括成A-C+V的格式,其中A是數(shù)組的首地址,C是編譯時(shí)可以預(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)×w2020/11/14547.3
賦值語(yǔ)句三維: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)×w2020/11/14557.3
賦值語(yǔ)句7.3.4數(shù)組元素地址計(jì)算的翻譯方案下標(biāo)變量訪問的產(chǎn)生式
Lid[Elist]|id Elist
Elist,E|E改成
L
Elist]|id Elist
Elist,E|id[E2020/11/14567.3
賦值語(yǔ)句所有產(chǎn)生式S
L:=EE
E+EE(E)E
LL
Elist]LidElist
Elist,EElist
id[E2020/11/14577.3
賦值語(yǔ)句Lid{L.place=id.place;L.offset=null}2020/11/14587.3
賦值語(yǔ)句Lid{L.place=id.place;L.offset=null}Elist
id[E{Elist.place=E.place;Elist.ndim=1; Elist.array=id.place}2020/11/14597.3
賦值語(yǔ)句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}2020/11/14607.3
賦值語(yǔ)句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)}2020/11/14617.3
賦值語(yǔ)句E
L{ifL.offset==nullthen/
L是簡(jiǎn)單變量
/
E.place=L.place
elsebeginE.place=newtemp;
emit(E.place,‘=’,L.place,‘[’,L.offset,‘]’)end}2020/11/14627.3
賦值語(yǔ)句E
L{ifL.offset==nullthen/
L是簡(jiǎn)單變量
/
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)}2020/11/14637.3
賦值語(yǔ)句E
L{ifL.offset==nullthen/
L是簡(jiǎn)單變量
/
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}
2020/11/14647.3
賦值語(yǔ)句E
L{ifL.offset==nullthen/
L是簡(jiǎn)單變量
/
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是簡(jiǎn)單變量/
emit(L.place,‘=’,E.place) else
emit(L.place,‘[’,L.offset,‘]’,‘=’, E.place)}
2020/11/14657.3
賦值語(yǔ)句例題:設(shè)A為一個(gè)10×20的數(shù)組,即d1=10,d2=20,并設(shè)w=4,試對(duì)賦值語(yǔ)句x=A[y,z]進(jìn)行翻譯。假設(shè)數(shù)組的下標(biāo)從1開始。2020/11/14667.3
賦值語(yǔ)句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]的注釋分析樹2020/11/14677.3
賦值語(yǔ)句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
2020/11/14687.3
賦值語(yǔ)句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
2020/11/14697.3
賦值語(yǔ)句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]2020/11/14707.3
賦值語(yǔ)句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
2020/11/14717.3
賦值語(yǔ)句T1=y×20T1=T1+zT2=A-84T3=4*T1T4=T2[T3]X=T4T1=y×20T2=T1+zT3=A-84T4=4*T1T5=T3[T4]X=T52020/11/14727.3
賦值語(yǔ)句7.3.5類型轉(zhuǎn)換x=y+ij(x和y的類型是real,i和j的類型是integer)中間代碼t1=iintjt2=inttorealt1
t3=yreal+t2
x=t32020/11/14737.3
賦值語(yǔ)句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...2020/11/14747.4
布爾表達(dá)式和控制流語(yǔ)句布爾表達(dá)式有兩個(gè)基本目的計(jì)算邏輯值在控制流語(yǔ)句中用作條件表達(dá)式2020/11/14757.4
布爾表達(dá)式和控制流語(yǔ)句布爾表達(dá)式有兩個(gè)基本目的計(jì)算邏輯值在控制流語(yǔ)句中用作條件表達(dá)式布爾表達(dá)式的完全計(jì)算布爾表達(dá)式的“短路”計(jì)算E1orE2定義成ifE1thentrueelseE2E1andE2定義成
ifE1thenE2elsefalse2020/11/14767.4
布爾表達(dá)式和控制流語(yǔ)句7.4.1布爾表達(dá)式的翻譯E
E
orE|EandE|notE|(E) |idrelopid|true|falsea<b的翻譯100:ifa<bgoto103101:t=0102:goto104103:t=1104:2020/11/14777.4
布爾表達(dá)式和控制流語(yǔ)句7.4.2控制流語(yǔ)句的翻譯SifEthenS1 |ifEthenS1
elseS2 |whileEdoS1 |S1;S2
2020/11/14787.4
布爾表達(dá)式和控制流語(yǔ)句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;S22020/11/14797.4
布爾表達(dá)式和控制流語(yǔ)句布爾表達(dá)式翻譯用到的三種四元式結(jié)構(gòu)(jnz,a,-,p) ifagotop(jrop,x,y,p) ifxropygotop(j,-,-,p) gotop2020/11/14807.4
布爾表達(dá)式和控制流語(yǔ)句布爾表達(dá)式的翻譯規(guī)則先順序翻譯布爾變量和關(guān)系表達(dá)式,暫時(shí)不管布爾運(yùn)算符號(hào)(not,and,or等)。其中,每一個(gè)布爾變量和關(guān)系表達(dá)式對(duì)應(yīng)兩條四元式,第一條是有條件跳轉(zhuǎn),第二條是無條件跳轉(zhuǎn)。最后一個(gè)域即跳轉(zhuǎn)到何處暫時(shí)不填,等到全部完成后再填。2020/11/14817.4
布爾表達(dá)式和控制流語(yǔ)句對(duì)于布爾變量A可以翻譯成: (1) (jnz,A,-,-) (2)(j,-,-,-)對(duì)于關(guān)系表達(dá)式AropB (1) (jrop,
A,B,-) (2)(j,-,-,-)2020/11/14827.4
布爾表達(dá)式和控制流語(yǔ)句舉例:IfAor(B<D)thens1elses22020/11/14837.4
布爾表達(dá)式和控制流語(yǔ)句舉例:IfAor(B<D)thens1elses2(jnz,A,-,-)(j,-,-,-)(j<,B,D,-)(j,-,-,-)S1的四元式序列(j,-,-,-)(p+1)S2的四元式序列(q)2020/11/14847.4
布爾表達(dá)式和控制流語(yǔ)句舉例:IfAor(B<D)thens1elses2(jnz,A,-,5)(j,-,-,3)(j<,B,D,5)(j,-,-,p+1)S1的四元式序列(j,-,-,q)(p+1)S2的四元式序列(q)2020/11/1485選擇結(jié)構(gòu)的翻譯模版IfEthenS1elseS2ES1S2100E.FalseE.Truep(j,_,_p)2020/11/14867.4
布爾表達(dá)式和控制流語(yǔ)句條件語(yǔ)句翻譯舉例Ifx>0theny=x+1elsey=x+22020/11/14877.4
布爾表達(dá)式和控制流語(yǔ)句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)1072020/11/14887.4
布爾表達(dá)式和控制流語(yǔ)句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)1072020/11/14897.4
布爾表達(dá)式和控制流語(yǔ)句練習(xí):Ifnotaor(c<d)theny=x+1elsey=x+22020/11/1490循環(huán)結(jié)構(gòu)的翻譯模版DoEwhileSES
P(j,_,_,100)
P+1()100E.TCE.FC2020/11/14917.4
布爾表達(dá)式和控制流語(yǔ)句循環(huán)語(yǔ)句的翻譯While(A<B)doIf(C>D)thenx=y+z;2020/11/14927.4
布爾表達(dá)式和控制流語(yǔ)句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) 2020/11/14937.4
布爾表達(dá)式和控制流語(yǔ)句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) 2020/11/14947.4
布爾表達(dá)式和控制流語(yǔ)句練習(xí):While(iorj)and(j>5)do i=j2020/11/14957.4
布爾表達(dá)式和控制流語(yǔ)句布爾表達(dá)式的語(yǔ)法制導(dǎo)翻譯(1)E->E1orME2{Backpatch(E1.falselist,M.quad);E.Truelist=merge(E1.truelist,E2.truelist);E.Falselist=E2.falselist;}2020/11/14967.4
布爾表達(dá)式和控制流語(yǔ)句(2)E->E1andME2{Backpatch(E1.truelist,M.quad);E.truelist=E2.truelist;E.falselist=merge(E1.falselist,E2.falselist);}2020/11/14977.4
布爾表達(dá)式和控制流語(yǔ)句(3)E->notE1{E.truelist=E1.falselist;E.falselist=E1.truelist;}(4)E->(E1){E.truelist=E1.truelist;E.Falselist=E1.falselist;}2020/11/14987.4
布爾表達(dá)式和控制流語(yǔ)句(5)E->id1relopid2{E.truelist=makelist(nextquad);E.falselist=makelist(nextquad+1);Emit(‘j’relop.op‘,’id1.place‘,’id2.place,‘,’‘0’);Emit(‘j,-,-,0’);}2020/11/14997.4
布爾表達(dá)式和控制流語(yǔ)句(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;}2020/11/141007.4
布爾表達(dá)式和控制流語(yǔ)句布爾表達(dá)式的語(yǔ)法制導(dǎo)翻譯舉例a<borc<dande<f2020/11/14101orE.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}2020/11/141027.4
布爾表達(dá)式和控制流語(yǔ)句布爾表達(dá)式的語(yǔ)法制導(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)2020/11/141037.4
布爾表達(dá)式和控制流語(yǔ)句控制語(yǔ)句的語(yǔ)法制導(dǎo)翻譯(1)S->ifEthenM1S1NelseM2S2{Backpatch(E.truelist,M1.quad);Backpatch(E.falselist,M2.quad);S.Nextlist=merge(S1.nextlist,N.nextlist,S2.nextlist)}2020/11/141047.4
布爾表達(dá)式和控制流語(yǔ)句(2)N->ε{N.nextlist=makelist(nextquad);Emit(‘j,-,-,-’)}(3)M->ε{M.quad=nextquad;Backpatch(E.truelist,M.quad)}2020/11/141057.4
布爾表達(dá)式和控制流語(yǔ)句(4)S->ifEthenMS1{backpatch(E.truelist,M.quad);S.Nextlist=merge(E.falselist,S1.nextlist);}2020/11/141067.4
布爾表達(dá)式和控制流語(yǔ)句(5)S->whileM1EdoM2S2{backpatch(S1.nextlist,M1.quad);Backpatch(E.truelist,M2.quad);S.Nextlist=E.falselist;Emit(‘j,-,-,’M1.quad);}2020/11/141077.4
布爾表達(dá)式和控制流語(yǔ)句(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}2020/11/141087.4
布爾表達(dá)式和控制流語(yǔ)句7.4.4開關(guān)語(yǔ)句的翻譯switchE begin caseV1:S1 caseV2:S2 ... caseVn-1:Sn–1 default:Sn end2020/11/141097.4
布爾表達(dá)式和控制流語(yǔ)句分支數(shù)較少時(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: ... ...2020/11/141107.4
布爾表達(dá)式和控制流語(yǔ)句分支較多時(shí),將分支測(cè)試的代碼集中在一起,便于生成較好的分支測(cè)試代碼。 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:
gotonext2020/11/141117.4
布爾表達(dá)式和控制流語(yǔ)句中間代碼增加一種case語(yǔ)句,便于代碼生成器對(duì)它進(jìn)行特別處理test: caseV1 L1 caseV2 L2 ... caseVn-1 Ln-1 caset Ln
next:2020/11/141127.4
布爾表達(dá)式和控制流語(yǔ)句7.4.5
過程調(diào)用的翻譯Scallid(Elist)Elist
Elist,EElist
E2020/11/141137.4
布爾表達(dá)式和控制流語(yǔ)句過程調(diào)用id(E1,E2,…,En)的中間代碼結(jié)構(gòu)E1.place=E1的代碼E2.place=E2的代碼 ...En.place
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度農(nóng)業(yè)科技企業(yè)勞動(dòng)合同保密協(xié)議范本2篇
- 二零二五年度小微企業(yè)擔(dān)保合同標(biāo)準(zhǔn)文本3篇
- 二零二五年度施工現(xiàn)場(chǎng)安全管理人員職責(zé)及考核合同3篇
- 二零二五年醫(yī)療機(jī)構(gòu)病房樓場(chǎng)地租賃及醫(yī)療設(shè)備租賃協(xié)議3篇
- 2025年度電影發(fā)行融資居間服務(wù)協(xié)議3篇
- 二零二五年度文化遺產(chǎn)保護(hù)項(xiàng)目工程合同樣本3篇
- 運(yùn)動(dòng)課程設(shè)計(jì)與展示
- 二零二五年度辦公樓能源消耗監(jiān)測(cè)與節(jié)能服務(wù)合同2篇
- 二零二五年度按揭車輛轉(zhuǎn)讓與汽車租賃服務(wù)結(jié)合合同2篇
- 2025年度施工安全用電安全保障措施合同范本2份3篇
- GB/T 20197-2006降解塑料的定義、分類、標(biāo)志和降解性能要求
- GB/T 20028-2005硫化橡膠或熱塑性橡膠應(yīng)用阿累尼烏斯圖推算壽命和最高使用溫度
- 公司變更評(píng)審表
- 自由戰(zhàn)爭(zhēng)-簡(jiǎn)體素材表
- 新概念第三冊(cè)課文60全(打印版)
- 四年級(jí)硬筆書法教案教學(xué)設(shè)計(jì)共16課
- 自考現(xiàn)代漢語(yǔ)復(fù)習(xí)資料精品資料
- 論財(cái)務(wù)共享服務(wù)模式下財(cái)務(wù)稽核體系
- 19鍋爐水壓試驗(yàn)記錄
- 人教版小學(xué)1-6年級(jí)日積月累(全)
- 盤扣式腳手架(內(nèi)部培訓(xùn))(課堂PPT)
評(píng)論
0/150
提交評(píng)論