tiger 語義分析(型別檢查)

2021-07-28 06:32:01 字數 1333 閱讀 3211

為編譯器實現型別檢查。

在語法分析的基礎上,對抽象語法樹進行型別檢查,並生成相關報錯資訊。

完成語法分析的基礎上,還需:

types.[ch]: 已給出,描述了tiger語言的資料型別

env.[ch]: 實現值環境、型別環境

semant.[ch]:實現型別檢查函式sem_transprog(a_exp exp)

semtest.c: 測試平台,main入口

修改makefile

實現方法:

1. 型別檢查過程中,遇到宣告時,將其按規則檢查並構造,放入相應值或型別環境中,遇到型別、變數或函式標示符時在這兩個環境中查詢。初始tenv中包含int、string兩種基本型別,venv包含print,ord等預定義函式。

2. 表示式根據不同型別作相應處理,例如exp1:=exp2要保證exp1和exp2型別相同。特別宣告了void型別用於匹配無值表示式,方便處理。

3. 作用域處理。可以通過在環境中插入乙個標記實現。作用域開始,插入乙個標記,作用域結束,彈出標記以上的所有新增宣告或定義。

注意:

1. for、while、if-then等表示式無值返回,需要判斷。

2. nil型別只能用於給記錄(record)型別賦值或比較,兩個nil比較非法。

3. tiger語言中定義的兩個陣列(array)或記錄,即使各個域相同,也不具有等價性。

例如:

type a =

type b =

a和b為兩種型別,不能相互賦值。

而 name型別

type a =

type b =a

a和b視為相同型別。

由此可以容易的實現型別比較,型別構建後都對應唯一的資料結構,只需比較兩個非name型別的指標是否相等即可。

- 4. 遞迴型別和函式宣告。 遞迴型別可以先向環境插入(type_id, ty_name(type_id, null))項,然後再構造相應結構,替換原來的null。遞迴函式宣告類似。

5. 重宣告。連續的遞迴宣告中不允許出現重複宣告,而其他情況下可以,後來宣告會覆蓋前面的。

6. break巢狀。用一全域性變數loop儲存迴圈巢狀層數,只要在迴圈中,break就合法。

7. 作用域。除let表示式,函式形參中存在宣告,需要作用域規則,for中迴圈變數也是。

8. for中迴圈變數不能賦值(未實現,沒想到代價比較小的方法)

**實現:

點我

語義分析 一

語義分析一般是和語法分析組合在一起執行的,語法分析完成前一步語法樹分析的構建 呼叫某個產生式完成一步規約,形成當前的樹節點 然後語義分析便接著呼叫相應產生式配備的語義動作或子程式,完成屬性文法所要求的語義動作 比如型別轉換或生成中間 所以對於屬性文法而言,屬性的加工和使用過程便是語義處理的意義。乙個...

編譯語義分析實驗

單詞的種別編碼方案 單詞符號 種別編碼 單詞符號 種別編碼 單詞符號 種別編碼 begin 1 13 23 if 2 14 24 then 3 15 25 while 4 16 26 do 5 17 29 l l d 10 0dd 11 21 演算法思想 1 設定語義過程。1 emit char r...

潛在語義分析LSA

lsa和傳統向量空間模型 vector space model 一樣使用向量來表示詞 terms 和文件 documents 並通過向量間的關係 如夾角 來判斷詞及文件間的關係 不同的是,lsa 將詞和文件對映到潛在語義空間,從而去除了原始向量空間中的一些 噪音 提高了資訊檢索的精確度。1 一詞多義...