文档介绍:第9章 符号表
在编译程序工作的过程中,需要不断收集、记录、查证和使用源程序中的一些语法符号(简称符号)的类型和特征等相关信息。
为方面起见,一般第9章 符号表
在编译程序工作的过程中,需要不断收集、记录、查证和使用源程序中的一些语法符号(简称符号)的类型和特征等相关信息。
为方面起见,一般的做法是让编译程序在其工作过程中,建立并保存一批表格,如常数表、变量名表、数组内情向量表、过程或子程序表以及符号表等,这些表格统称为符号表或名字表。
符号表中每一项包括两个部分,一部分填入名字(标识符);另一部分是与次名字有关的信息。这些信息将全面反映各个语法符号的属性以及它们在编译过程中的特征。
几乎在编译程序工作的全过程中,都需要对符号表进行频繁的访问。访问符号表所耗费的时间在整个编译过程中占有很大的比例。因此,合理地组织符号表并相应选择好的查、填表方法,是提高编译程序工作效率的有效方法。
通常有三种符号表构造和处理方法:
线性查找法
二叉树法
杂凑技术
符号表的功能
收集符号属性
上下文语义的合法性检查的依据
作为目标代码生成阶段地址分配的依据
符号表的作用和地位-----语义检查的依据目标代码生成阶段地址分配的依据
在编译程序中符号表用来存放语言程序中出现的有关标识符的属性信息,符号表中所登记的信息在编译的不同阶段都要用到。
在语义分析中,符号表所登记的内容将用于语义检查(如检查一个名字的使用和原先的说明是否一致)和产生中间代码。
在目标代码生成阶段,当对符号名进行地址分配时,符号表是地址分配的依据。对一个多遍扫描的编译程序,不同遍所用的符号表也往往各有不同。因为每遍所关心的信息各有差异。
在整个编译期间,对于符号表的操作大致可归纳为五类:
• 对给定名字,查询名字是否已在表中;
• 往表中填入一个新的名字;
• 对给定名字,访问它的某些信息;
• 对给定名字,填写或更新它的某些信息;
• 删除一个或一组无用的项。
不同种类的表格所涉及的操作往往也是不同的。上述五个方面只是一些基本的共同操作。
符号属性(信息)
几种通常都是需要的。
1 符号名
2 符号的类型
3 符号的存储类别
4 符号的作用域及可视性
5 符号变量的存储分配信息
6 符号的其它属性 (1) 数组内情向量
(2) 记录结构型的成员信息 (3) 函数及过程的形参
符号表的组织
总体组织和表项属性信息组织
第一种: 把属性种类完全相同的那些符号组织在一起,构造出表项是分别为等长的多个符号表
第二种: 把所有语言中的符号都组织在一张符号表中。组成一张包括了所有属性的庞大的符号表
第三种折衷方式是根据符号属性相似程度分类组织成若干张表,每张表中记录的符号都有比较多的相同属性。
符号表项的排列
符号表作为一个多元组,表中元组的排列组织是构造符号表的重要成分。在编译程序的整个工作过程中,符号表被频繁地用来建立表项,找查表项,填充和引用表项的属性。因此表项的排列组织对该系统运行的效率起着十分重要的作用。在编译程序中,符号表项的组织传统上采用三种构造方法。即线性法,二分法及散列法。
关键字域的组织
符号表的关键字域(段)就是符号名称
等长关键字域(段)符号表
不等长关键字段符号表---采用关键字池的索引结构。
分程序结构的符号表
对于具有分程序型结构的语言程序,不同层次分程序中定义的标识符号具有不同的作用域和不同的可视性规则。通常对于具有分程序结构的语言可用两种方式组织它们的符号表: 一是对每个分程序建立一个独立的分表结构的符号表;一是把各分程序符号组织在一张单表结构的符号表中
分表结构的组织管理
其基本思想是,每当编译程序扫描到一个分程序结构开始时,为该分程序建立一张符号表,在该分程序中定义的标识符,都被登录在该符号表中。而当编译程序扫描到一个分程序的结束时,编译程序释放为该分程序所建立的符号表。这种符号表的分表结构与源程序的分程序层次结构一一对应
单表结构的组织管理
其基本思想是,所有分程序中定义的标识符都集中在单张符号表中。为了实现分程序构造中标识符的作用域和可视性规则的要求,在符号表中可设立一个属性域用来登录符号所在分程序的层次
进入分程序时,,层次降低一层,且需要把符号表中,所有在退出的分程序中登录的符号项清除。
嵌套结构型程序设计语言(Pascal)的特点,可采用的办法:
.将其符