16.第八章 符号表

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


问题:如何组织符号表,使得同一个标 识符在不同的作用域中能得到正确的引 用,而不会产生混乱? 最近嵌套作用域规则
2015-4-1
24
最近嵌套作用域示例
(1) int main() (2) { (3) int a=0; (4) int b=0; (5) { (6) int b=1; (7) { (8) int a=2; (9) printf(“%d %d\n”, a, b ); (10) } (11) { (12) int b=3; (13) printf(“%d %d\n”, a, b); (14) } (15) printf(“%d %d\n”, a, b); (16) } (17) printf(“%d %d\n”, a, b); (18) }
(1)根据各符号名中的字符确定正整数H,即 将标识符中的每个字符转换为一个非负整数, 将得到的各个整数组合成一个整数(可以将第 一个、中间的和最后一个字符值加在一起,也 可以将所有字符的值加起来)。 (2)将上一步确定的整数H除以符号表的长度 N (N是质数),然后取其余数。这个余数就 作为符号的散列位置。 (3)处理冲突可采用链接法,即将出现冲突 2015-4-1 21 的符号用指针连接起来。
2015-4-1 3
符号表的作用

编译的各个阶段都有可能会用到符号表中 登记的信息



协助进行语义检查(如检查一个名字的引用和 之前的声明是否相符)和中间代码生成 在目标代码生成阶段,当需要为名字分配地 址时,符号表中的信息将是地址分配的主要 依据 编译器用符号表来记录、收集和查找出现在 源程序中的各种名字及其语义信息。
26
2015-4-1
Pascal的符号表组织


办法: 将其符号表设计为栈符号表,先进后出。 引入一个显示(DISPLAY)层次关系表, 称为过程的嵌套层次表。 在符号表的信息栏中引入一个指针域, 用以链接它在同一过程内的前一域名字 在表中的下标。
27
2015-4-1

program B1(input,output;) const a=10; var b,c : integer; e : real; procedure B2(x : real); var f, g: real;
4
2015-4-1
符号表上的操作

在声明部分,向表中插入一个新标识符。
在表达式或语句中,对于给定一个标识符:

①查找是否在表中; ②访问它在表中的相关信息; ③在表中填写或更新它的某些信息。

更新或删除一个或一组标识符,体现嵌套作用 规则和局部化。
5
2015-4-1
何时建立和访问符号表
TOP 14 13 12 11 10 9 8 7 6 5 4 3 2 SP 1

NAME information previous 继续编译,栈符号表 B4 ... 0 的变化: h b y B3 g f x B2 e c b a ... ... ... ... ... ... ... ... ... ... ... ... 13 12 11 0 9 8 7 0 5 4 3 2

例:假设现有5个符号C1、C2、C3、C4、C5,分别转换 成正整数为87、55、319、273和214,符号表的长度是 5,那么,利用质数除余法得到的散列地址为:2、0、4、 3、4,结果如图所示。
2015-4-1
散列符号表
22
例:请判断输出结果?为什么?
int main() 运行结果为: { abc is 2 int abc; abc is 1 abc = 1; 说明abc在不同的范围内有效。 { 这个有效范围就是符号的作用域 int abc; abc = 2; printf(“abc is %d\n”, abc); } printf(“abc is %d\n”, abc); }

在词法分析时创建

只能在符号表中将标识符的名字填入符号表,而其 他属性则要在语义分析和代码生成阶段填入。语法 分析阶段只检查源程序语法的正确性,一般不使用 符号表。

在语义分析时创建

如果在语义分析阶段创建符号表,那么与符号表打 交道的就仅局限于语义分析和代码生成部分。
6
2015-4-1
何时建立和访问符号表
INFORMATION ... ...
J1
XYZ
...
...
• 查表操作的平均长度为 1 log N • 但该方法对于一遍扫描来说没有太大的用处
2
2015-4-1
17
二叉树

变通方法:二叉树 J1 令每项为一个结点,每个结点附设两个指 示器栏,LEFT(左枝),RIGHT(右枝), 0 XYZ 0 BC 0 要求任何结点 P的右枝的所有结点值小于结 点P的值,而左枝的所有结点值大于结点P 的值。
2015-4-1
12
符号表的组织方式
内情向量表 NAME INFORMATION 维数 首地址 界差 d1 . . . 界差 dn
上界I1 . . . 下界 u1 . . . 下界 un
CAT

......
地址

a
......


通过符号表访问内情向量表
2015-4-1
上界 In
13
符号表的组织方式
第8章 符号表管理
2015-4-1
1
主要内容

符号表概述


符号表的作用
符号表的组织结构 整理与查找 符号表与作用域 本章小结
2
2015-4-1
符号表概述

什么是符号表?

在编译过程中,编译程序用来记录源程序中各种 名字的特性信息, 所以也称为名字特性表。


名字: 程序名、过程名、函数名、用户定义 类型名、变量名、常量名、枚举值名、标号 名等。 特性信息: 上述名字的种类、类型、维数、 参数个数、数值及目标地址(存储单元地址) 等。

为符号表设置一个足够大的空间N,即符号 表的长度为N; 为符号Ki构造一个散列函数Hash(Ki),使得 0≤ Hash(Ki) ≤N-1,其中i=1,2,…,n; Hash(Ki)就决定了符号Ki在符号表中的位置 。
20


2015-4-1
杂凑技术(hash table或哈希表)

用“质数除余法”来构造散列符号表的方 法
15
0 13 12 11 0 9 8 7 0 5 4 3 2
14 10 6 1 DISPLAY 符号表 首地址
31
2015-4-1
栈符号表


例:画出编译到C程序中a、b、c、d处的栈式符号表。
real x,y; char name;……………………………a int fun1(int ind) { int x; ……………………………b x=m2(ind+1); } int fun2(int j) { { int f[10]; bool test1; …………………c } } main() { char name; ………………………d x=2;y=5; printf("%d\n",fun1(x/y)); }
2015-4-1
8
符号表的内容
(1)符号表的结构与内容
符号表的基本结构: 特性(信息) 名字
“名字”域: 存放名字,一般为标识符的符号 串,也可为指向标识符字符串的指针。
2015-4-1 9
符号表的内容
“特性”域: 可包括多个子域 , 分别表示标识符的有 关信息,如:
名字(标识符)的种类:简单变量、函数、过程、 数组、标号、参数等 类型:如整型、浮点型、字符型、指针等 性质:变量形参、值形参等 值: 常量名所代表的数值 地址:变量所分配单元的首址或地址位移 大小:所占的字节数 作用域的嵌套层次:
10
6
1 DISPLAY
符号表 首地址
2015-4-1
栈符号表
30
编译到B4过程体 之前时的栈符号表
NAME information previous
TOP 16
SP
15 14 13 12 11 10
9 8 7 6 5 4 3 2 1
继续编译,栈符号表 的变化:
i 0
z
B4 h b y B3 g f x B2 e c b a ... ... ... ... ... ... ... ... ... ... ... ... ...
符号表 数据区
整型 整型 整型
例:int x, a, b; .. ... L: x := a + b; ...
建表
x a
简单变量 简单变量 简单变量 标号
分配 存储
b L
2015-4-1
1. 语法分析和语义分析 •说明语句、赋值语句的语法 规 •上下文有关分析:是否声明 •类型一致性检查 2. 生成目标代码 LOAD a的地址 ADD b的地址 STO x的地址

procedure B3(y : real); const b=5; var h: boolean; procedure B4(Z : integer); var i: char; begin ... if e<0 then B4(f); ... end {B4} begin ...;B4(a);...; end {B3} begin ...;B3(c);...; end {B2} begin ...;B2(e);...; end {main}
2015-4-1 10
符号表的内容

对于数组: 维数、上下界值、计算下标变量地址所用的 信息(数组信息向量)以及数组元素类型等。
对于记录(结构、联合):域的个数,每个域的域名、
地址位移、类型等。
对于过程或函数:形参个数、所在层次、函数返回值 类型、局部变量所占空间大小等。

对于指针:所指对象类型等。
4(i-1)
SAMPLE的属性
4N字
INFORMATION:0
2(i-1) SAMPLE
2N 字
NAME:0
2015-4-1
分两个字表的符号表安排
14
整理与查找

符号表的三种构造法和处理法:


线性查找 二叉树 杂凑技术(hash技术)
2015-4-1
15
线性表


最简单 按照出现的顺序填表 每次查找从第一个开 始顺序查找 指示器AVAILABLE 总是指向空白区的首 地址
2015-4-1
输出结果: 2 1 0 3 0 1 0 0
25
Pascal的符号表组织



过程结构:在一个过程(或函数)里说 明了的名字被认为是局部与这个过程 (或函数)的。 最近嵌套作用域原则:一个名字的作用 域是包含了这个名字的说明的最小过程 (或函数)。 Pascal过程的结构是嵌套的。
线性符号表
项数 1 2 3 4
AVAILABEL
NAME J1 XYZ
INFORMATIONห้องสมุดไป่ตู้... ...
I
BC
...
...
查表操作的平均长度为(n+1)/2
2015-4-1 16
对折查找

为了提高查表速 度,可在建表同 时按名字大小排 序。
线性符号表
项数 1 2 3 4
AVAILABEL
NAME BC I

2015-4-1
28
栈符号表(编译到B1时的常量和变量的说明时栈符号表)
NAME TOP 5 information previous
4
e c
b a
... ...
... ... 栈符号表
0 4
3 1 2 DISPLAY 符号表 首地址
3 2 SP
1
2015-4-1
29
编译到B4过程说明之前的栈
7
何时建立和访问符号表

填表:

当分析到程序中的说明或定义语句时,应将说明或定义的名 字,以及与之有关的信息填入符号表中。

例:Procedure P( ) 查表:

(1) 填表前查表,检查在程序的同一作用域内名字是否重复定 义; (2) 检查名字的种类是否与说明一致; (3) 对于强类型语言,要检查表达式中各变量的类型是否一 致; (4) 生成目标指令时,要取得所需要的地址。 .........

0
I
0
2015-4-1
18
杂凑技术(hash table或哈希表)

线性表:填表快,查表慢 对折法:填表慢,查表快 哈希表:折中 哈希表主要问题:


分布尽量要均匀 解决“地址冲突”问题
2015-4-1
19
杂凑技术(hash table或哈希表)

Hash表的基本思想:
2015-4-1
11
符号表的组织方式


存储符号表的方法
名字位置 名字长度 其它属性 定长存贮方法:为标识符名字域规定一个宽度,标识 1 8 符按左对齐方式存放在其中,特点是简单且存取速度 快,缺点是空间利用率低,标识符长度不能超过名字 9 2 域的宽度。 11 5 集中存贮方法:开辟一个存放所有标识符的缓冲区, … … 而在标识符名字域中只存放标识符在缓冲区中的偏移 集中存储符号表 ComputerX1FORM1 地址和标识符的长度。特点是存储效率高,标识符无 长度限制,但存取效率低。
相关文档
最新文档