在編譯程式工作的過程中,需要不斷收集、記錄和使用源程式中一些語法符號(簡稱為符號)的型別和特徵等相關資訊。為方便起見,一般的做法是讓編譯程式在其工作過程中,建立並保持一批**,如常數表、變數名錶、陣列名表、過程或子程式名錶及標號表等等,我們將它們統稱為符號表或名字表。符號表的每一登記項,將填入名字識別符號以及與該名字相關聯的一些資訊。這些資訊,將全面地反映各個符號的屬性及它們在編譯過程中的特徵,諸如名字的種屬(常數、變數、陣列、標號等)、名字的型別(整型、實型、邏輯型、字元型等)、特徵(當前是定義性出現還是使用性出現等)、給該名字分配的儲存單元位址以及與該名字的語義有關的其它資訊等等。
根據對編譯程式工作階段的劃分,名字表中的各種資訊將在編譯程式工作過程中的適當時候填入。對在詞法分析階段就建造符號表的編譯程式,當從源程式中識別出乙個單詞(名字)時,就以此名字查符號表,若表中尚無此登記項,則將該名字列入表中。至於與之相關的一些資訊,可視工作的方便,分別在語法分析、語義處理及中間**生成等階段陸續填入。以後我們將會進一步看到,幾乎在編譯程式工作的全過程中,都需要對符號表進行頻繁的訪問(查表或填表),且耗費的時間在整個編譯過程所需的總時間中占有很大的比例。因此,合理地組織符號表,並相應地選擇好查填表的方式,實為提高編譯程式工作效率的有效途徑之一。
1、符號表的組織
一般而言,對於同一類符號表,例如變數名錶,它的結構以及表中每一登記項所包含的內容,由於程式語言種類和目標計算機的不同,可能有較大的差異。然而抽象地看,各類符號表一般都具有如圖6-1所示的形式。也就是說,符號表的每一項都由兩個欄目組成:第一欄為名字欄,用來存放識別符號或其內部碼;第二欄為資訊欄,一般由若干個子欄(或域)組成,用來記錄與該項名字相對應的各種屬性之值和特徵。
圖6-1 符號表的形式
編譯原理 第六章 符號表管理技術
目錄6.3 非分程式結構語言的符號表組織 6.4 分程式結構語言的符號表組織 符號表 在編譯過程中,編譯程式用來記錄源程式中各種名字的特性資訊,所以也稱為名字特性表。名字 程式名 過程名 函式名 使用者定義型別名 變數名 常量名 列舉值名 標號名等。符號表在編譯過程中的作用 源程式中變數要先宣告,然...
第六章 指標(1)
int a a 10 這是c初學者很容易犯的乙個錯誤。我們定義了乙個指標變數a,它儲存的是某乙個整型變數的位址,然而,我們並沒有把該位址賦值給它,緊接著,我們將乙個常量10賦給指標變數a所儲存的位址所指向的值,然而實際上,我們並沒有給該指標變數賦值,因此,幸運的情況是系統的崩潰,嚴重的錯誤是指標變數...
mysql第六章 第六章 mysql日誌
第六章 mysql日誌 一 錯誤日誌 錯誤日誌的預設存放路徑是 mysql 存放資料的地方 hostname.err 1.修改錯誤日誌存放路徑 mysqld log error data mysql mysql.log 2.檢視配置命令 show variables like log error 3...