資源描述:
《中間代碼生成》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、中間代碼生成第八章中間代碼生成中間代碼說(shuō)明語(yǔ)句的翻譯賦值語(yǔ)句的翻譯控制語(yǔ)句的翻譯(if、循環(huán))屬性文法的實(shí)現(xiàn)過(guò)程調(diào)用的翻譯8.1中間代碼作用過(guò)渡:經(jīng)過(guò)語(yǔ)義分析被譯成中間代碼序列形式中間語(yǔ)言的語(yǔ)句優(yōu)點(diǎn)便于編譯系統(tǒng)的實(shí)現(xiàn)、移植、代碼優(yōu)化常用的中間代碼(語(yǔ)言)三地址代碼(四元式)語(yǔ)法(結(jié)構(gòu))樹(shù)(三元式)(5.2節(jié))后綴式——逆波蘭表示(2.3節(jié))特點(diǎn)形式簡(jiǎn)單、語(yǔ)義明確、便于翻譯獨(dú)立于目標(biāo)語(yǔ)言例8-1表達(dá)式(A-12)*B+6的中間代碼+*6-A12B三地址碼T1=A-12T2=T1*BT3=T2+6四元組(-,A,12,T1)(
2、*,T1,B,T2)(+,T2,6,T3)三元組①(-,A,12)②(*,①,B)③(+,②,6)波蘭表示+*-A12B6逆波蘭表示A12-B*6+如何生成語(yǔ)言結(jié)構(gòu)的三地址碼類(lèi)似于構(gòu)建語(yǔ)法樹(shù)生成后綴表示以S:=(A-12)*B+6為例將賦值語(yǔ)句變換為語(yǔ)法結(jié)構(gòu)樹(shù)屬性設(shè)置E.p是語(yǔ)法結(jié)構(gòu)樹(shù)指針id.entry是名字的符號(hào)表入口num.val是數(shù)值基本函數(shù)——結(jié)點(diǎn)構(gòu)造mknode建中間結(jié)點(diǎn)mkleaf建葉結(jié)點(diǎn)6A12-+B*S:=生成賦值語(yǔ)句語(yǔ)法樹(shù)的語(yǔ)法制導(dǎo)定義例8-2:a:=b*(-c)+b*(-34)的語(yǔ)法結(jié)構(gòu)樹(shù)——直觀描
3、述:=*-0+*-0idbnum34idbidcidaroot語(yǔ)法結(jié)構(gòu)樹(shù)——數(shù)組存儲(chǔ)形式地址算符操作數(shù)操作數(shù)012345678910a:=b*(-c)+b*(-34)以語(yǔ)法分析為中心后綴式(逆波蘭表示)操作數(shù)1,操作數(shù)2,運(yùn)算符操作數(shù),運(yùn)算符例8-7:a:=b*(-c)+b*(-34)的后綴式abc-*b34-*+:=生成后綴式的屬性文法三地址代碼一般形式x:=yopz其中x,y,z為變量名、常數(shù)或編譯產(chǎn)生的臨時(shí)變量四元式(op,y,z,x)種類(lèi):x:=yopz雙目運(yùn)算x:=opy單目運(yùn)算x:=y賦值語(yǔ)句ifxrelopy
4、gotol條件轉(zhuǎn)移語(yǔ)句(relop,x,y,l)其它語(yǔ)句的三地址代碼gotol無(wú)條件轉(zhuǎn)移paramx實(shí)在參數(shù)callp,n過(guò)程調(diào)用returnx過(guò)程返回x:=y[i]數(shù)組運(yùn)算x[i]:=yx:=&y指針運(yùn)算x:=*y*x=y生成三地址碼的屬性文法8.2說(shuō)明語(yǔ)句的翻譯作用說(shuō)明語(yǔ)句(Declarations)用于對(duì)程序中規(guī)定范圍內(nèi)使用的各類(lèi)變量、常數(shù)、過(guò)程進(jìn)行說(shuō)明編譯要完成的工作在符號(hào)表中記錄被說(shuō)明對(duì)象的屬性,為執(zhí)行做準(zhǔn)備要關(guān)心的問(wèn)題類(lèi)型基本類(lèi)型/內(nèi)部類(lèi)型(built-in):整型、實(shí)型、雙精度型、邏輯型、字符型用戶定義類(lèi)型—
5、—結(jié)構(gòu)描述作用域——有效范圍一般:說(shuō)明所在的分程序、過(guò)程要關(guān)心的問(wèn)題類(lèi)型的作用引入數(shù)據(jù)抽象、隱蔽數(shù)據(jù)的基本表示用戶無(wú)需注明字節(jié)數(shù)規(guī)定可用的運(yùn)算類(lèi)型檢查數(shù)據(jù)精度控制規(guī)定存儲(chǔ)單元的字節(jié)數(shù),優(yōu)化空間管理變量說(shuō)明的翻譯在符號(hào)表中填寫(xiě)變量的屬性種別、類(lèi)型、相對(duì)地址、作用域……等相對(duì)地址全局變量表示為靜態(tài)數(shù)據(jù)區(qū)的偏移值(offset)局部變量表示為局部數(shù)據(jù)區(qū)(活動(dòng)記錄部分)的偏移值兩種數(shù)據(jù)區(qū)例8-3:相對(duì)地址舉例名字相對(duì)地址x0i64j68X[1]X[2]……X[8]ij08566468beginrealx[8];integeri,j
6、;……end文法描述P→DD→D;DD→id:TT→integerT→realT→array[num]ofT1T→^T1例如:a:integer;b:real;c:array[10]ofrealTTTDDDDPD屬性、過(guò)程、與全局量文法變量T(類(lèi)型)的屬性type類(lèi)型width占用的字節(jié)數(shù)基本子程序enter:設(shè)置變量的類(lèi)型和地址array:數(shù)組類(lèi)型處理全局量offset:已分配空間字節(jié)數(shù)說(shuō)明語(yǔ)句的翻譯模式P→{offset:=0}DD→D;DD→id:T{enter(id.name,T.type,offset);offs
7、et:=offset+T.width}T→integer{T.type:=integer;T.width:=4}T→real{T.type:=real;T.width:=8}T→array[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}P→MDM→?{offset:=0}例8-4x:real;i:integer的翻譯enter(x,real,0)offse
8、t=0offset=8T.type=realT.width=8offset=12T.type=integerT.width=4enter(i,integer,8)D→id:T{enter(id.name,T.type,offset);offset:=offset+T.width}例8-4x:real;i