第4章 符号表
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、符号表的表长是渐增变化的情况
线性组织和二分法组织的符号表初始化方法 只需将表尾推向表头即可。
2、符号表的表长是确定的情况
散列组织的符号 表,表长并不反 映已登录的表项 个数,其表长通 常是确定的,对 这类符号表的初 始化方法,需要 将表中全部表项 值清除。
二、符号的登录(填表)
当编译程序从语言程序中获得一个标识符符号 并确定该符号在符号表中尚不存在时,就要将 此符号登录到符号表中。 登录符号到符号表中,首先要确定登录的位置。
二、符号表项的排列
在编译程序中,符号表项的组织传统上采用三 种构造方法。即线性法,二分法及散列法。
1、线性组织
这种方法规定符号表中表项按它的符号被扫描 到的先后顺序登录。
符号
h
A
B
D
C
p
属性
2、排序组织及二分法
排序组织的符号表,就是在符号表中的表项按 其符号的字符代码串(可以看成一个整数值) 的值的大小从大到小(或从小到大)排列的。
在编译程序中符号表用来存放语言程序中出现 的有关标识符的属性信息,这些信息集中反映 了标识符的语义特征属性。本章目的使学生深 刻全面地了解符号表的地位和作用;掌握符号 表的组织和管理方法;以及编译过程中符号表 的操作活动过程。
【难重点】
◇ 符号表总体组织的选择原则。 ◇ 变量的类型和存储类别等属性的重要性。 ◇ 采用单表结构时,如何解决分程序构造中同名名
(单词类别,单词自身的值)。 单词的类别是语法分析需要的信息,而单词自身的值则是编译其它阶段 需要的信息。 对于标识符来说,还需要记载它的类别、层次还有其他属性,如果这些 属性统统收集在符号表中,那么可以将单词的二元式表示设计成如下形 式(标识符,指向该标识符所在符号表位置的指针)
复习
例 :对语句if i=5 then x:=y的词法分析结果
符号表中所登记的信息在编译的不同阶段都要 用到。不论编译策略是否分趟,符号表的作用 和地位是完全一致的。 – 收集符号属性 – 上下文语义的合法性检查的依据 – 作为目标代码生成阶段地址分配的依据
1、收集符号属性
编译程序扫描说明部分收集有关标识符的属性, 并在符号表中建立符号的相应属性信息。 例如 – int A; – float B[5]; A的属性:是一个整型变量;B的属性:一个 具有5个浮点型元素的一维数组。
第4章 符号表
编译原理课程组 计算机工程学院
第4章 符号表
4.Biblioteka Baidu 符号表的作用和地位 4.2 符号的主要属性及作用 4.3 符号表的组织 4.4 符号表的管理
思考题
1. 什么是符号表? 2. 标识符符号通常有那些属性? 3.你认为符号表是怎样进行组织的? 4.你认为符号表是怎样进行管理的?
【学习目标】
符号表的操作主要为查表和填表。
4.2 符号的主要属性及作用
不同的语言定义的标识符属性不尽相同,我们主要讨论符号 表中的标识符一般设置的属性项目以及它们的功能。
1、符号名:符号表中符号名作为表项之间的唯一区别一般不允许重名。 允许操作重载的语言中,函数名、过程名是可以重名的,对于这类 重载的标识符要通过它们的参数个数和类型以及函数返回值类型来 区别,以达到它们在符号表中的惟一性。
关于排序表的表项建立及符号查找,通常采用
"二分法"。 符号
属性
h
A
B
C
D
p
3、散列组织
一个符号在散列表中的位置,是由对该符号 (即字符代码串)进行某种函数操作(通常称 为“杂凑函数”)所得到的函数值来确定的。 所得到的函数值与该表项在表中位置的对应关 系,是通过对函数值的“求整”以及相对于表 长的“求余”得到的。
– 保留字if
(3,‘if’)
– 标识符i
(1,指向i的符号表入口)
– 等 号=
(4,‘=’)
– 常 数5
(2,‘5’)
– 保留字then
(3,‘then’)
– 标识符x
(1,指向x的符号表入口)
– 赋值号:=
(4,‘:=’)
– 标识符y
(1,指向y的符号表入口)
– 分 号;
(5,‘;’)
一、符号表的作用和地位
4.2 符号的主要属性及作用
6、其它属性
数组内情向量 (数组类型,维数,各维的上、下界,数组首地址) 记录结构型的成员信息 函数及过程的形参
4.3 符号表的组织
符号表的组织直接关系到语义功能的实现和语 义处理的时空效率。 关于符号表的组织可从符号表的总体组织和表 项属性信息组织来分别讨论。
一、符号表的总体组织
…a…
} } }
图中第3层所引用的a,既 不是第4层的float a;也 不是第1层int a;而是第 2层char a
4.2 符号的主要属性及作用
5、存储分配信息
根据符号变量的存储类别定义及它们出现的位置和次 序来确定每一个变量应分配的存储区及在该区中的具 体位置,用相对区头的位移量表示。 通常一个编译程序有两类存储区: – 静态存储区 – 动态存储区
符号 属性值2 属性值5 属性值6
第一种组织方法得到三张符号表,如下图所示:
第二种组织方法得到一张符号表,如下图所示:
3、第三种方法
第三种折衷方式是根据符号属性相似程度分类 组织成若干张表,每张表中记录的符号都有比 较多的相同属性。
按折衷方式重新组织上例中的三类符号,可构成 二张符号表如图所示:
4.4 符号表的管理
符号表的行为通常主要是符号表的初始化、符 号的登录、符号的查找和有关分程序结构的符 号表层次管理。 对符号表的这些管理除初始化之外,都是动态 进行的。
一、符号表的初始化
符号表的初始化,就是在对语言程序开始编译 的时刻,定义建立符号表的初始状态。 符号表的不同组织方法,要求不同的初始化方 法。编译开始时符号表的状态应该是没有任何 可视标识符的状态。反映这种状态的方式通常 有以下两种情况:
2、上下文语义的合法性检查的依据
通过符号表中属性记录可进行相应上下文的语义检查。
例如:在C语言中同一个标识符可作引用说明也可作定义说明
…… int i [3][5]; //定义说明i
语义检查可发现
…… extern float i; //引用说明i
其不一致错误。
……
又例如:在C语言中同一个标识符可作引用说明也可作定义说明
2、符号的类型:符号表中设置一个符号类型域,存放该符号的类型。
3、存储类别:存储类别定义采用二种方式,一种是用关键字指定(例 如C语言中用Static定义是属于文件的静态存储变量或属于函数内部 的静态存储变量,用regist定义使用寄存器存储的变量);另一种方 式是根据定义变量说明在程序中的位置来决定。(例如C语言中,在 函数体外默认存储类关键字所定义的变量是外部变量,而在函数体 内默认存储类关键字所定义的变量是内部变量)
4.2 符号的主要属性及作用
4、作用域及可视性 一个符号变量在程序中起作用的范围,称谓其作用域。 一般来说,定义该符号的位置及存储类关键字决定了 该符号的作用域。 一般来说变量的作用域就是该变量可以出现的场合, 也就是说在某个变量作用域范围内该变量是可引用的, 这就是变量可视性的作用域规则。 变量可视性不仅仅取决于它的作用域,还有两种情况 影响到一个变量的可视性。 – 函数的形式参数 – 分程序(或复合语句)结构
复习
词法分析程序的功能是读入源程序,输出单词符号。 单词符号是一个程序设计语言的基本语法符号,一般分为下列五种: – 保留字,关键字:如if, else, while等 – 标识符:变量名、程序名、函数名等 – 常数(量) – 运算符 – 界符 词法分析程序所输出的单词符号常常采用以下二元式表示:
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 符号的主要属性及作用
字声明的可视性规则。
【知识结构】
4.1 符号表的作用和地位
什么是符号表? 在编译过程中,编译程序用于记录源程序中各 种名字的特性信息, 所以也称为名字特性表。 名字: 程序名、过程名、函数名、用户定义类 型、变量名、符号名字。 特性信息:名字种类、类型、维数、参数个数 及目标地址(存储单元地址)等。
符号表属性域的组织,根据属性性质大致分成 两类: 等长属性值域组织 不等长属性值域的组织
五、下推链域的组织
在程序语言的结构中,分程序的分层结构允许 同名标识符具有的生存期发生重叠。为实现这 种同名标识符的语义功能,符号表中需要设立 下推链域的组织。 下推链域组织要求在进入一个内层结构并发生 重名标识符定义时,需把当前符号表中外层的 该符号表项下推到下推链中而在符号表被下推 的表项处建立内层的同名标识符的表项。
1)函数的形式参数:影响变量可视性的举例(1)
int a; int func (a, b) float a; int b; {
… … a…//引用float a …∷a…//引用int a }
4.2 符号的主要属性及作用
2)分程序(或复合语句)结构;影响变量可视性的举例
… {int a;
… {char a; … { … {float a; … }
其次,是根据变量出现的次序。 一般说来,决定变量在某个区中所处的具体位置,这通 常使用在该区域中相对区头的相对位置来确定。 而有关 区域的标志及相对位置都是作为该变量的语义信息被收 集在该变量的符号表属性中。
二、符号表的操作
往表中填入一个新的名字; 对给定名字,查询名字是否已在表中; 对给定名字,访问它的某些信息; 对给定名字,填写或更新它的某些信息; 删除一个或一组无用的项。
符号表的基本结构如下:
符号
属性
一、符号表的总体组织(1)
1、第一种方法 把属性种类完全相同的那些符号组织在一起,构造出 表项是分别为等长的多个符号表。
2、第二种方法 把所有语言中的符号都组织在一张符号表中。 假设有下列三类符号及其所需之属性。 符号 属性值1 属性值2 属性值3
符号 属性值1 属性值2 属性值4
五、下推链域的组织
符号
内情向 量指针 型
层次
下推 指针
… int 3 …
… int 0 … … int 1 … … int 2 …
… int i; …………………(0) func() {
…; float i;…………….(1) …; { …;
int i[5];…………(2) …; { …;
int i;………….(3) … } … } … }
存放字符串0结5束1标0志1"5凵2"的0 ,25这是C语言处理所需要的)。 30
第0字节 关键字段
第32字节
不等长关键字段符号表
由于程序中标识符长短不一,有时可能差别很大,用等 长结构会产生溢出或冗余。希望既保证关键字段的等长, 又要减少甚至消除冗余,可采用关键字池的索引结构。
四、其他域的组织
三、关键字域的组织
符号表的关键字域就是符号本身,它可以是语 言的保留字,操作符号或标识符(包括变量名, 函数名,记录结构标志等)。 – 等长关键字域(段)符号表 – 不等长关键字段符号表——关键字池组织
等长关键字域(段)符号表
•编译程序中标识符的内部规则是符号表关键字组织的基础和依据。 •用户程序中的标识符,考虑到习惯和可读性,长度是从1到内部规则 规定长度之间任意字符个数。 •符号表中存放标识符的关键字段等长,具有统一的最大长度。譬如C 语言的关键字段长度可以是32个(其中31个是存放名字,余一个是
线性符号表登录前后
首先要在符号表中创立一个新的表项,通常该表的尾指针指向的表项 作为新创建的表项,而尾指针推向下一个备用表项。对于线性组织的符号 表,该新创建的表项就是登录符号的表项。
排序符号表登录前后
Symbol k
三、符号的查找
每当编译程序从语言源程序获得一个符号,首 先要确定该符号的类别。根据类别分别在相应 的符号表中进行查找。 查找符号表的目的是建立或确认该符号的语义 属性。 符号表的查找算法,与该符号表的组织方法密 切相关。
……
int i [3][5];
……
重定义冲突的语义错误。
float i[4][2];
……
int i [3][5];
3、作为目标代码生成阶段地址分配的依据
每个符号变量在目标代码生成时需要确定其在 存储分配的位置(主要是相对位置)。
首先,要确定其被分配的区域。 例如,在C语言中首先要确定该符号变量是分配在公共区 (extern)、文件静态区(extern static)、函数静态区 (函数中static)、还是函数运行时的动态区(auto)等。