語義分析與符號表
- 上下文有關分析(標識符的作用域)
- 類型的一致性檢查
- 語義處理: 聲明語句(登錄名字的特徵信息到符號表上), 執行語句(按某種操作的目標結構生成代碼)
非分程序結構: 主程序與子程序, 函數分開
分程序結構: 主程序與子程序, 函數嵌套
作用域分 靜態作用域(c, c++) 和 動態作用域(python)
遇到聲明語句填符號表
- 填表前查表, 在同一作用域內是否重複定義
- 檢查名字種類和說明是否一致
- 對於強類型語言,檢查表達式中各變量的類型是否一致
- 生成目標指令時,取得所需要的地址
非分程序結構語言的符號表組織
- 子程序, 函數名, 公共區名 填入 全局符號表
- 在子程序(函數)聲明部分的標識符 填入 局部符號表
- 在語句部分的標識符 先查局部符號表,再查全局符號表
- 程序單元結束時,釋放局部符號表
- 程序編譯完成時,釋放全局符號表
無序符號表(查找(n+1)/2)
有序符號表(線性查找(n+1)/2, 折半查找)
散列符號表(Hash表)(查找1, 解決衝突)
分程序結構語言的符號表組織
- 標識符的作用域是定義該標識符的模塊
- 循環體應看作一層(模塊)
- 在程序聲明部分讀到標識符,只查本層符號表
- 在語句中讀到標識符, 先查本層符號表, 再查外層符號表
棧式符號表: 對於不同層級的符號表, 後建先消
散列符號表的棧式實現