編譯原理之符號表

2021-09-24 14:45:59 字數 2102 閱讀 7317

二、符號表的組織方式

三、符號表的整理、查詢

四、名字的作用範圍

五、符號表的內容

int a;

float b[5];

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

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

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

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

每個符號變數在目標**生成時需要確定其在儲存分配的位置(主要是相對位置)。語言程式中的符號變數由它被定義的儲存類別(如在c、fortran語言中)或被定義的位置(如分程式結構的位置)來確定。首先要確定其被分配的區域。

例如,在c語言中首先要確定該符號變數是分配在公共區(extern)、檔案靜態區(extern static)、函式靜態區(函式中static)、還是函式執行時的動態區(auto)等。其次是根據變數出現的次序,(一般來說)決定該變數在某個區中所處的具體位置,這通常使用在該區域中相對區頭的相對位置確定。而有關區域的標誌及相對位置都是作為該變數的語義資訊被收集在該變數的符號表屬性中。

各項各欄所佔儲存單元的長度固定,

可以用固定分配空間,但是會有剩餘空間未使用造成浪費

什麼是間接方式安排符號表的資訊?

如果各種名字所需的資訊(information )空間長短不一,那麼,我們可把 一些共同屬性直接登記在符號表的資訊欄中,而把某些特殊屬性登記在別的 地方,並在資訊欄中附設一指示器,指向存放特殊屬性的地方

使用乙個一維陣列或多個一維陣列存放符號串名字和相關性息

按名字出現的先後順序依次填入;

查詢時從頭到尾逐個查詢;

按照程式設計習慣可以反序查詢。

按「最新最近」訪問原則形成一條指向表的鍊子,每次查詢時都按著這條鏈所指的順序查詢

a. 對折法的查詢方法如下:

首先把要查詢的項和中項(即第[n/2]+1項)作比

較,若相等,則宣布查詢成功。

若要查詢的項小於中項,則繼續在1〜[n/2]的各項

中去查詢。

若要查詢的項大於中項,則就到[n/2]+2〜n的各項

中去查詢。

平均查詢次數1+log2n

b. 雜湊技術。

假定有乙個足夠大的區域,這個區域用來填寫一張含n項的符號表。構造乙個位址函式h,對任何名字,h函式的取值在0至n-1之間。即不論對此項查表或填表,都能從h函式中獲得它在表中的位置。

函式的計算要簡單、高效;

函式值能比較均勻的分布在0至n-1之間。

建構函式h的辦法:

將具有相同雜湊值符號名連成一串,便於線性查詢。雜湊表是乙個可容納n個指示器值的一維陣列,它的每個元素的初值全為null。符號表除了通常包含的欄外,還增設了一鏈結欄,他把所有持有相同雜湊值的符號名連線成一條鏈。

針對符號表設計為棧符號表,新名字出現總是從棧頂填入。為了保證從內層向外層查,查詢 操作從符號表的棧頂往底部查詢。top指向棧頂第乙個可用單元,p總是指向最新子符號表首位址。

過程的巢狀層次表(display),是引入的乙個顯示層次關係表。其作用是為了描述過程的巢狀層次,指出當前正在活動著的各巢狀的過程(或 函式)相應的子符號表在棧符號表中的起始位置(相對位址)。

display表本身也是乙個棧,每進入乙個新的過程(或函式),棧頂指標增1;每退出乙個新的過程(或函式),棧頂指標減1。棧頂指標總是指向當前正在處理的最內層的過程在棧符號表中 的起始位置。

在資訊欄中引入乙個指標域(previous),用來鏈結它在同乙個過程內的下一名字在表中的下標(相對位置)。每一層最後乙個域名字,指標域之值為0。這樣每當需要查詢個新名字時,就能通過display表找出當前正在處理的最內層的過程及所有外層的子符號表在棧符號表中的位置。然後通過指標域可以找到同乙個過程內的所有被說明的名字。

(1)型別(整、實、雙實、字元、指標等);

(2)種屬(簡單變數、陣列或結構體等);

(3)長度(所需的儲存單元數);

(4)相對數(儲存單元相對位址);

符號表 (編譯原理)

符號表是一種用於語言翻譯器 例如編譯器和直譯器 中的資料結構。在符號表中,程式源 中的每個識別符號都和它的宣告或使用資訊繫結在一起,比如其資料型別 作用域以及記憶體位址。符號表在編譯程式工作的過程中需要不斷收集 記錄和使用源程式中一些語法符號的型別和特徵等相關資訊。這些資訊一般以 形式儲存於系統中。...

編譯原理語義分析 編譯原理 語義分析和符號表

本文使用 zhihu on vscode 創作並發布經過詞法分析 語法分析之後,源程式形式上和結構上的正確性基本得到了保證。然而,僅有形式上的正確性,並不能保證源程式就是完全正確的,還要檢查源程式的含義是否正確。諸如符號的使用是否得當,表示式的型別是否相容等,完成這些功能的編譯階段稱為語義分析。語義...

編譯原理結構框架8符號表管理

第 8章 符號表管理 重點 符號表的作用 符號表的組織結構 符號表與作用域。難點 符號表的組織結構及其效能評價。8.1符號表的作用 n符號表是以 名字為關鍵字 來記錄其資訊的資料結構,其上支援的兩個最基本操作應該是 新增表項和 查詢表項,這兩個操作必須是高效的 8.2符號表中存放的資訊 n每乙個符號...