資源描述:
《編譯原理 中間代碼生成.ppt》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在行業(yè)資料-天天文庫。
1、第八章中間代碼生成學習內(nèi)容三地址碼表示方法聲明語句的翻譯賦值語句的翻譯:數(shù)組尋址布爾表達式的翻譯case語句的翻譯backpatching技術的實現(xiàn)過程調(diào)用的翻譯8.1中間語言8.1.1圖表示a:=b*-c+b*-c語法樹方式表示后綴表示——語法樹的線性表示方式abcuminus*bcuminus*+assign語法制導定義構造語法樹PRODUCTIONSemanticRuleS?id:=E{S.nptr=mknode(‘a(chǎn)ssign’,mkleaf(id,id.entry),E.nptr)}E?E1+E2{E.nptr=mknode(‘+’,E1.nptr,E2.np
2、tr)}E?E1*E2{E.nptr=mknode(‘*’,E1.nptr,E2.nptr)}E?-E1{E.nptr=mknode(‘uminus’,E1.nptr)}E?(E1){E.nptr=E1.nptr}E?id{E.nptr=mkleaf(id,id.entry)}語法樹的計算機內(nèi)部表示8.1.2三地址碼Three-AddressCode一般形式:x:=yopz語法樹、dag的線性化表示t1:=-ct1:=-ct2:=b*t1t2:=b*t1t3:=-ct5:=t2+t2t4:=b*t3a:=t5t5:=t2+t4a:=t58.1.3三地址碼語句類型二元運算
3、:x:=yopz一元運算:x:=opy復制語句:x:=y無條件轉(zhuǎn)移:gotoL條件轉(zhuǎn)移:ifxrelopygotoL函數(shù)調(diào)用:paramx1paramx2…paramxncallp,n數(shù)組:x:=y[i],x[i]:=y指針:x:=&y,x:=*y語法制導翻譯生成三地址碼賦值語句:id:=E利用屬性E.place:保存E的值的名字E.code:計算E的三地址代碼newtemp:生成臨時變量名gen:輸出一條三地址碼指令賦值語句的翻譯PRODUCTIONSemanticRuleS?id:=E{S.code=E.code
4、
5、gen(id.place‘:=’E.place)
6、}E?E1+E2{E.place=newtemp;E.code=E1.code
7、
8、E2.code
9、
10、
11、
12、gen(E.place‘:=’E1.place‘+’E2.place)}E?E1*E2{E.place=newtemp;E.code=E1.code
13、
14、E2.code
15、
16、
17、
18、gen(E.place‘:=’E1.place‘*’E2.place)}E?-E1{E.place=newtemp;E.code=E1.code
19、
20、
21、
22、gen(E.place‘:=’‘uminus’E1.place)}E?(E1){E.place=E1.place;E.code=E1.code}E
23、?id{E.place=id.entry;E.code=‘’}控制流語句的翻譯while語句:S?whileEdoS1翻譯為S.begin:E.codeifE.place=0gotoS.afterS1.codegotoS.beginS.after:語法制導定義:S.begin=newlabel;S.after=newlabel;S.code=gen(S.begin‘:’)
24、
25、E.code
26、
27、gen(‘if’E.place‘=’‘0’‘goto’S.after)
28、
29、S1.code
30、
31、gen(‘goto’S.begin)
32、
33、gen(S.after‘:’)8.1.5三地址碼的
34、實現(xiàn)四元組,三元組三元運算的實現(xiàn)——拆分x[i]:=yx:=y[i]間接三元組實現(xiàn)方式8.2聲明語句的翻譯8.2.1過程內(nèi)部的聲明PRODUCTIONSemanticRuleP?MD{}M??{offset:=0}D?id:T{addtype(id.entry,T.type,offset)offset:=offset+T.width}T?char{T.type=char;T.width=4;}T?integer{T.type=integer;T.width=4;}T?array[num]ofT1{T.type=array(num.val,T1.type)T.width
35、=num.val*T1.width}T?^T1{T.type=pointer(T1.type);T1.width=4}8.2.2作用域的處理處理作用域的翻譯模式P?MD{addwidth(top(tblptr),top(offset));pop(tblptr);pop(offset)}M??{t:=mktable(null);push(t,tblptr);push(0,offset)}D?D1;D2D?procid;ND;S{t:=top(tblpr);addwidth(t,top(offset));pop(tblptr);pop(off