編譯原理——中間代碼的生成

1、選擇中間表示:通常來說,中間表示是圖形符號和三地址代碼的組合。在語法樹中,圖形符號中的節(jié)點表示一個結(jié)構(gòu);節(jié)點的子代表它的子結(jié)構(gòu)。三地址的名稱來自x - y op z格式指令,并且每個指令最多有一個運算符。
2、翻譯表達式:通過把動作加到E - > E \ op E2格式的每個產(chǎn)生式中,具有創(chuàng)建操作功能的表達式可以解除單個操作的順序。該操作或者為E創(chuàng)建一個節(jié)點,節(jié)點為E \和E2作為子節(jié)點,或者生成一個三地址指令,將操作應(yīng)用于E \和E2的地址,并將結(jié)果放入一個新的臨時名稱,這將成為E.的地址
3、檢查類型:表達式E \ op E2的類型由op和E \和E2的類型決定。強制是隱式類型轉(zhuǎn)換,例如從整數(shù)到浮點數(shù)。中間代碼包含特殊類型轉(zhuǎn)換,以確保操作數(shù)類型與操作預(yù)期類型之間的精確匹配。
4、使用符號表來實現(xiàn)聲明:一個聲明指定一個名稱的類型。類型的寬度是該類型名稱需要的存儲量。使用寬度,在運行時,名稱的相對地址可以計算為從數(shù)據(jù)區(qū)域開始的偏移量。名稱的類型和相對地址通過聲明被放入符號表中,因此當(dāng)名稱出現(xiàn)在表達式中時,翻譯器可以隨后獲取它們。
5、生成Bool表達式的跳轉(zhuǎn)代碼:在短路或跳轉(zhuǎn)代碼中,Bool表達式的值隱含在代碼所能運行到的位置。跳轉(zhuǎn)代碼是有用的,因為通常的情況下,Bool表達式B用于控制流程,如if(B)。布爾值可以通過跳轉(zhuǎn)到t = true或t = false來計算,其中t是臨時名稱。使用跳轉(zhuǎn)標(biāo)簽,布爾表達式可以通過繼承與它的真和假出口相對應(yīng)的標(biāo)簽來轉(zhuǎn)換。常數(shù)true和false分別轉(zhuǎn)換成true和false的退出。
6、使用控制流實現(xiàn)語句:語句可以通過繼承下一個標(biāo)簽進行轉(zhuǎn)換,其中下一個標(biāo)記在這條語句的代碼之后的第一條指令。可以通過加一個標(biāo)記Si代碼開頭的新標(biāo)簽來轉(zhuǎn)換條件S - > if(B)Si,并分別傳遞新標(biāo)簽和S.next的真假出口。
7、使用反向回傳:回傳是一種在一次遍歷中生成Bool表達式和語句代碼的技術(shù)。這個目的是維護不完整跳轉(zhuǎn)的列表,其中列表中的所有跳轉(zhuǎn)指令都具有相同的目標(biāo)。當(dāng)目標(biāo)已知時,其列表上的所有指令都將通過填寫目標(biāo)完成。
8、實現(xiàn)記錄:記錄或類中的字段名稱可以被看作一系列聲明。記錄類型對字段的類型和相對地址進行編碼。符號表就是實現(xiàn)這個功能的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,948評論 18 139
  • 8086匯編 本筆記是筆者觀看小甲魚老師(魚C論壇)《零基礎(chǔ)入門學(xué)習(xí)匯編語言》系列視頻的筆記,在此感謝他和像他一樣...
    Gibbs基閱讀 37,391評論 8 114
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,353評論 25 708
  • 餓,餓,餓, 騎驢向天歌。 多美的畫面,又累又餓的我突然想不起第二句的原版了,反正就這么冒出來了,實在不知道我是怎...
    _種瓜得豆__閱讀 121評論 0 1
  • 今天吃午飯的時候,同事小彩捏著自己的肚子和我哀怨的說“你看,就周末晚上吃了一口雞排,又長肉了,之前減的5斤又白費了...
    張嚴(yán)心閱讀 616評論 0 6