① 什麼是符號表 符號表有哪些重要作用
符號表是一種用於語言翻譯器(例如編譯器和解釋器)中的數據結構。在符號表中,程序源代碼中的每個標識符都和它的聲明或使用信息綁定在一起,比如其數據類型、作用域以及內存地址。
符號表的作用:符號表在編譯程序工作的過程中需要不斷收集、記錄和使用源程序中一些語法符號的類型和特徵等相關信息。這些信息一般以表格形式存儲於系統中。
如常數表、變數名表、數組名表、過程名表、標號表等等,統稱為符號表。對於符號表組織、構造和管理方法的好壞會直接影響編譯系統的運行效率。
(1)編譯符號表去掉名字擴展閱讀
編譯程序按名字的不同種屬分別使用許多符號表,如常熟表。變數名表過程名表函數入口名表。符號表的關鍵字域(段)就是符號名稱等長關鍵字域(段)符號表。
不等長關鍵欄位符號表,採用關鍵字詞的索引結構。關鍵字在符號表的查找中相當重要hash函數構造方法就是以取關鍵字的值不同區分,如直接定址伐數字分析法折疊法。
② 定義語法樹和符號表的數據結構
為了維持靜態作用域的程序里各個名字的軌跡,編譯器需要依靠一種稱為符號表的數據結構。從最基本的層次上看,符號表就是一個字典:它把名字映射到編譯器已知的有關信息。這里最基本的操作是把一個新映射關系(名字對象約束)放入表裡,以及(非破壞性的)用一個給定名字去提取映射下的信息,以後我們把
這兩個操作分別稱為insert和lookup。大部分語言里的靜態作用域規則還提出了另外的復雜性,它們要求在程序里的不同部分有不同的引用環境。為了處理作用域規則,我們可能希望簡單增加一個remove操作。由於編譯器在語義分析階段要從頭到尾掃描代碼,這樣它就可以在某個作用域開始時插入新約束,在作用域最後撤銷它們。但是,存在一些因素使這種直接做法並不實際。
¨ 在許多有著嵌套作用域的語言里,內層聲明的效果可以遮蔽外層聲明,這就意味著符號表必須有能力為一個給定名字保存任意數目的映射。lookup操作必須返回最內層的映射,到作用域結束時還必須使外層映射重新變成可見的。
¨ 類Algol語言里的記錄(結構)具有某種作用域性質,但卻又不享有作用域那樣的良好嵌套結構。當語義分析器看到一個記錄聲明時,它就必須記下各個記錄域的名字(它們也是遞歸的,因為記錄可以嵌套)。在這種聲明結束時,各個域的名字又必須變成不可見的。然而,在此之後,一旦這一記錄類型的某個變數出現在程序的正文里(例如在my_rec.field_name),在引用中位於圓點之後的部分,這些域名又必須立即重新變成可見的。在Pascal和另一些有with語句的語言里,記錄域的名字還應該在多個語句的上下文里變成可見的。
¨ 某些時候一些名字有可能在它們被聲明之前使用,即使在類Algol語言里情況也如此。舉例說,Algol 60和Algol 68都允許標號的向前引用。Pascal避免了這種情況,它要求標號必須在作用域開始處聲明,但還是允許指針聲明的向前引用:
type