编译原理chapter8符号表(2016)分析
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
...
...
...
n1
available
SYM1
...
n2 SYM2
available
...
n3 SYM3
...
NULL
...
...
n1
...
...
...
n...2
编译原理
8.3 名字的作用范围
chapter8 符号表
最近嵌套作用域规则:即对每个过程指定一个唯一的 编号,以便跟踪过程里的局部名字。
(1)对给定名字,查询此名是否已在表中; (2)往表中填入一个新名字; (3)对给定名字,访问它的相关信息; (4)对给定名字,往表中填写或更新它的某些信息; (5)从表中删除一个或一组名字。
编译原理
chapter8 符号表
符号表的组织方式NAME
INFORMATION
1、各项各栏所占•存储单元的长度固定 2、间接方式安排•名字栏
(2)若要查找的项小于中项,则继续在1〜[n/2]的各项 中去查找。
(3)若要查找的项大于中项,则就到[n/2]+2〜n的各项 中去查找。
平均查找次数 1+log2n
编译原理
chapter8 符号表
二叉树的形成过程如下:
令第一个碰到的名字作为“根”结点,它的左、右 指示器均置为空,当要加入新结点时,首先把它和根 结点的值作比较,小者放在右枝上,大者放在左枝上。 如果根结点的左(右) 枝已成子树,则让新结点和子 树的根再作比较。重复上述步 骤,直至把新结点插入 使它成为二叉树的一个端末结点(叶)为止。
让链头指向最新项,含有这种链条的线性表叫做自适应线性表。
编译原理
二、对折查找与二叉树
chapter8 符号表
在造表时把表格中的项按名字的“大小”顺序整理排列。
所谓名字的“大小”通常是指名字的内码二进制。 对于经顺序化的表格的查找可用对折法。
对折法的查找方法如下:
(1)首先把要查找的项和中项(即第[n/2]+1项)作比 较,若相等,则宣布查找成功。
2)过程的嵌套层次表(display),是引入的一个显示 层次关系表。其作用是为了描述过程的嵌套层次,指出 当前正在活动着的各嵌套的过程(或 函数)相应的子 符号表在栈符号表中的起始位置(相对地址)。
display表本身也是一个栈,每进入一个新的过程 (或函数),栈顶指针增1;每退出一个新的过程(或 函数),栈顶指针减1。栈顶指针总是指向当前正在处 理的最内层的过程在栈符号表中 的起始位置。
3、构造函数H的办法:直接地址法、数字分析法、 平方取中法、折叠法、除留余数法、随机数法
4、解决地址冲突的办法:开放地址法、再哈希法、 链地址法、建立一个公共溢出区
编译原理
chapter8 符号表
杂凑技术:使用一张杂凑链表通过间接方式查填符号表。
将具有相同杂凑值符号名连成一串,便于线性查找。 杂凑表是一个可容纳N个指示器值的一维数组,它的 每个元素的初值全为null。符号表除了通常包含的栏 外,还增设了一链接栏,他把所有持有相同杂凑值的 符号名连接成一条链。
填入一个新项的过程: (1)先计算出H(SYM) 的函数值h(在0与N-1之间),
将Hashtable[h]的值赋给P(若未曾有杂凑值为 h的项名填入过,则将P置NULL)。 (2)然后将指针指向Hashtable[h],再把新名及其 链接指示器的值P填进指针所指向的符号表位置。
编译原理
chapter8 符号表
编译原理
chapter8 符号表
Chapter8 符号表
编译原理
chapter8 符号表
8.1 符号表的组织与作用 8.2 整理与查找 8.3 名字的作用范围 8.4 符号表的内容
编译原理
chapter8 符号表
符号表的作用
一张符号表的每一项(或称入口)包含两大栏(或称 区段、字域),即名字栏和信息栏。表格形式如下所示:
编译原理
chapter8 符号表
2、函数:
(1)是否为程序的外部函数; (2)应指出它的类型; (3)其说明是否处理过; (4)是否递归定义; (5)形式参数?为了与实在参数进行比较, 必须把它们
的种 属、类型信息同过程名联系在一起。
附设一指示器,指向存放特殊属性的• 地方。
例如:对于数组标识符
•
a
•
专门开辟一个信息表区,即为 数组信息表也称为内情向量表
在符号表的地址栏中存入符号 表与内情向量表连接入口地址
内情向量表
维数
首地址
界差d1
•••
界差dn
上界I1
下界U1
•••
•••
上界In
下界Un
编译原理
8.2 整理与查找
chapter8 符号表
编译原理
chapter8 符号表
3)在信息栏中引入一个指针域(previous),用来链 接它在同一个过程内的下一名字在表中的下标(相 对位置)。每一层最后一个域名字,指针域之值为0。 这样每当需要查找个新名字时,就能通过display表 找出当前正在处理的最内层的过程及所有外层的子 符号表在栈符号表中的位置。然后通过指针域可以 找到同一个过程内的所有被说明的名字。
编译原理
fun3() {
int e,f; } fun2() {
int c,d; fun3(); } fun1() { int a,b; fun2(); }
10
top
9
8f
0
tsopp 7 e
8
6 fun3
0
5d
6
tsopp 4 c
5
3 fun2
0
2b
3
sp 1 a
2
Name Information
在符号表中,表示局部名字用一个二元组: < 名字,过程编号 >
对一个名字查找符号表是:只有当表项中的名字其字 符逐个匹配,并且该记录相关的编号和当前所处理 的过程的编号匹配时,才能确定查找成功.
编译原理
chapter8 符号表
嵌套结构型程序设计语言的符号表:
1) 针对符号表设计为栈符号表,新名字出现总是从栈 顶填入。为了保证从内层向外层查,查找 操作从符号表 的栈顶往底部查找。TOP指向栈顶第一个可用单元,P 总是指向最新子符号表首地址。
符号表的三种构造法和处理法:
线性查找、 二叉树、 杂凑技术。 项数 NAME
1 J1
一、线性表
2 XYZ
1、线性表介绍
平均查找次数 n/2
3I 4 BC
AVAILABLE
线性符号表 INFORMATION
••• ••• ••• •••
2、一种提高线性表查找效率的办法:给每一项附设一个指示器, 这些指示器把所有的项按“最新最近”访问原则连接成一条链,这 条链的第一个元素所指的项是最新最近被查询过的项,第二个元素 所指的项是次新近被查询过的项,诸如此类。每当填入新项时,总
编译原理
chapter8 符号表
三、杂凑技术
1、假定有一个足够大的区域,这个区域用来填写一 张含N项的符号表。构造一个地址函数H,对任何名 字,H函数的取值在0至N-1之间。即不论对此项查表 或填表,都能从H函数中获得它在表中的位置。
2、对地址函数H有两点要求: (1)函数的计算要简单、高效; (2)函数值能比较均匀的分布在0至N-1之间。
SYM123 H(SYM123)=h P=Hashtable[h]=nN12ULL
Hashtable[h]=available=n123
Hashtable
符号表
0 NULL
1 NULL
...
...
N-1 NULL
available
Name Information Link
6 s a mp l e 4 l o o p
NAME •, 6 •, 4
INFORMATION
s a mp l e l o o p
编译原理
chapter8 符号表 符号表
如果各种名字所需的信息(INNFAOMREMATINOFNOR)M空AT间IO长N短
不一,那么,我们可把一些共同属性直接C登A记T 在符• •号• 表的地信址 息栏中,而把某些特殊属性登记在别的地方,并在信息栏中
名字栏(Name) 信息栏(Information)
第一项 (入口1)
第二项 (入口2)
第n项 (入口n)
……
……
编译原理
chapter8 符号表
名字栏用来存放标识符或其内部码;信息栏包含 许多子栏和标志位,用来记录与该项名字相对应的种种 不同属性。
在整个编译期间,对于符号表的访问可概括为如 下几类操作:
栈符号表
chapter8 符号表
level level
7 level 4 1 level
Display表
编译原理
8.4 符号表的内容
chapter8 符号表
对于变量名、数组名和函数名,信息栏中一般要求有以下信息:
(1)类型(整、实、双实、字符、指针等); (2)种属(简单变量、数组或结构体等); (3)长度(所需的存储单元数); (4)相对数(存储单元相对地址); (5)若为数组,则记录其内情向量; (6)若为记录结构,则把它与其分量按某种形式联系起来; (7)形式参数标志; (8)是否对这个变量进行过赋值的标志位。