聲明:本系列文章,是根據中國大學MOOC網 哈工大的編譯原理 這門課學習而成的學習筆記。
一、類型表達式 (Type Expressions)
類型表達式
- 基本類型是類型表達式
- integer
- real
- char
- boolean
- type_error (出錯類型)
- void (無類型)
- 可以爲類型表達式命名,類型名也是類型表達式
- 將類型構造符(type constructor)作用於類型表達式可以構成新的類
型表達式
數組構造符array
若T是類型表達式,則array ( I, T )是類型表達式( I是一個整數)
指針構造符pointer
若T 是類型表達式,則 pointer ( T ) 是類型表達式,它表示一個指針類型。笛卡爾乘積構造符
若T1 和T2是類型表達式,則笛卡爾乘積T1×T2 是類型表達式函數構造符→
若T1、T2、…、Tn和R是類型表達式,則T1×T2 ×…×Tn→ R是 類型表達式記錄構造符record
若有標識符N1、N2、…、Nn 與類型表達式T1、T2、…、Tn , 則 record ( ( N1× T1 )×( N2×T2 )×…× ( Nn×Tn )) 是一個類型表達式
二、聲明語句的翻譯
局部變量的存儲分配
對於聲明語句,語義分析的主要任務就是收集標識符的類型等屬性信息,併爲每一個名字分配一個相對地址
- 從類型表達式可以知道該類型在運行時刻所需的存儲單元數量稱爲類型的寬度(width)
- 在編譯時刻,可以使用類型的寬度爲每一個名字分配一個相對地址
名字的類型和相對地址信息保存在相應的符號表記錄中
變量聲明語句的SDT
三、簡單賦值語句的翻譯
賦值語句翻譯的任務
賦值語句的SDT
增量翻譯
四、數組引用的翻譯
數組引用的翻譯
數組元素尋址 (Addressing Array Elements )
帶有數組引用的賦值語句的翻譯
數組引用的SDT
五、控制流語句及其SDT
控制流語句的基本文法
控制流語句的代碼結構
控制流語句的SDT
六、布爾表達式及其SDT
布爾表達式的基本文法
- 在跳轉代碼中,邏輯運算符&&、|| 和 ! 被翻譯成跳轉指令。運算符本身不出現在代碼中,布爾表達式的值是通過代碼序列中的位置來表示的
布爾表達式的SDT
七、控制流翻譯的例子
控制流語句的SDT
SDT的通用實現方法
- 任何SDT都可以通過下面的方法實現
首先建立一棵語法分析樹,然後按照從左到右的深度優先順序來執行這些動作
七、布爾表達式的回填
回填 (Backpatching)
非終結符B的綜合屬性
函數
布爾表達式的回填
八、控制流語句的回填
控制流語句的回填
九、switch語句的翻譯
switch語句的翻譯
增加一種case指令
十、過程調用語句的翻譯
過程調用語句的翻譯
過程調用語句的代碼結構