编译原理 符号表1

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

是否含有内层分程序,也不论内分程序在嵌套多少层,只要在内
层分程序未再次对该标识符加以说明,则此标识符在整个分程序中 均有定义,且有相同的属性。
(2)程序中的标号局限于定义该标号的最小分程序。 (3)由于Pascal程序中的过程可具有嵌套的结构,因此,可将每 一过程说明都假想为一个分程序。出现在过程体中的非形式 参数, 依其在相应的过程体中被说明与否,确定它们对过程而言是局部变 量还是非局部变量,而形式参数则总是局限于相应 的过程体的。 PASCAL程序中的标识符(或标号)的作用域,总是与说明(定义) 这些标识符的分程序的层次相联系的。
2、过程:
(1)是否为程序的外部过程; (2)若为函数,应指出它的类型;
(3)其说明是否处理过;
(4)是否递归定义; (5)形式参数是些什么?为了与实在参数进行比较, 必须把它们 的种属、类型信息同过程名联系在一起。 例 8.2 p235
例:图8.10 P232
Exercise:p236 1,2,3,7
栏和标志位,用来记录与该项名字相对应的种种不同属性。 操作:对于符号表的访问可概括为如下几类操作:
(1)对给定名字,查询此名是否已在表中; (2)往表中填入一个新名字; (3)对给定名字,访问它的相关信息; (4)对给定名字,往表中填写或更新它的某些信息;
(5)从表中删除一个或一组名字。 符号表组织方式:
简单方式:固定二维表 间接方式:使用主表指针+独立的字符串数组(标识符名)
NAME INFORMATION 二、符号表的组织方式 符 号 • 1、各项各栏所占存储单元的长度固定 表 • 的 2、间接方式安排名字栏
结 构 6 s a m p l e 4 l o o p
NAME
INFORMATION
•, 6 •, 4

a

内情向量表
维数
界差d1 ••• 界差dn 上界I1 ••• 上界In
首地址
下界U1 ••• 下界Un
一张可容纳N项的符号表在存储器中的两种表示方式: (1)把每一项置于连续的K个存储单元中,从而给出一
张K*N个存储单元的表。
( 2 ) 把整个符号表分成 M 个子表,每个子表含 N 项。假
定子表Ti的每一项所需的字数为Ki,那么,K=K1+…+Km。 对于任何 i,T1[i],…Tm[i] 的并置就构成符号表第 i 项的全部 内容。 K=K1+K2+K3+K4
available n1
杂凑表
0
Information … …
Link null
1
SYM1

h
Байду номын сангаас

available
… n1
… n2 …
n2
n2 null n3 n1 …
available n3
SYM2 … SYM3 …
N-1
available
8.3名字的作用范围
只局限于该过程,离开了所在的过程就无意义了。也就是说,
同杂凑值的符号名连接成一条链。 3、填入一个新的项的过程: (1)先计算出H函数的值h(在0与N-1之间),将HASHTABLE[h]
的值赋给P(若未曾有杂凑值为h的项名填入过,则将P置空)。 (2)然后将指针指向HASHTABLE[h],再把新名及其链接指示 器的值P填进指针所指向的符号表位置。 4、使用此方法的查表过程如下: 首先计算出此项的函数H的值等于h,然后就指示器 HASHTABLE[h]所指的项链逐一按序查找(线性查找)
在符号表中,表示局部名字用一个二元组:< 名字,过程编号 >
对一个名字查找符号表的原则:
只有当表项中的名字的字符逐个匹配,并且该记录相关的编号 和当前所处理的过程的编号匹配时,才能确定查找成功.
一、Pascal的符号表组织 1、在Pascal程序中标识符的作用域是包含说明该标识符的一个最
小分程序。具体的概括为如下几点: (1)如果一个标识符在某一分程序首部已作说明,则不论此分程序
top
9 8
sp top sp
f e B3 d c B2 b a
栈符号表

0 8
7

… …
6
5 4
0
6 0 5 0 0 3 7 4 level
top

… …
3
2
level
sp
1

2
1
DISPLAY
level level
8.4
符号表的内容
对于变量名、数组名和过程名,它们的信息栏中一般要求有以下信 息: 1、变量:
2、对于嵌套结构型程序设计语言(Pascal)的特点,可采用如下 办法: (1) 针对符号表设计为栈符号表,新名字出现总是从栈顶填入。 为了保证从内层向外层查,查找操作从符号表的栈顶往底部查找。
(2)过程的嵌套层次表(display),是引入的一个显示层次关系 表。其作用是为了描述过程的嵌套层次,指出当前正在活动着的各 嵌套的过程(或函数)相应的子符号表在栈符号表中的起始位置 (相对地址)。 Display表也是一个栈,栈顶为level,用来指示层 次,即指向当前的最内层过程的子符号表在栈符号表中的起始位置。 (3)在符号表的信息栏中引入一个指针域(previous),用来链接 它在同一个过程内的下一名字在表中的下标(相对位置)。每一层 最后一个域名字,指针域之值为0。这样每当需要查找个新名字时, 就能通过display表找出当前正在处理的最内层的过程及所有外层的 子符号表在栈符号表中的位置。然后通过指针域可以找到同一个过 程内的所有被说明的名字。
二、对折查找与二叉树
在造表的同时把表格中的项按名字的“大小”顺序整理排列。 所谓名字的“大小”通常是指名字的内码二进制。 对于经顺序化的表格的查找可用对折法。
顺序化的线性符号表 项数 NAME INFORMATION 1 2 3 4 BC I ••• •••
对折法的查找方法如下: (1)首先把要查找的项和中项
s a m p l e l o o p
符号表
如果各种名字所需的信息(INFORMATION )空间长短不一, NAME INFORMATION
••• 地址 那么,我们可把一些共同属性直接登记在符号表的信息栏中, CAT
• 而把某些特殊属性登记在别的地方,并在信息栏中附设一指示
器,指向存放特殊属性的地方。 特殊属性的登记:例如:对 于数组标识符 专门开辟一个信息表区,即为 数组信息表也称为内情向量表 在符号表的地址栏中存入符号 表与内情向量表连接入口地址
折叠法、除留余数法、随机数法
4、解决地址冲突的办法: 开放地址法、再哈希法、链地址法(p228)、 建立一个公共溢出区
杂凑技术:使用一张杂凑链表通过间接方式查添符号表。 将具有相同杂凑值符号名连成一串,便于线性查找。杂凑表是一
个可容纳N个指示器值的一维数组,它的每个元素的初值全为null。 符号表除了通常包含的栏外,还增设了一链接栏,他把所有持有相
1 J1 ••• (左枝),令一栏为 RIGHT (右枝)。每个结点的主栏内码值被 0 XYZ 0 0 • BC 0 2 XYZ ••• 看成是代表该结点的值。要求:任何结点 P右枝的所有结点值均应 3 BC ••• 4的值,而左枝的任何结点值均应大于结点 I ••• 小于结点P P0 的值。 I 0 AVAILABLE
SYM1 SYM3 SYM2
p=HASHTABLE[h]=null p=HASHTABLE[h]= p=HASHTABLE[h]=n1 n2 HASHTABLE[h]=AVAVILABLE=n2 HASHTABLE[h]=AVAVILABLE=n1 HASHTABLE[h]=AVAVILABLE=n3 H H( (SYM2 SYM1) )=h =h SYM3 符号表 Name …
三、杂凑技术
1、假定有一个足够大的区域,这个区域用来填写一张含N项的符号 表。构造一个地址函数H,对任何名字,H函数的取值于0至N-1之间 即不论对此项查表或填表,都能从H函数中获得它在表中的位置。 2、对地址函数H有两点要求: (1)函数的计算要简单、高效; (2)函数值能比较均匀的分布在0至N-1之间。 3、构造函数H的办法: 直接地址法、数字分析法、平方取中法、
(1)类型(整、实、双实、布尔、字符、复、标号或指针等); (2)种属(简单变量、数组或记录结构等); (3)长度(所需的存储单元数);
(4)相应对数(存储单元相对地址);
(5)若为数组,则记录其内情向量; (6)若为记录结构,则把它与其分量按某种形式联系起来; (7)形式参数标志; (8)是否对这个变量进行过赋值(包括出现在输入名表中)的 标志位。
1、线性表介绍 平均查找次数 n/2
项数 NAME
1 2 3 4 AVAILABLE J1 XYZ I BC
线性符号表 INFORMATION ••• ••• ••• •••
2、提高查找效率的办法:给每一项附设一个指示器,这些指示器 把所有的项按“最新最近”访问原则连接成一条链,这条链的第一 个元素所指的项是最新最近被查询过的项,第二个元素所指的项是 次新近被查询过的项,诸如此类。每当填入新项时,总让链头指向 最新项,含有这种链条的线性表叫做自适应线性表。
第八章
符号表
8.1符号表的组织与作用--编译过程符号表的作用
一、符号表的作用-遇到名字查表、登记、修改
目的:合理地组织符号表。 构成:符号表的每一项包含名字栏和信息栏。表格形式如下所示:
名字栏(Name)
第一项
(入口1) 第二项 (入口2)
信息栏(Information)
……
第n项
(入口n)
……
名字栏用来存放标识符或其内部码;信息栏包含许多子
例:
procedure…//B1
var a,b:real;
procedure…//B2 var c,d:real; procedure…//B3 var e,f:real;
begin …
end; begin … end; begin…
end;
Name
11
10
Information Previous
(即第[n/2]+1项)作比较,若
相等,则宣布查找成功。
J1 XYZ
••• •••
(2)若要查找的项小于中项, AVAILABLE 平均查找次数 1+log2n
则继续在1~[n/2]的各项中去查找。
(3)若要查找的项大于中项,则 就到 [n/2]+2~n 的 各 项中去查找 。
把符号表组织成一棵二叉树(二叉排序树) LEFT RIGHT 令每项是一个结点,每个结点附设两个指示器栏,一栏为 0 • J1 LEFT 0 项数 NAME INFORMATION •

二叉树的形成过程如下: 令第一个碰到的名字作为“根”结点,它 的左、右指示器均置为 空,当要加入新结点时,首先把它和根结点的值作比较,小者放在 右枝上,大者放在左枝上。如果根结点的左(右) 枝已成子树, 则让新结点和子树的根再作比较。重复上述步 骤,直至把新结点 插入使它成为二叉树 的一个端末结点(叶)为止。
T1
N1 N2 N3
K1
T2 K2
T3 K3
T4 K4
例8.1 FORTRAN符号表
程序段: SUBROUTINE INCWAP(M,N) 10 K=M+1 M=M+4 N=K RETURN END 主要表格见p225
8.2 整理与查找
符号表的三种构造法和处理法: 线性查找、二叉树、杂凑技术。
一、线性表
同一个标识符,具有不同的性质,要求分配不同的存储空间。 这样,如何组织符号表,使的同一个标识符在不同的作用域中 能得到正确的引用,而不会产生混乱。
对于过程嵌套结构型的程序设计语言,每层过程中说明的名字
通常实现最近嵌套作用域规则的办法是:对每个过程指定一个
唯一的编号,即过程的顺序号,以便跟踪过程里的局部名字。
相关文档
最新文档