資源描述:
《編譯原理PPT課件二 中間代碼.ppt》由會(huì)員上傳分享,免費(fèi)在線(xiàn)閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、何謂中間代碼:源程序的一種內(nèi)部表示,不依賴(lài)目標(biāo)機(jī)的結(jié)構(gòu),易于機(jī)械生成目標(biāo)代碼的中間表示。為什么要此階段主要優(yōu)點(diǎn)是可移植(與具體目標(biāo)程序無(wú)關(guān)),且易于目標(biāo)代碼優(yōu)化中間代碼的幾種形式逆波蘭、N-元表示(四元式、三元式)、樹(shù)、抽象機(jī)代碼第8章中間代碼(源程序的中間形式)例:A+B*(C-D)+E/(C-D)^N逆波蘭:ABCD-*+ECD–N^/+四元式:(1)(-CDT1)(2)(*BT1T2)(3)(+AT2T3)(-CDT4)(^T4NT5)(6)(/ET5T6)(7)(+T3T6T7)三元式:(1)(-CD)(2)(*B(1))(3)(+A
2、(2))(4)(-CD)(5)(^(4)N)(6)(/E(5))(7)(+(3)(6))if語(yǔ)句的波蘭表示:有如下if語(yǔ)句:ifthenelse波蘭表示為:BZBRBZ:二目操作符,如果的計(jì)算結(jié)果為0,則產(chǎn)生一個(gè)的轉(zhuǎn)移,而label1是的頭一個(gè)符號(hào)BR:一目操作符,它產(chǎn)生一個(gè)的轉(zhuǎn)移,而是一個(gè)緊跟在后面的符號(hào)(即是if語(yǔ)句后的第一個(gè)語(yǔ)
3、句的頭一個(gè)符號(hào))8.1中間代碼的幾種形式——波蘭表示由if語(yǔ)句的波蘭表示可生成如下的目標(biāo)程序框架:BZlabel1BRlabel2label1:label2:其他語(yǔ)言結(jié)構(gòu)很容易將其翻譯成波蘭表示,使用波蘭表示優(yōu)化不是十分方便。波蘭表示為:BZBRX-yBZ,label1Z:=XBR,label2Label:Z:=Y+1Label2:M=z+2:例:Ifx>ythenz:=xelsez:=y+1;M=z+2;有如下if語(yǔ)句:if4、pr>thenelse在該表示中,每條指令由n個(gè)域所組成,通常第一個(gè)域表示運(yùn)算符,其余操作符。常用的n元表示是:三元式四元式三元式:運(yùn)算符左操作符右操作符表達(dá)式的三元式:w*x+(y+z)(1)*,w,x(2)+,y,z(3)+,(1),(2)第三個(gè)三元式中的操作數(shù)(1)(2)表示第(1)和第(2)條三元式的計(jì)算結(jié)果。8.1中間代碼的幾種形式——N-元表示條件語(yǔ)句的三元式:Ifx>ythenz:=x;elsez:=y+1;-,x,yBZ,(1),(5):=,Z,XBR,,(7)+,Y,1:=,Z,(5)::其中:B
5、Z:是二目(元)操作符,測(cè)試第二個(gè)域的值,若<0,則按第3個(gè)域的地址轉(zhuǎn)移,若為正值則該指令作廢。BR:一目(元)操作符,按第3個(gè)域作無(wú)條件轉(zhuǎn)移。使用三元式不便于代碼優(yōu)化因?yàn)閮?yōu)化要?jiǎng)h除一些三元式,或?qū)δ承┤降奈恢靡M(jìn)行變更,由于三元式的結(jié)果(表示為編號(hào)),可以是某個(gè)三元式的操作數(shù),隨著三元式位置的變更也將作相應(yīng)的修改,很費(fèi)事。間接三元式:為了便于在三元式上作優(yōu)化處理,可使用間接三元式三元式的執(zhí)行次序用另一張表表示,這樣在優(yōu)化時(shí),三元式可以不變,而僅僅改變其執(zhí)行順序表。例:A:=B+C*D/EF:=C*D用間接三元式表示為:操作三元式1.(1
6、)(1)*,C,D2.(2)(2)/,(1),E3.(3)(3)+,B,(2)4.(4)(4):=,A,(3)5.(1)(5):=,F,(1)6.(5)三元式的執(zhí)行次序用另一張表表示,這樣在優(yōu)化時(shí),三元式可以不變,而僅僅改變其執(zhí)行順序表。四元式表示:操作符操作數(shù)1操作數(shù)2結(jié)果結(jié)果:通常是由編譯器分配的臨時(shí)變量,可由編譯程序做一個(gè)寄存器或主存單元。例1:(A+B)*(C+D)-E+,A,B,T1+,C,D,T2*,T1,T2,T3一,T3,E,T4式中,T1,T2,T3,T4為臨時(shí)變量四元式優(yōu)化比較方便簡(jiǎn)單賦值語(yǔ)句的(四元式)翻譯四元式形式:t
7、=arg1oparg2語(yǔ)義屬性:id.name,E.place函數(shù):lookup(id.name);過(guò)程:emit(t:=arg1oparg2);t:newtemp;產(chǎn)生式和語(yǔ)義描述:(1)A?id=E{P=lookup(id.name);ifP?nilthenemit(P“:=”E.place)elseerror}(2)E?E1+E2{E.place:=newtemp;emit(E.place“:=”E1.place“+”E2.place)}(3)E?-E1{E.place:=newtemp;emit(E.place“:=”“uminus”
8、E1.place)}(4)E?(E1){E.place:=E1.place}(5)E?id{E.place:=newtemp;P:=lookup(id.name);