天天看點

自己動手構造編譯系統:編譯、彙編與連結2.1.3 符号表管理

<b>2.1.3  符号表管理</b>

  

       符号表是記錄符号資訊的資料結構,它使用按名存取的方式記錄與符号相關的所有編譯資訊。編譯器工作時,少不了符号資訊的記錄和更新。在本書定義的進階語言中,符号存在兩種形式:變量和函數。前者是資料的符号化形式,後者是代碼的符号化形式。語義分析需要根據符号檢測變量使用的合法性,代碼生成需要根據符号産生正确的位址,是以,符号資訊的準确和完整是進行語義分析和代碼生成的前提。見圖2-6。

  對于變量符号,需要在符号表中記錄變量的名稱、類型、區分變量的聲明和定義的形式,如果變量是局部變量,還需要記錄變量在運作時棧幀中的相對位置。例如以下變量聲明語句:

extern int var;

  該語句聲明了一個外部的全局變量,記錄變量符号的資料結構除了儲存變量的名稱“var”之外,還需要記錄變量的類型“int”,以及變量是外部變量的聲明形式“extern”。

  對于函數符号,需要在符号表中記錄函數的名稱、傳回類型、參數清單,以及函數内定義的所有局部變量等。例如下面的函數定義代碼:

int sum(int

a,int b)

{

     int c;

     c=a+b;

     return c;

}

  符号表應該記錄函數的傳回類型“int”、函數名“sum”、參數清單“int,int”。函數的局部變量除了顯式定義的變量“c”之外,還暗含參數變量“a”和“b”。

  由于局部變量的存在,符号表必須考慮代碼作用域的變化。函數内的局部變量在函數之外是不可見的,是以在代碼分析的過程中,符号表需要根據作用域的變化動态維護變量的可見性。