當前位置:成語大全網 - 新華字典 - 定義語法樹和符號表的數據結構

定義語法樹和符號表的數據結構

為了維持靜態作用域的程序裏各個名字的軌跡,編譯器需要依靠壹種稱為符號表的數據結構。從最基本的層次上看,符號表就是壹個字典:它把名字映射到編譯器已知的有關信息。這裏最基本的操作是把壹個新映射關系(名字對象約束)放入表裏,以及(非破壞性的)用壹個給定名字去提取映射下的信息,以後我們把

這兩個操作分別稱為insert和lookup。大部分語言裏的靜態作用域規則還提出了另外的復雜性,它們要求在程序裏的不同部分有不同的引用環境。為了處理作用域規則,我們可能希望簡單增加壹個remove操作。由於編譯器在語義分析階段要從頭到尾掃描代碼,這樣它就可以在某個作用域開始時插入新約束,在作用域最後撤銷它們。但是,存在壹些因素使這種直接做法並不實際。

¨ 在許多有著嵌套作用域的語言裏,內層聲明的效果可以遮蔽外層聲明,這就意味著符號表必須有能力為壹個給定名字保存任意數目的映射。lookup操作必須返回最內層的映射,到作用域結束時還必須使外層映射重新變成可見的。

¨ 類Algol語言裏的記錄(結構)具有某種作用域性質,但卻又不享有作用域那樣的良好嵌套結構。當語義分析器看到壹個記錄聲明時,它就必須記下各個記錄域的名字(它們也是遞歸的,因為記錄可以嵌套)。在這種聲明結束時,各個域的名字又必須變成不可見的。然而,在此之後,壹旦這壹記錄類型的某個變量出現在程序的正文裏(例如在my_rec.field_name),在引用中位於圓點之後的部分,這些域名又必須立即重新變成可見的。在Pascal和另壹些有with語句的語言裏,記錄域的名字還應該在多個語句的上下文裏變成可見的。

¨ 某些時候壹些名字有可能在它們被聲明之前使用,即使在類Algol語言裏情況也如此。舉例說,Algol 60和Algol 68都允許標號的向前引用。Pascal避免了這種情況,它要求標號必須在作用域開始處聲明,但還是允許指針聲明的向前引用:

type