当前位置:文档之家› 第4章 符号表

第4章 符号表


4.2 符号的主要属性及作用
4、作用域及可视性 一个符号变量在程序中起作用的范围,称谓其作用域。 一般来说,定义该符号的位置及存储类关键字决定了 该符号的作用域。 一般来说变量的作用域就是该变量可以出现的场合, 也就是说在某个变量作用域范围内该变量是可引用的, 这就是变量可视性的作用域规则。 变量可视性不仅仅取决于它的作用域,还有两种情况 影响到一个变量的可视性。 – 函数的形式参数 – 分程序(或复合语句)结构
第4章 符号表
编译原理课程组 计算机工程学院
第4章 符号表
4.1 符号表的作用和地位 4.2 符号的主要属性及作用 4.3 符号表的组织 4.4 符号表的管理
思考题
1. 什么是符号表? 2. 标识符符号通常有那些属性? 3.你认为符号表是怎样进行组织的? 4.你认为符号表是怎样进行管理的?
【学习目标】
4.4 符号表的管理
符号表的行为通常主要是符号表的初始化、符 号的登录、符号的查找和有关分程序结构的符 号表层次管理。 对符号表的这些管理除初始化之外,都是动态 进行的。
一、符号表的初始化
符号表的初始化,就是在对语言程序开始编译 的时刻,定义建立符号表的初始状态。 符号表的不同组织方法,要求不同的初始化方 法。编译开始时符号表的状态应该是没有任何 可视标识符的状态。反映这种状态的方式通常 有以下两种情况:
其次,是根据变量出现的次序。 一般说来,决定变量在某个区中所处的具体位置,这通 常使用在该区域中相对区头的相对位置来确定。 而有关 区域的标志及相对位置都是作为该变量的语义信息被收 集在该变量的符号表属性中。
二、符号表的操作
往表中填入一个新的名字; 对给定名字,查询名字是否已在表中; 对给定名字,访问它的某些信息; 对给定名字,填写或更新它的某些信息; 删除一个或一组无用的项。
2、上下文语义的合法性检查的依据
通过符号表中属性记录可进行相应上下文的语义检查。
例如:在C语言中同一个标识符可作引用说明也可作定义说明
…… int i [3][5]; //定义说明i
语义检查可发现
…… extern float i; //引用说明i
其不一致错误。
……
又例如:在C语言中同一个标识符可作引用说明也可作定义说明
在编译程序中符号表用来存放语言程序中出现 的有关标识符的属性信息,这些信息集中反映 了标识符的语义特征属性。本章目的使学生深 刻全面地了解符号表的地位和作用;掌握符号 表的组织和管理方法;以及编译过程中符号表 的操作活动过程。
【难重点】
◇ 符号表总体组织的选择原则。 ◇ 变量的类型和存储类别等属性的重要性。 ◇ 采用单表结构时,如何解决分程序构造中同名名
复习
词法分析程序的功能是读入源程序,输出单词符号。 单词符号是一个程序设计语言的基本语法符号,一般分为下列五种: – 保留字,关键字:如if, else, while等 – 标识符:变量名、程序名、函数名等 – 常数(量) – 运算符 – 界符 词法分析程序所输出的单词符号常常采用以下二元式表示:
…a…
} } }
图中第3层所引用的a,既 不是第4层的float a;也 不是第1层int a;而是第 2层char a
4.2 符号的主要属性及作用
5、存储分配信息
根据符号变量的存储类别定义及它们出现的位置和次 序来确定每一个变量应分配的存储区及在该区中的具 体位置,用相对区头的位移量表示。 通常一个编译程序有两类存储区: – 静态存储区 – 动态存储区
……
int i [3][5];
……
重定义冲突的语义错误。
float i[4][2];
……
int i [3][5];
3、作为目标代码生成阶段地址分配的依据
每个符号变量在目标代码生成时需要确定其在 存储分配的位置(主要是相对位置)。
首先,要确定其被分配的区域。 例如,在C语言中首先要确定该符号变量是分配在公共区 (extern)、文件静态区(extern static)、函数静态区 (函数中static)、还是函数运行时的动态区(auto)等。
1、符号表的表长是渐增变化的情况
线性组织和二分法组织的符号表初始化方法 只需将表尾推向表头即可。
2、符号表的表长是确定的情况
散列组织的符号 表,表长并不反 映已登录的表项 个数,其表长通 常是确定的,对 这类符号表的初 始化方法,需要 将表中全部表项 值清除。
二、符号的登录(填表)
当编译程序从语言程序中获得一个标识符符号 并确定该符号在符号表中尚不存在时,就要将 此符号登录到符号表中。 登录符号到符号表中,首先要确定登录的位置。
(单词类别,单词自身的值)。 单词的类别是语法分析需要的信息,而单词自身的值则是编译其它阶段 需要的信息。 对于标识符来说,还需要记载它的类别、层次还有其他属性,如果这些 属性统统收集在符号表中,那么可以将单词的二元式表示设计成如下形 式(标识符,指向该标识符所在符号表位置的指针)
复习
例 :对语句if i=5 then x:=y的词法分析结果
符号表的操作主要为查表和填表。
4.2 符号的主要属性及作用
不同的语言定义的标识符属性不尽相同,我们主要讨论符号 表中的标识符一般设置的属性项目以及它们的功能。
1、符号名:符号表中符号名作为表项之间的唯一区别一般不允许重名。 允许操作重载的语言中,函数名、过程名是可以重名的,对于这类 重载的标识符要通过它们的参数个数和类型以及函数返回值类型来 区别,以达到它们在符号表中的惟一性。
关于排序表的表项建立及符号查找,通常采用
"二分法"。 符号
属性
h
A
B
C
D
p
3、散列组织
一个符号在散列表中的位置,是由对该符号 (即字符代码串)进行某种函数操作(通常称 为“杂凑函数”)所得到的函数值来确定的。 所得到的函数值与该表项在表中位置的对应关 系,是通过对函数值的“求整”以及相对于表 长的“求余”得到的。
2、符号的类型:符号表中设置一个符号类型域,存放该符号的类型。
3、存储类别:存储类别定义采用二种方式,一种是用关键字指定(例 如C语言中用Static定义是属于文件的静态存储变量或属于函数内部 的静态存储变量,用regist定义使用寄存器存储的变量);另一种方 式是根据定义变量说明在程序中的位置来决定。(例如C语言中,在 函数体外默认存储类关键字所定义的变量是外部变量,而在函数体 内默认存储类关键字所定义的变量是内部变量)
符号表属性域的组织,根据属性性质大致分成 两类: 等长属性值域组织 不等长属性值域的组织
五、下推链域的组织
在程序语言的结构中,分程序的分层结构允许 同名标识符具有的生存期发生重叠。为实现这 种同名标识符的语义功能,符号表中需要设立 下推链域的组织。 下推链域组织要求在进入一个内层结构并发生 重名标识符定义时,需把当前符号表中外层的 该符号表项下推到下推链中而在符号表被下推 的表项处建立内层的同名标识符的表项。
五、下推链域的组织
符号
内情向 量指针 型
层次
下推 指针
… int 3 …
… int 0 … … int 1 … … int(0) func() {
…; float i;…………….(1) …; { …;
int i[5];…………(2) …; { …;
int i;………….(3) … } … } … }
– 保留字if
(3,‘if’)
– 标识符i
(1,指向i的符号表入口)
– 等 号=
(4,‘=’)
– 常 数5
(2,‘5’)
– 保留字then
(3,‘then’)
– 标识符x
(1,指向x的符号表入口)
– 赋值号:=
(4,‘:=’)
– 标识符y
(1,指向y的符号表入口)
– 分 号;
(5,‘;’)
一、符号表的作用和地位
二、符号表项的排列
在编译程序中,符号表项的组织传统上采用三 种构造方法。即线性法,二分法及散列法。
1、线性组织
这种方法规定符号表中表项按它的符号被扫描 到的先后顺序登录。
符号
h
A
B
D
C
p
属性
2、排序组织及二分法
排序组织的符号表,就是在符号表中的表项按 其符号的字符代码串(可以看成一个整数值) 的值的大小从大到小(或从小到大)排列的。
三、关键字域的组织
符号表的关键字域就是符号本身,它可以是语 言的保留字,操作符号或标识符(包括变量名, 函数名,记录结构标志等)。 – 等长关键字域(段)符号表 – 不等长关键字段符号表——关键字池组织
等长关键字域(段)符号表
•编译程序中标识符的内部规则是符号表关键字组织的基础和依据。 •用户程序中的标识符,考虑到习惯和可读性,长度是从1到内部规则 规定长度之间任意字符个数。 •符号表中存放标识符的关键字段等长,具有统一的最大长度。譬如C 语言的关键字段长度可以是32个(其中31个是存放名字,余一个是
4.2 符号的主要属性及作用
1)函数的形式参数:影响变量可视性的举例
int a;
int func(a,b)
float a;
int b; {
其中int a与float a重名,而函数体中可看到的 a是float a,int a在函数中是看不到的。

…a… //引用float a
… }
4.2 符号的主要属性及作用
符号表的基本结构如下:
符号
属性
一、符号表的总体组织(1)
1、第一种方法 把属性种类完全相同的那些符号组织在一起,构造出 表项是分别为等长的多个符号表。
2、第二种方法 把所有语言中的符号都组织在一张符号表中。 假设有下列三类符号及其所需之属性。 符号 属性值1 属性值2 属性值3
相关主题