天天看點

第六章 符号表(1)

      在編譯程式工作的過程中,需要不斷收集、記錄和使用源程式中一些文法符号(簡稱為符号)的類型和特征等相關資訊。為友善起見,一般的做法是讓編譯程式在其工作過程中,建立并保持一批表格,如常數表、變量名表、數組名表、過程或子程式名表及标号表等等,我們将它們統稱為符号表或名字表。符号表的每一登記項,将填入名字辨別符以及與該名字相關聯的一些資訊。這些資訊,将全面地反映各個符号的屬性及它們在編譯過程中的特征,諸如名字的種屬(常數、變量、數組、标号等)、名字的類型(整型、實型、邏輯型、字元型等)、特征(目前是定義性出現還是使用性出現等)、給該名字配置設定的存儲單元位址以及與該名字的語義有關的其它資訊等等。

       根據對編譯程式工作階段的劃分,名字表中的各種資訊将在編譯程式工作過程中的适當時候填入。對在詞法分析階段就建造符号表的編譯程式,當從源程式中識别出一個單詞(名字)時,就以此名字查符号表,若表中尚無此登記項,則将該名字列入表中。至于與之相關的一些資訊,可視工作的友善,分别在文法分析、語義處理及中間代碼生成等階段陸續填入。以後我們将會進一步看到,幾乎在編譯程式工作的全過程中,都需要對符号表進行頻繁的通路(查表或填表),且耗費的時間在整個編譯過程所需的總時間中占有很大的比例。是以,合理地組織符号表,并相應地選擇好查填表的方式,實為提高編譯程式工作效率的有效途徑之一。

1、符号表的組織

      一般而言,對于同一類符号表,例如變量名表,它的結構以及表中每一登記項所包含的内容,由于程式設計語言種類和目标計算機的不同,可能有較大的差異。然而抽象地看,各類符号表一般都具有如圖6-1所示的形式。也就是說,符号表的每一項都由兩個欄目組成:第一欄為名字欄,用來存放辨別符或其内部碼;第二欄為資訊欄,一般由若幹個子欄(或域)組成,用來記錄與該項名字相對應的各種屬性之值和特征。

第六章 符号表(1)

                                      圖6-1 符号表的形式