编译原理 符号表3
⑶ 函数及过程的形参
每个函数或过程的形参个数、形参的排列次序及每个 形参的类型,都体现了调用该函数或过程时的属性, 它们都应该反映在符号表的函数或过程标识符的项中。
18
LOGO 广东工业大学计算机学院
本课内容
9.1 符号表的作用和地位 9.2 符号的主要属性及作用 9.3 符号表的组织 9.4 符号表的管理
15
LOGO 广东工业大学计算机学院
影响变量可视性的规则举例2
⑵ 分程序(或复合语句)结构: 影响变量可视 性的举例
…
{int a; // 第一层开头,定义局部整型变量a
…
{char a; // 第二层开头,定义局部字符型变量a
…
{ // 第三层开头
第二层的char a
… {float a; // 第四层头,定义局部实型变量a
13
LOGO 广东工业大学计算机学院
④ 符号的作用域及可视性
一个变量的作用域即该变量可以出现的场合,也就是说在 某个变量作用域范围内该变量是可引用的,这就是变量可 视性的作用域规则。
但是变量可视性不仅仅取决于它的作用域,还有两种情况 影响到一个变量的可视性。
⑴ 函数的形式参数:影响变量可视性的举例
LOGO 广东工业大学计算机学院
2. 符号表项的排列——线性组织
在编译程序中,符号表项的组织传统上采用三种构造方法: 线性法,二分法和散列法。
1. 线性组织
优点: 无空白项,存储空间效率高 缺点: 查找效率低下
这种方法规定符号表中表项按它的符号被扫描到的先后顺序 登录。例如有一程序中出现符号的情况如下:
② 符号的类型
标识符中除过程标识符之外,函数和变量标识符都具 有数据类型(data type)属性。对于函数的数据类 型指的是该函数值的数据类型。基本数据类型有整型、 实型、字符型、逻辑型(布尔型)及位组型等,符号 的类型属性是在该符号的定义时得到。变量符号的类 型属性决定了该变量的数据在存储空间的存储格式, 还决定了在该变量上可以施加的运算操作。
6
LOGO 广东工业大学计算机学院
2. 作为上下文语义的合法性检查的依据
通过符号表中属性记录可进行相应上下文的语义检查。
例如:在一个C语言程序中出现 int i[3,5]; //定义整型数组i
… float i[4,2]; //定义实型数组i,重定义冲突
… int i[3,5]; //定义整型数组i,重定义冲突
符号表构造举例(续2)
假设一个语言程序发现有下列3类符号及其所需之属性:
第1类符号 属性1 属性2 属性3 第2类符号 属性1 属性2 属性4 第3类符号 属性2 属性5 属性6
第三种造表方式:据符号 属性相似程度分类造若干
个表。
缺点:仍然存在可能的 存储空间浪费,需设计者 根据经验和要求进行选 择和调整.
符号变量的存储类别定义
这些变量出现的位置和次序
在符号表中用相对区头的位移量表示。
例如有以下程序段(C语言) … int a;
标识 类型 位置属
符
性
…
… float b;
a int
0
b float 4
…
d int
0
struct cc{ int d; float e; …
e float 4
在C语言的最新文本中增加了一个语法记号∷,使得可 以在函数内部显式地引用外部的同名变量。
上例可改写如下:
int a = 2;
int func (a, b)
float a = -1;
int b = 1;
{ …
引用float a
b = b + a;
b = b + ∷a…
}
引用int a
则b = ?2
LOGO
第九章
符号表
广东工业大学计算机学院
1
引言
符号表作为编译系统的重要设施,贯穿于文法分析、检 查和语义处理的编译全过程。
在编译程序中符号表用来存放源程序中出现的有关名字 的属性信息,这些信息集中反映了名字的语义特征属性。
符号表总体结构的设计和实现下列因素有关: 源语言的复杂性(包括词法结构、语法结构的复杂性)
int a;
// 外部定义的整型变量a
int func(a, b)
float a; // 函数内部定义的局部整型变量a,
int b;
{…
在函数func中可看
b = b + a; // 引用的是哪一个a? 到的是float a,
…
14
}
看不到int a。
LOGO 广东工业大学计算机学院
函数的形式参数(续)
① 符号名
② 符号的类型
③ 符号的存储类别 ④ 符号的作用域及可视性
⑤ 符号变量的存储分配信息
⑥ 符号的其它属性:数组内情向量、记Hale Waihona Puke 结构型 的成员信息、函数及过程的形参
11
LOGO 广东工业大学计算机学院
① 符号名
符号表中设置一个符号名域,存放该标识符,该域通 常就是符号表的关键字域。(书P205)
符号表中所登记的信息在编译的不同阶段都要用 到。例如:在词法分析及语法分析过程中不断更 新表中的信息,
另外,在词法分析到代码生成的各阶段则会从表 中获取不同的属性信息。
符号表的功能主要归结为以下几个方面: ① 收集符号属性 ② 作为上下文语义的合法性检查的依据 ③ 作为目标代码生成阶段地址分配的依据
22
LOGO 广东工业大学计算机学院
符号表构造举例(续3)
第3类符号 属性2 属性5 属性6
下面单独考察“第一,二类符号之符号表”
第1类符号 属性1 属性2 属性3 第2类符号 属性1 属性2 属性4
对第1类符号来说,属性值4栏 是冗余的,而对于第2类符号, 则属性值3栏是冗余的。
把属性值3和属性值4合并成属 性值34。
19
LOGO 广东工业大学计算机学院
1. 符号表构造举例
假设一个语言程序发现有下列3类符号及其所需之属性:
第1类符号 属性1 属性2 属性3
第2类符号 属性1 属性2 属性4
第3类符号 属性2 属性5 属性6
第一种造表方式:构造 等长表项的多个表
注意:各属性不一定等长
20
LOGO 广东工业大学计算机学院
12
LOGO 广东工业大学计算机学院
③ 符号的存储类别
大多数语言对变量的存储类别定义采用两种方式:
(1) 用关键字指定。
例如在C语言中用static定义是属于文件的静态 存储变量或属于函数内部的静态存储变量。
(2) 根据变量声明在程序中的位置来决定。
例如在C语言中,在函数体外定义的变量是缺省是 程序的公共存储变量,而在函数体内定义的变量 是该函数所独有的私有存储变量。
在当该表项符号是属第1类时,
C语言中可用UNION来实现。这样 属性值34中收集的是属性值3
的组织结构会增加符号表管理和运 行的复杂性,但减少了空间开销。
的值;若是第2类符号时,属 性值34中收集的是属性值4的
23
值。
LOGO 广东工业大学计算机学院
各种造表方式的优缺点比较
造表方式 第一种:构造等 第二种: 构造一张 第三种:据符号属性相 长表项的多个表 包括所有属性的表 似程度分类造若干个表
………………… …a…………… //第1次出现a …………b…… //第1次出现b …a…………… //第2次出现a …………d…… //第1次出现d …c…………… //第1次出现c …………b…… //第2次出现b
……
h:表头,是表的开始位置;
25 p:符号表当前的结束位置。
LOGO 广东工业大学计算机学院
…… 首先要确定其被分配的区域。例如,在C语言中有公
c
共区、文件静态区、函数静态区、函数运行时的动态
区等。
b
a 其次是根据变量出现的次序。通常使用在该区域中相 …… 对于区头的相对位置来决定该变量在某个区中所处的
具体位置。
动态区头位置
8
LOGO 广东工业大学计算机学院
本课内容
9.1 符号表的作用和地位 9.2 符号的主要属性及作用 9.3 符号表的组织 9.4 符号表的管理
符号表项的排列——排序组织及二分法
2. 排序组织及二分法
优点: 查找效率高 缺点:造表过程需要耗费较大的
代价(表项的比较和移动)
符号表中的表项按其符号的字符代码串(可以看成
一个整数值)的值的大小从大到小(或从小到大)排
列。
26
LOGO 广东工业大学计算机学院
符号表项的排列——散列组织
散列组织(哈希表)具有 较高的运行效率,因而 绝大多数编译程序中的 符号表采用散列组织。
从本例还可以看出,无论在后面两句中i的其它属性
与前一句是否完全相同,只要标识符名重定义,就将
产生重定义冲突的语义错误。
7
LOGO 广东工业大学计算机学院
3. 作为目标代码生成阶段地址分 配的依据
每个符号变量在目标代码生成时需要确定其在存储分 配中的位置(主要是相对位置)。
要确定一个变量在目标代码生成时的地址,需要:
关键在于采用适当的哈 希函数以及冲突解决办 法。
27
LOGO 广东工业大学计算机学院
3. 关键字域的组织
符号表的关键字域就是符号本身,它可以是 语言的保留字,操作符号或标识符(包括变量 名,函数名,记录结构标志等)。
关键字域的组织有两种方式:
(1) 等长关键字域(段)符号表
(2) 不等长关键字段符号表---采用关键字池 的索引结构。