目錄6.3 非分程式結構語言的符號表組織
6.4 分程式結構語言的符號表組織
符號表:在編譯過程中,編譯程式用來記錄源程式中各種名字的特性資訊,所以也稱為名字特性表。
名字:程式名、過程名、函式名、使用者定義型別名、變數名、常量名、列舉值名、標號名等。
符號表在編譯過程中的作用:
源程式中變數要先宣告,然後才能引用。
宣告語句中,宣告各種名字,給出型別維數等資訊,編譯時將這些資訊登入到符號表中,並給變數分配儲存單元,儲存單元位址也登入在符號表中。
當編譯到引用所宣告的變數(賦值或引用其值)時,要進行語法語義正確性檢查和生成相應的目標程式,需要查符號表以取得相關資訊。
有關符號表的操作:填表和查表
填表:說明或定義語句中的名字、與之有關的資訊填入符號表中。
查表:
「名字」域:存放名字。一般為識別符號的符號串,也可為指向識別符號字串的指標。
「特性」域:可包括多個子域,分別表示識別符號的有關資訊。如:
不同的種類存入的資訊也是不同的。
過程或函式:形參個數、所在層次、函式返回值型別、區域性變數所佔空間大小等
指標:所指物件型別等
1.統一符號表:不論什麼名字都填入統一格式的符號表中
符號表表項應按資訊量最大的名字設計。填表、查表比較方便,結構簡單,但浪費大量空間
2.不同種類的名字分別建立各種符號表
節省空間,但是填表和查表不方便。
3.折中辦法:大部分共同資訊組成統一格式的符號表。特殊資訊另設附表,兩者用指標連線。
非分程式的結構語言:每個可獨立進行編譯的程式單元時乙個不包含有子模組的單一模組。如fortran語言。
主程式與子程式通過公共區交流
識別符號的作用域
全域性:子程式名、函式名和公共區名
區域性:程式單元中定義的變數
符號表的組織:
基本處理辦法:
子程式、函式名和公共區變數填入全域性符號表
在子程式(函式)宣告部分讀到識別符號時,構造區域性符號表
在語句部分讀到識別符號,查表。
程式單元結束:釋放該程式單元的區域性符號表。
程式執行完成:釋放全部符號表
符號表的組織方式:
1.無序符號表:按掃瞄順序建表,查表要逐項查詢。查表操作平均長度:(n+1)/2
2.有序符號表:符號表按變數名進行字典式排序。線性查表同上,折半查表:\(log_2n-1\)
3.雜湊符號表(hash表),但需要解決衝突問題
(1)分程式的結構語言:模組內可嵌入子模組
(2)識別符號的作用域和基本處理方法
作用域:識別符號區域性於所定義的模組(最小模組)
基本處理辦法:
建查符號表均要遵循識別符號作用域規定進行。
建表;不能重複,不能遺漏。
查表:按識別符號作用域查詢。
處理方法:
假設識別符號是先宣告後引用(標號例外,要特殊處理)
即宣告時插入,檢視有無同名。引用時查詢,通過轉到直接外層的方法檢視是否宣告,並提取資訊。
處理方法:預先將標準識別符號填入名字表中,因為他們是全程量,所以應填入最外層。
分程式表結構
分程式的符號表形成順序是2,4,3,1。該次序是閉分程式的次序(end出現的次序)
按先進後出的順序掃瞄其中各個分程式,可設乙個臨時工作棧。
每當進入一層分程式時,就在棧頂預造該分程式的符號表,當遇到該層分程式的結束符(end)時,此時該分程式的全部登記項已位於棧頂,再將該分程式的全部登記項移至正式符號表中。
當過程和函式體編譯完成後,應將與之對應的引數名和區域性變數名以及後者的特性資訊從符號表中刪去。
第六章 符號表(1)
在編譯程式工作的過程中,需要不斷收集 記錄和使用源程式中一些語法符號 簡稱為符號 的型別和特徵等相關資訊。為方便起見,一般的做法是讓編譯程式在其工作過程中,建立並保持一批 如常數表 變數名錶 陣列名表 過程或子程式名錶及標號表等等,我們將它們統稱為符號表或名字表。符號表的每一登記項,將填入名字識別符...
編譯原理第六章
a 知識點總計 一 屬性文法 1.屬性文法 是在上下文無關文法的基礎上為每個文法符號 終結符或非終結符 配備若干個相關的 值 稱為屬性 屬性 代表與文法符號相關的資訊,和變數一樣,可以進行計算和傳遞。例 型別 值 序列 符號表內容等 2.屬性的分類 綜合屬性 繼承屬性 2 繼承屬性 用於 自上而下 ...
編譯原理第六章
1.屬性文法分為 綜合屬性 繼承屬性。出現在產生式左邊的的繼承屬性和出現在產生式右邊的綜合屬性不由所給的產生式的屬性規則進行計算,他由其他產生式的屬性規則計算或者由屬性計算器的引數提供。綜合屬性 在語法樹種,乙個結點的綜合屬性的值由其子結點的屬性值確定,因此使用自底向上的文法在每乙個結點出使用語義規...