自己动手构造编译系统:编译、汇编与链接2.1.3 符号表管理
2.1.3? 符號表管理
? ? ? ?符號表是記錄符號信息的數據結構,它使用按名存取的方式記錄與符號相關的所有編譯信息。編譯器工作時,少不了符號信息的記錄和更新。在本書定義的高級語言中,符號存在兩種形式:變量和函數。前者是數據的符號化形式,后者是代碼的符號化形式。語義分析需要根據符號檢測變量使用的合法性,代碼生成需要根據符號產生正確的地址,因此,符號信息的準確和完整是進行語義分析和代碼生成的前提。見圖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”。
由于局部變量的存在,符號表必須考慮代碼作用域的變化。函數內的局部變量在函數之外是不可見的,因此在代碼分析的過程中,符號表需要根據作用域的變化動態維護變量的可見性。
總結
以上是生活随笔為你收集整理的自己动手构造编译系统:编译、汇编与链接2.1.3 符号表管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 魔兽怀旧服大英雄任务怎么做 大英雄任务流
- 下一篇: 崩坏3作战凭证升级方法介绍 崩坏3作战凭