编译原理 符号表管理技术
第六章 符號表管理技術
文章目錄
- 第六章 符號表管理技術
- 6.1 概述
- 6.2 符號表的組織與內容
- 6.2.1 符號表的結果與內容
- 6.2.2 符號表的組織方式
- 6.3 非分程序結構語言的符號表組織
- 6.4 分程序結構語言的符號表組織
6.1 概述
符號表:在編譯過程中,編譯程序用來記錄源程序中各種名字的特性信息,所以也稱為名字特性表。
名字:程序名、過程名、函數名、用戶定義類型名、變量名、常量名、枚舉值名、標號名等。
特性信息:上述名字的種類、類型、維數、參數個數及目標地址(存儲單元地址)等。
符號表在編譯過程中的作用:
源程序中變量要先聲明,然后才能引用。
聲明語句中,聲明各種名字,給出類型維數等信息,編譯時將這些信息登錄到符號表中,并給變量分配存儲單元,存儲單元地址也登錄在符號表中。
當編譯到引用所聲明的變量(賦值或引用其值)時,要進行語法語義正確性檢查和生成相應的目標程序,需要查符號表以取得相關信息。
有關符號表的操作:填表和查表
填表:說明或定義語句中的名字、與之有關的信息填入符號表中。
查表:
-
填表前查表,檢查同一作用域內名字是否重復定義
-
檢查名字種類是否與說明一致
-
強類型語言中,表達式中各變量的類型是否一致
強類型語言是一種強制類型定義的語言,一旦某一個變量被定義類型,如果不經過強制轉換,則它永遠就是該數據類型了,強類型語言包括Java、.net 、Python、C++等語言。
-
生成目標指令時,要去的所需要的地址
6.2 符號表的組織與內容
6.2.1 符號表的結果與內容
“名字”域:存放名字。一般為標識符的符號串,也可為指向標識符字符串的指針。
“特性”域:可包括多個子域,分別表示標識符的有關信息。如:
-
名字(標識符)的種類:簡單變量、函數、過程、數組、標號、參數等
-
類型:如整型、浮點型、字符型、指針等
-
性質:變量形參、值形參
形參:全稱為“形式參數”,是在定義函數名和函數體的時候使用的參數,目的是用來接收調用該函數時傳遞的參數。
形參的作用是實現主調函數與被調函數之間的聯系,通常將函數所處理的數據,影響函數功能的因素或者函數處理的結果作為形參。
-
值:常量名所代表的數值
-
地址:變量所分配單元的首址或地址位移
-
大小:所占的字節數
-
作用域的嵌套層次
不同的種類存入的信息也是不同的。
數組:維數、上下界值、計算下標量地址所用的信息、數組元素類型等
記錄(結構、聯合):域的個數,每個域名、地址位移、類型等
過程或函數:形參個數、所在層次、函數返回值類型、局部變量所占空間大小等
指針:所指對象類型等
6.2.2 符號表的組織方式
1.統一符號表:不論什么名字都填入統一格式的符號表中
符號表表項應按信息量最大的名字設計。填表、查表比較方便,結構簡單,但浪費大量空間
2.不同種類的名字分別建立各種符號表
節省空間,但是填表和查表不方便。
3.折中辦法:大部分共同信息組成統一格式的符號表。特殊信息另設附表,兩者用指針連接。
6.3 非分程序結構語言的符號表組織
非分程序的結構語言:每個可獨立進行編譯的程序單元時一個不包含有子模塊的單一模塊。如FORTRAN語言。
主程序與子程序通過公共區交流
標識符的作用域
全局:子程序名、函數名和公共區名
局部:程序單元中定義的變量
符號表的組織:
基本處理辦法:
子程序、函數名和公共區變量填入全局符號表
在子程序(函數)聲明部分讀到標識符時,構造局部符號表
在語句部分讀到標識符,查表。
程序單元結束:釋放該程序單元的局部符號表。
程序執行完成:釋放全部符號表
符號表的組織方式:
1.無序符號表:按掃描順序建表,查表要逐項查找。查表操作平均長度:(n+1)/2
2.有序符號表:符號表按變量名進行字典式排序。線性查表同上,折半查表:log2n?1log_2n-1log2?n?1
3.散列符號表(Hash表),但需要解決沖突問題
6.4 分程序結構語言的符號表組織
(1)分程序的結構語言:模塊內可嵌入子模塊
(2)標識符的作用域和基本處理方法
作用域:標識符局部于所定義的模塊(最小模塊)
-
模塊中所定義標識符的作用域是定義該標識符的子程序
-
過程或函數說明中定義的標識符(包括形參),其作用域為本過程體
-
循環語句中定義的標識符,其作用域為該循環語句
不能從循環體外轉到循環體內,循環語句應看作一層。
基本處理辦法:
建查符號表均要遵循標識符作用域規定進行。
建表;不能重復,不能遺漏。
查表:按標識符作用域查找。
處理方法:
假設標識符是先聲明后引用(標號例外,要特殊處理)
即聲明時插入,查看有無同名。引用時查找,通過轉到直接外層的方法查看是否聲明,并提取信息。
處理方法:預先將標準標識符填入名字表中,因為他們是全程量,所以應填入最外層。
分程序表結構
分程序的符號表形成順序是2,4,3,1。該次序是閉分程序的次序(END出現的次序)
按先進后出的順序掃描其中各個分程序,可設一個臨時工作棧。
每當進入一層分程序時,就在棧頂預造該分程序的符號表,當遇到該層分程序的結束符(END)時,此時該分程序的全部登記項已位于棧頂,再將該分程序的全部登記項移至正式符號表中。
當過程和函數體編譯完成后,應將與之對應的參數名和局部變量名以及后者的特性信息從符號表中刪去。
總結
以上是生活随笔為你收集整理的编译原理 符号表管理技术的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JS案例练习:判断闰年案例
- 下一篇: matlab如何下载a股数据,matla