编译原理第八章 符号表
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 需要做作用域分析!
8.3 名字的作用范围(Fortran)
• Fortran 局部、全局
• 执行时过程(函数)不
Name
Information
嵌套,局部区域只有一
···
局
个现行段;
···
部 • 编译时,尽管查填符号
表过程只限于局部,但
考虑到地址分配的全局
性,需将每个程序段符
号表保存在外存中,采
• 定长方式 • 间接方式 (1)名字的间接存储 (2)信息的间接存储
Name ● ●
Information
如何组织
方式
6 S A MP L E 3 S U M
Name
Information ● ●
数组信息表 维数 首地址 维1
内情向量表
··· ···
以数组为例 维n
如何组织
• 对于名称:把所有标识符都存放在一个 独立的字符串数组,主栏只放一个指示 器和一个整数(名字的长度)
var f, g: real; procedure B3(y:real) const b=5; procedure B4 … end B4 end B3
end B2 end B1
8.3 名字的作用范围 (Pascal)
top
(14)…
B4 (13)…
0
h (12)… 13
sp b (11)…
12
y (10)…
最近使用优先查找 (链头)
较难
中 排序整理 折半查找
二叉树
较难
中 构造排序树,查找时 依子树次序逼近。
杂凑(哈希
难
表)
高 杂凑函数: 名称于位置的映射 基于计算的查找。
数据结构的知识
name information
J1 ….
XYZ ….
I
….
BC ….
线性表(比如一维数组)
name information
BC ….
I
….
J1 ….
XYZ ….
对折查找(按字母排序)
J1
XYZ I
二叉树
Hash table
0 0, n, 2n, …
… n1 BC … …
N-1
哈希表
na information me J1 ….
XY …. Z I ….
BC ….
• 对于表格处理,主要是填表和查询 • 线性表:填表快,查询慢 • 对折:填表慢,查询快 • Hash表:填表和查询都快
• 8.1 符号表的组织与作用 • 8.2 整理与查找 • 8.3 名字的作用范围 • 8.4 符号表的内容
8.1 符号表的组织与作用
Name
Information
• 组成
名字(主栏)+信息(子栏)
• 操作
合理组织符号表,减少存 储空间,提高访问效率
查询、插入、删除
读取信息、编辑信息
类似数据库
8.1.2 符号表的组织方式
11Biblioteka B3 (9)…0g (8)…
9
f
(7)…
8
x (6)…
7
B2 (5)…
0
e
(4)…
4
c
(3)…
3
b (2)…
2
a
(1)…
1
Name Information previous
8.3 名字的作用范围 (Pascal)
针对过程嵌套
sp: 当前子符号表首地址
• 采用栈符号表
• 引入过程的嵌套层次表
• Previous指向后一符号下 标,最后项目值为0
实际使用
• 实际编译时,将使用多张符号表(按种 属)
– 变量表 – 常数表 – 过程表 – 中间表达式表
Incwap(M,N)
符号表SNT
10 k=M+1
Name Information
M=M+4 N=k return
M 形参,int,var
N 形参,int,var
K
int,var
四元式表QT
OPR
10 6 1 指针
3
2
Display表
1
level
8.4 符号表的内容
• 变量 类型+种属+大小+(相对)地址+…
• 标号 标号名称+代码地址
• 过程 名称(+类型)+递归标志+形参+…
• 常量 名称+类型+数值+…
• 1,2,3,4
作业
课程学习方法
各个击破,分而治之; 前后联系,融会贯通; 联系实际,学以致用; 强调原理,不拘细节。
• 对于信息:共同属性放在信息栏中,而 特殊属性登记在内情向量表中,信息栏 增加指示器
如何存储
• 一个N项符号表在存储器中的两种存储方 式(假定每项需要k个存储单元):
– 把每一项置于连续的k个存储单元中
– 把整个符号表分成M个子表
Name ●
●
Information
类……地
型
址
后阶段填充
实际编程: 用数组实现
8.3 名字的作用范围
• 名字的作用范围 名字作用域和内存的生命周期
• 最近嵌套作用域规则 名字作用于所在的程序局部
• 名字二元组 < 名字,过程编号 >
同一个标识符在不同地方可能被说明成不同标识对象
• 问题:
– 同一个标识符,具有不同性质,要求分配不 同的存储空间
– 如何组织符号表,使得同一个标识符在不同 的作用域中能够得到正确的引用,而不会产 生混乱
10
QT(4)
产生于是三个阶段
8.2 整理与查找
• 编译开始时,符号表或者是空的,或者 预先存放了一些保留字和标准函数名的 有关项。
• 然后,词法分析,语法分析,语义分析 不断的添加新符号表、查询、添加新项 、删除等等
8.2 整理与查找
名称 线性表
对折
符号表的实现方法
难度
效率
方法描述
易
低 自适应线性表:
···
··· ···
用一维数组各段局部名
全 局
表的开始位置。
Name
Information
Fortan程序有一个主程序段和若干子程序段组成,没有过程嵌套
program B1(input, output) const a=10; var b,c: integer;
e:real; procedure B2(x:real)
第八章 符号表
源程序
词法分析器
单词符号
表
语法分析器
出
格
语法单位
错
语义分析与中间代码
管
中间代码
处
优化器
理
理
中间代码
目标代码生成器
目标代码
第八章 符号表
• 符号表的内容: 名字 + 描述信息 • 符号表在编译框架中的作用
词法分析时登记名字,语法分析时引用,语义分析 时语义检查,目标代码生成时分配地址。
ARG1 ARG2 result
link
actpar incwap
1
M
actpar incwap
2
N
+
M
1
K
+
N
4
M
:=
K
N
paract
1
M
paract
2
N
return
常数表CT 1 4
入口名表ENT Name Information Incwap 入口地址
标号表SNT
Label Information
8.3 名字的作用范围(Fortran)
• Fortran 局部、全局
• 执行时过程(函数)不
Name
Information
嵌套,局部区域只有一
···
局
个现行段;
···
部 • 编译时,尽管查填符号
表过程只限于局部,但
考虑到地址分配的全局
性,需将每个程序段符
号表保存在外存中,采
• 定长方式 • 间接方式 (1)名字的间接存储 (2)信息的间接存储
Name ● ●
Information
如何组织
方式
6 S A MP L E 3 S U M
Name
Information ● ●
数组信息表 维数 首地址 维1
内情向量表
··· ···
以数组为例 维n
如何组织
• 对于名称:把所有标识符都存放在一个 独立的字符串数组,主栏只放一个指示 器和一个整数(名字的长度)
var f, g: real; procedure B3(y:real) const b=5; procedure B4 … end B4 end B3
end B2 end B1
8.3 名字的作用范围 (Pascal)
top
(14)…
B4 (13)…
0
h (12)… 13
sp b (11)…
12
y (10)…
最近使用优先查找 (链头)
较难
中 排序整理 折半查找
二叉树
较难
中 构造排序树,查找时 依子树次序逼近。
杂凑(哈希
难
表)
高 杂凑函数: 名称于位置的映射 基于计算的查找。
数据结构的知识
name information
J1 ….
XYZ ….
I
….
BC ….
线性表(比如一维数组)
name information
BC ….
I
….
J1 ….
XYZ ….
对折查找(按字母排序)
J1
XYZ I
二叉树
Hash table
0 0, n, 2n, …
… n1 BC … …
N-1
哈希表
na information me J1 ….
XY …. Z I ….
BC ….
• 对于表格处理,主要是填表和查询 • 线性表:填表快,查询慢 • 对折:填表慢,查询快 • Hash表:填表和查询都快
• 8.1 符号表的组织与作用 • 8.2 整理与查找 • 8.3 名字的作用范围 • 8.4 符号表的内容
8.1 符号表的组织与作用
Name
Information
• 组成
名字(主栏)+信息(子栏)
• 操作
合理组织符号表,减少存 储空间,提高访问效率
查询、插入、删除
读取信息、编辑信息
类似数据库
8.1.2 符号表的组织方式
11Biblioteka B3 (9)…0g (8)…
9
f
(7)…
8
x (6)…
7
B2 (5)…
0
e
(4)…
4
c
(3)…
3
b (2)…
2
a
(1)…
1
Name Information previous
8.3 名字的作用范围 (Pascal)
针对过程嵌套
sp: 当前子符号表首地址
• 采用栈符号表
• 引入过程的嵌套层次表
• Previous指向后一符号下 标,最后项目值为0
实际使用
• 实际编译时,将使用多张符号表(按种 属)
– 变量表 – 常数表 – 过程表 – 中间表达式表
Incwap(M,N)
符号表SNT
10 k=M+1
Name Information
M=M+4 N=k return
M 形参,int,var
N 形参,int,var
K
int,var
四元式表QT
OPR
10 6 1 指针
3
2
Display表
1
level
8.4 符号表的内容
• 变量 类型+种属+大小+(相对)地址+…
• 标号 标号名称+代码地址
• 过程 名称(+类型)+递归标志+形参+…
• 常量 名称+类型+数值+…
• 1,2,3,4
作业
课程学习方法
各个击破,分而治之; 前后联系,融会贯通; 联系实际,学以致用; 强调原理,不拘细节。
• 对于信息:共同属性放在信息栏中,而 特殊属性登记在内情向量表中,信息栏 增加指示器
如何存储
• 一个N项符号表在存储器中的两种存储方 式(假定每项需要k个存储单元):
– 把每一项置于连续的k个存储单元中
– 把整个符号表分成M个子表
Name ●
●
Information
类……地
型
址
后阶段填充
实际编程: 用数组实现
8.3 名字的作用范围
• 名字的作用范围 名字作用域和内存的生命周期
• 最近嵌套作用域规则 名字作用于所在的程序局部
• 名字二元组 < 名字,过程编号 >
同一个标识符在不同地方可能被说明成不同标识对象
• 问题:
– 同一个标识符,具有不同性质,要求分配不 同的存储空间
– 如何组织符号表,使得同一个标识符在不同 的作用域中能够得到正确的引用,而不会产 生混乱
10
QT(4)
产生于是三个阶段
8.2 整理与查找
• 编译开始时,符号表或者是空的,或者 预先存放了一些保留字和标准函数名的 有关项。
• 然后,词法分析,语法分析,语义分析 不断的添加新符号表、查询、添加新项 、删除等等
8.2 整理与查找
名称 线性表
对折
符号表的实现方法
难度
效率
方法描述
易
低 自适应线性表:
···
··· ···
用一维数组各段局部名
全 局
表的开始位置。
Name
Information
Fortan程序有一个主程序段和若干子程序段组成,没有过程嵌套
program B1(input, output) const a=10; var b,c: integer;
e:real; procedure B2(x:real)
第八章 符号表
源程序
词法分析器
单词符号
表
语法分析器
出
格
语法单位
错
语义分析与中间代码
管
中间代码
处
优化器
理
理
中间代码
目标代码生成器
目标代码
第八章 符号表
• 符号表的内容: 名字 + 描述信息 • 符号表在编译框架中的作用
词法分析时登记名字,语法分析时引用,语义分析 时语义检查,目标代码生成时分配地址。
ARG1 ARG2 result
link
actpar incwap
1
M
actpar incwap
2
N
+
M
1
K
+
N
4
M
:=
K
N
paract
1
M
paract
2
N
return
常数表CT 1 4
入口名表ENT Name Information Incwap 入口地址
标号表SNT
Label Information