第六章 符号表管理与语义分析
155
是在编译程序的工作过程中,建立并保持一系列的表格,如常数表、变量名表、数
组名表、过程名表以及标号表等,习惯上将它们统称为符号表或名字表。符号表的
每一登记项,将填入名字标识符以及与该名字相关联的一些信息。这些信息,全面
的反映各个符号的属性及它们在编译过程中的特征,诸如名字的种属(常数、变量、
数组、标号等),名字的类型(整型、实型、逻辑型、字符型等),名字的特征(当
前是定义性出现还是使用性出现等),给该名字分配的存储单元地址以及与该名字的
语义有关的其他信息等等。符号表中的各类信息将在编译程序工作过程中的适当时
候填入。对在语义分析阶段建造符号表的编译程序,当遇到标识符声明部分时,每
当遇到一个名字声明,就以此名字查符号表;若表中无此登记项,则将该名字填入
表中;若该表中已有此登记项,则说明该名字是重复声明,报告语义错误。至于与
该名字相关的一些信息,可视工作的方便,分别在编译程序工作过程中的适当时候
填入:种属,类型,特征等信息可在语义分析阶段完成;名字的存储地址等信息则
要在代码生成阶段完成。几乎在编译程序工作的全部过程中,都需要对符号表进行
频繁的访问,查表和填表等操作,是编译程序的一笔很大的开销。因此,合理地组
织符号表,并相应地选择好查表和填表的方法,是提高编译程序工作效率的重要一
环。
6.2.1 符号表的内容
一般而言,即使对于同一类符号表,例如变量名表,它的结构以及表中的每一
登记项所包含的内容,由于程序设计语言和目标计算机的不同,都可能有较大差异。
然而抽象地看,各类符号表一般都具有如表 6.1 所示的形式。由表 6.1 可以看出,符
号表的每一记录项都由两个数据项组成:第一个数据项为名字,用来存放标识符;
第二个数据项为信息,一般由若干子项(或域)组成,用来记录与该名字相对应的
各种属性和特征。
名字项 信息项
Name1 Name1_info
Name2 Name2_info
…… ……
Namen Namen_info
表 6.1 符号表的结构
对于标识符的长度有限制或长度变化范围不大的语言而言,每一登记项名字栏
的大小可以取标识符的 大允许长度。例如,SNL 语言规定每个标识符 多可包含
10 个字符,因此可用 10 个字符的空间作为名字栏的长度。
在源程序中,由于不同种属的标识符起着不同的作用,因而相应于各类标识符
所需记录的信息也就可能有很大的差异。如果根据标识符的不同种属,在编译程序
中分门别类地组织多种表格,如常数表、变量名表、数组名表、过程名表、标号表
等等,对于表格的使用将非常方便。但是,如果能合理组织符号表信息项各个子项
所存信息的内容(例如适当地增加标志位),则在编译程序中为各类标识符设置一张
1