符號表的作用和地位

2021-09-07 15:52:40 字數 1133 閱讀 5356

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

① 收集符號屬性

② 上下文語義的合法性檢查的依據

③ 作為目標**生成階段位址分配的依據

① 收集符號屬性 編譯程式掃瞄說明部分收集有關識別符號的屬性,並在符號表中建立符號的相應屬性資訊。例如,編譯程式分析到下述兩個說明語句

int a;

float b[5];

則在符號表中收集到關於符號a的屬性是乙個整型變數,關於符號b的屬性是具有5個浮點型元素的一維陣列。

② 上下文語義的合法性檢查的依據 同乙個識別符號可能在程式的不同地方出現,而有關該符號的屬性是在這些不同情況下收集的。特別是在多趟編譯及程式分段編譯(在pascal及c中以檔案為單位)的情況下,更需檢查識別符號屬性在上下文中的一致性和合法性。通過符號表中屬性記錄可進行相應上下文的語義檢查。

例如,在乙個c語言程式**現

int i [3,5]; //定義整型陣列i

float i[4,2]; //定義實型陣列i,重定義衝突

int i [3,5]; //定義整型陣列i,重定義衝突

編譯過程首先在符號表中記錄了識別符號i的屬性是3×5個整型元素的陣列,而後在分析第

二、第三這兩個定義說明時編譯系統可通過符號表檢查出識別符號i的二次重定義衝突錯誤。本例還可以看到不論在後二句中i的其它屬性與前一句是否完全相同,只要識別符號名重定義,就將產生重定義衝突的語義錯誤。

③ 作為目標**生成階段位址分配的依據 每個符號變數在目標**生成時需要確定其在儲存分配的位置(主要是相對位置)。語言程式中的符號變數由它被定義的儲存類別(如在c、fortran語言中)或被定義的位置(如分程式結構的位置)來確定。首先要確定其被分配的區域。例如,在c語言中首先要確定該符號變數是分配在公共區(extern)、檔案靜態區(extern static)、函式靜態區(函式中static)、還是函式執行時的動態區(auto)等。其次是根據變數出現的次序,(一般來說)決定該變數在某個區中所處的具體位置,這通常使用在該區域中相對區頭的相對位置確定。而有關區域的標誌及相對位置都是作為該變數的語義資訊被收集在該變數的符號表屬性中。

符號表的作用和地位

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

符號表的作用

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

未解決符號表,匯出符號表和位址重定向表

讓我們總結一下 編譯器把乙個cpp編譯為目標檔案的時候,除了要在目標檔案裡寫入cpp裡包含的資料和 還要至少提供3個表 未解決符號表,匯出符號表和位址重定向表。未解決符號表提供了所有在該編譯單元裡引用但是定義並不在本編譯單元裡的符號及其出現的位址。匯出符號表提供了本編譯單元具有定義,並且願意提供給其...