C語言的符號表和型別系統2

2021-07-22 16:06:43 字數 2143 閱讀 3237

這一節,我們繼續就上一節討論的內容,繼續就符號表和型別系統的構建進行深入的**。

enum rabbits ;
上面的列舉型別,會被c編譯器轉換成如下形式的c**:

const

int flospy = 0;

const

int mopsey = 0;

const

int peter = 0;

編譯器在解析 「const int flospy = 0」 這條語句後,會在符號表中產生以下資料結構:

由於變數flospy 沒有*, 沒有之類的型別宣告,因此它的型別系統只需要說明符,不需要修飾符,因此它的型別列表中就是由乙個specifier.它的資料型別是int, 由於被初始化成乙個常量整形,所以constantvalue設定為0.大家注意,從symbol物件引出兩個箭頭,兩個箭頭都指向specifier物件。之所以需要兩個箭頭是因為,型別系統本質上就是乙個鍊錶,鍊錶鏈結的是兩種物件,一種是declarator, 一種是specifier, 我們在實現**的時候,需要把declarator放在鍊錶的前面,specifier放在鍊錶的最末尾。因此從symbol發出的兩個箭頭,乙個指向佇列的開頭,這樣從這個箭頭起始就可以逐個訪問鍊錶的每個物件,由於declarator放在鍊錶的前面,這樣從這個箭頭開始,就可以訪問一系列的declarator, 但是如果我們想要訪問鍊錶最末尾的specifier物件,那就得遍歷整個鍊錶,這樣效率就太慢了,於是,從symbol物件引出第二個箭頭直接指向鍊錶的末尾,也就是specifier物件,這樣想要直接訪問型別系統鍊錶的specifier,直接從第二個指標讀取就可以了,不需要遍歷整個鍊錶,例如下面這個例子:

long

int (*frollo)[10];

編譯器會給上面的變數宣告建立如下的符號表記錄和型別佇列:

大家看到,型別系統佇列有三個元素,前兩個是declarator, 最後乙個是specifier, 從symbol引出的兩個箭頭,乙個指向鍊錶的開始,第二個直接指向鍊錶的末尾,也就是specifier.

這樣,我們就需要在**中,設計乙個鍊錶來講declarator 和 specifier連線起來,這個鍊錶的**如下:

public

class

typelink

public object gettypeobject()

public typelink tonext()

}

這樣我們在symbol類中,要新增兩個成員變數:

public

class

symbol

struct 型別變數的型別系統

在specifier 類中,最後乙個成員變數structdefine,我還沒有解釋,這個型別是專門用於處理struct型別宣告的。由於乙個結構體裡面包含了多種變數宣告,所以結構體變數的存在使得型別系統複雜了很多,我們先看看結構體變數型別的**:

/*

* struct argotiers pierre;

* }*/public

class

structdefine

public string gettag()

public

intgetlevel()

public symbol getfields()

}

我們以乙個具體的結構體宣告例子為例,看看它對應的符號表和型別系統是怎樣的:

struct  argotiers  pierre;

} gipsy;

這個系統看起來似乎很複雜,但實際上它是由若干個簡單的型別系統結合而成的,搞清楚前面我們描述的型別系統佇列,對這個圖的理解應該不難,這個圖其實也表明,任何複雜的的系統,都是由多個簡單的單元相互勾連交叉所形成的。

所宣告的兩個變數,他們的型別系統和符號表是如何建立的。

符號表的作用和地位

在編譯程式中符號表用來存放語言程式中出現的有關識別符號的屬性資訊,這些資訊集中反映了識別符號的語義特徵屬性。在詞法分析及語法在分析過程中不斷積累和更新表中的資訊,並在詞法分析到 生成的各階段,按各自的需要從表中獲取不同的屬性資訊。不論編譯策略是否分趟,符號表的作用和地位是完全一致的。收集符號屬性 上...

符號表的作用和地位

在編譯程式中符號表用來存放語言程式 現的有關識別符號的屬性資訊,這些資訊集中反映了識別符號的語義特徵屬性。在詞法分析及語法在分析過程中不斷積累和更新表中的資訊,並在詞法分析到 生成的各階段,按各自的需要從表中獲取不同的屬性資訊。不論編譯策略是否分趟,符號表的作用和地位是完全一致的。收集符號屬性 上下...

static和被裁的符號表

為了不讓攻擊者理清自己程式的敏感業務邏輯,於是我們想方設法提高逆向門檻。本文就介紹乙個防禦技巧 利用static關鍵字裁掉函式符號。如果函式屬性為 static 那麼編譯時該函式符號就會被解析為local符號。在發布release程式時 用xcode打包編譯二進位制 缺省會strip裁掉這些函式符號...