符号表的组织与操作
符号表

三、杂凑技术
1、假定有一个足够大的区域,这个区域用来填写一张含N项的符号 、假定有一个足够大的区域,这个区域用来填写一张含 项的符号 表。构造一个地址函数 ,对任何名字,H函数的取值于 至N-1之间 构造一个地址函数H,对任何名字, 函数的取值于0至 之间 地址函数 函数的取值于 即不论对此项查表或填表,都能从H函数中获得它在表中的位置 函数中获得它在表中的位置。 即不论对此项查表或填表,都能从 函数中获得它在表中的位置。 2、对地址函数H有两点要求: 、对地址函数 有两点要求: (1)函数的计算要简单、高效; )函数的计算要简单、高效; 2)函数值能比较均匀的分布在0至N-1之间 之间。 (2)函数值能比较均匀的分布在0至N-1之间。 3、构造函数H的办法: 直接地址法、数字分析法、平方取中法、 、构造函数 的办法 直接地址法、数字分析法、平方取中法、 的办法: 折叠法、除留余数法、 折叠法、除留余数法、随机地址法 、解决地址冲突的办法: 开放地址法、再哈希法、链地址法(p228)、 、 建立一个公共溢出区
二、对折查找与二叉树
在造表的同时把表格中的项按名字的“大小”顺序整理排列。 在造表的同时把表格中的项按名字的“大小”顺序整理排列。 名字的“ 指名字的内码二进制。 所谓名字的 大小”通常是指名字的内码二进制 所谓名字的“大小”通常是指名字的内码二进制。 对于经顺序化的表格的查找可用对折法 顺序化的表格的查找可用对折法。 对于经顺序化的表格的查找可用对折法。 对折法的查找方法如下: 对折法的查找方法如下: 查找方法如下 (1)首先把要查找的项和中项 ) (即第[n/2]+1项)作比较,若 即第 项 作比较, 相等,则宣布查找成功。 相等,则宣布查找成功。
特殊属性登记在别的地方, 而把某些特殊属性登记在别的地方 • 而把某些特殊属性登记在别的地方,并在信息栏中附设一指示 器,指向存放特殊属性的地方。 指向存放特殊属性的地方。 特殊属性的登记:例如: 特殊属性的登记:例如:对 于数组标识符 专门开辟一个信息表区,即为 专门开辟一个信息表区, 数组信息表也称为 也称为内情向量表 数组信息表也称为内情向量表 在符号表的地址栏中存入符号 表与内情向量表连接入口地址
第6章符号表的组织与

2021/4/9
23
本章小结
主要介绍:符号表的作用、内容和组织 方法,讨论对符号表的几种不同建立和 查找方法,主要有线性表,二分查找和 二叉树差查找以及散列法。
学习重点:学习查找方法时注意结合数 据结构知识,掌握查找方法的基本思想。
2021/4/9
24
感谢您的阅读收藏,谢谢!
2021/4/9
2021/4/9符自身
{ { 标识符
与标识符有 关的信息
类型:如实数、整型、布尔型 种属:如数组名、变量名等
作用域:如全局变量或
局部变量
2021/4/9
3
6.1.1符号表的组成
符号表的每一项通常由两部分组成
第一部分是名字栏,其内容为标识符名, 也称为主栏。一个标识符可以是变量名, 函数名,过程名等。由若干个非空格字 符串组成,且通常情况下在整个程序中 唯一。
P.left
P.val P.Right
2021/4/9
19
二分查找和二叉树
组成二叉树的原则: 左分支的任何结点值都大于结点P的值,
右分支的所有结点的值都小于结点P的值。 在随机情况下,平均查找长度为1+4log2 n 优点:减少了符号排序的时间,每查找一
项所需要比较的次数和log2 n成比例。
2021/4/9
2021/4/9
13
符号表的组织
设置符号表时注意事项: 考虑标识符在源程序中的不同作用域。作 用域不同,信息栏的内容也不同。
符号表中也能体现哪些标识符可以使用, 哪些标识符不能用。
2021/4/9
14
符号表的实现方法:
实现符号表的一种简洁而又实用的方法是 链式表结构。
2021/4/9
编译原理符号表的应用

编译原理符号表的应用1. 什么是编译原理符号表编译原理中的符号表是一种数据结构,用于记录程序中各个符号的相关信息,包括变量名、函数名、常量等。
在编译过程中,符号表起着重要的作用,可以进行词法分析、语法分析和语义分析等过程中的变量和函数的命名检查、重名检查以及类型检查等功能。
2. 符号表的组织结构符号表可以采用不同的组织结构,最常见的有线性表、散列表和树等。
下面列举了几种常见的符号表组织结构:•线性表:符号表可以通过数组或链表等数据结构来表示。
•散列表:采用散列函数对符号进行映射,能够快速地查找符号。
•树:符号表可以用二叉搜索树、AVL树或红黑树等数据结构来表示,支持快速的查找、插入和删除操作。
3. 符号表在编译过程中的应用符号表在编译过程中扮演着重要的角色,下面介绍了符号表在不同阶段的应用:3.1 词法分析阶段在词法分析阶段,编译器通过符号表来记录程序中出现的各个标识符的信息,包括变量名、函数名和常量等。
符号表可以用来进行标识符的重名检查,以及维护标识符的属性信息,比如变量的类型、作用域和内存地址等。
3.2 语法分析阶段在语法分析阶段,编译器需要判断语法是否正确,并生成语法树。
符号表在此阶段可以用来进行各种类型的语法检查,比如检查函数参数的类型、检查类型转换的合法性等。
符号表还可以用来维护函数的参数表和局部变量表等信息。
3.3 语义分析阶段在语义分析阶段,编译器需要对代码进行语义检查,包括类型检查、作用域检查等。
符号表是进行这些检查的重要依据,通过符号表可以判断变量是否被定义、变量的作用域和类型是否匹配等。
3.4 中间代码生成阶段在中间代码生成阶段,编译器需要将源代码转换成中间代码,符号表可以用来生成中间表示时的参考依据。
符号表可以用来维护中间变量的属性信息,并生成中间代码时进行类型转换的判断。
3.5 代码优化和目标代码生成阶段在代码优化和目标代码生成阶段,符号表可以用来进行变量的寄存器分配和内存分配等操作。
编译原理符号表的作用

编译原理符号表的作用介绍编译原理中的符号表是一个重要的数据结构,用于存储程序中的标识符及其相关信息。
标识符可以是变量、常量、函数名等,在编译过程中需要进行词法和语义分析,符号表提供了一个地方来管理这些标识符,并为编译器的其他模块提供必要的信息。
作用符号表在编译过程中起着关键作用,它具有以下几个主要作用。
1. 标识符的声明符号表记录了程序中所有标识符的声明情况,包括标识符的类型、作用域等信息。
对于变量,符号表可以记录其数据类型和内存地址;对于函数,符号表可以记录其参数列表、返回值类型等。
编译器可以通过符号表查找标识符的声明信息,并根据需要进行语义检查和代码优化。
2. 标识符的引用和解析编译过程中,标识符可能会被多次引用,符号表用于解析标识符的引用。
编译器可以根据符号表中的信息确定标识符的类型、作用域等,从而进行语义检查和类型推导。
如果编译器在符号表中找不到对应的标识符,就会报错或警告,提示可能存在的错误。
3. 作用域管理符号表还可以用于管理标识符的作用域。
在程序中,不同的代码块可能定义了相同名称的标识符,符号表可以通过作用域信息来区分这些标识符。
当编译器遇到一个标识符时,它可以在符号表中查找该标识符的作用域,并根据作用域规则来解析标识符的含义。
4. 错误检测和提示符号表还可以用于错误检测和提示。
编译器可以通过符号表判断标识符是否已经定义或声明,以及是否满足相应的语义规则。
如果标识符在符号表中已经存在多个定义,编译器可以发现这种错误,并给出相应的错误提示信息。
符号表的组织结构为了高效地实现符号表的作用,通常采用哈希表或树形结构来组织符号表。
下面是一些常见的符号表组织结构。
1. 线性表符号表可以使用线性表结构进行组织,例如数组、链表等。
线性表结构简单直观,适用于较小规模的符号表。
但对于大规模的符号表,线性表的查找效率较低。
2. 哈希表哈希表是一种基于键值对存储的数据结构,可以快速地查找和插入数据。
符号表中的标识符可以作为哈希表的键,对应的信息可以作为值进行存储。
符号表的组织和

5.2 符号表的主要属性及其作用
– 不同的符号类别包含了不同的属性,由于它们的信 息不同,也就导致了符号表的组织有较大的差别。 例如,数量类型的变量名字和过程名字:
• 对于一个变量名要记录其类型(如整型、实型、布尔型等)、占用 的存储字节以及相对与某个基准位置的相对位置;
• 对一个过程名要记录的属性包括参数的个数及其类型,该过程是否 有返回值,过程中的变量声明,甚至过程声明(如果像Pascal语言 允许嵌套过程声明)等信息。
• 同样,在内层作用域中,外层的标识符将被内层的同名标 识符所屏蔽,变得不可见,即外层中同名标识符的可见范 围是作用域中挖去内层块的范围,在内存块形成了作用域 洞。
整理课件
– (6 )存储分配信息
• 编译程序需要根据符号的存储类别定义以及它们在程序中 出现的位置和顺序来确定每一个符号应该分配的存储区域 及其具体位置。
整理课件
– 作用域与可见性
• 标识符的可见性从另外一个角度说明其有效性,它与作用 域有一定一致性。
• 标识符的作用域包含可见范围,但是,可见范围不会超过 作用域。
• 可见性在理解同名是不是合法的作用域嵌套时十分直观。 对于外层块域内层块定义的同名标识符,在外层作用域中, 内层所定义的标识符时不可见的,即外层所引用的是外层 所定义的标识符;
不同的程序语言规定了符号 的不同性质以及语法、语义和规 则,几种基本整的理课件符号属性。
– (1)符号名
• 语言中的符号名通常用标识符来表示。根据语言的定义,程序中 出现的重名标识符定义将按照该标识符在程序中的作用域和可视 规则进行相应的处理。而在程序的运行过程中,符号表中的符号 名始终是唯一的标志。
4. 在面相对象语言中,还必须把一个类或其超类所定义同名方法 存放在一个方法表中,指向每个方法的实现操作,以便实现面 相对象的继承性质。
第9-10章 符号表管理和存储组织

10.2 参数传递
当一个过程调用其它过程时,调用过程和被调过程之间 的通信经由非局部量或者经由参数传递。
10.2 参数传递
过程exchangel既使用了非局部量数组a,又使用了形式参i 和j,将a[i]和a[j]的值进行交换。
带有非局部变量和形参的PASCAL过程 (1) procedure exchangel(i,j: integer); //过程exchangel的头,带有形式参数i , j (2) var x: integer; (3) begin; (4) x∶=a[i]; a[i]∶=a[j]; a[j ]∶ =x //数组a是非局部变量 (5) end;
?若空闲块表中有若干个满足需要的空闲块,
该分配哪一块呢?通常有三种不同的分配策: ★首次满足法 ★最优满足法 ★最差满足法
(1)首次满足法
★只要在空闲块链表中找到满足需要的一 块,就进行分配。 ★如果该块很大,则按申请的大小进行分 割,剩余的块仍留在空闲块链表中 ★如果该块不很大,比如说,比申请的块 大不了几个字节,则整块分配出去,以免 使空闲链表中留下许多无用的小碎块。
栈式(stack) 堆式(heap)
栈式动态存储分配
◆将整个程序的数据空间设计为一个栈。在具有递归结构的程 序中,当调用一个过程时,所需的数据空间分配在栈顶,当 过程结束时释放空间。
◆栈式动态存储分配策略适用于PASCAL,C/C++,ALGOL之类 具有递归结构的语言的实现。
栈式动态存储分配
变长块管理
可以根据需要,分配长度不同的存储块,可以随要求而变 (1)按这种方法,初始化时存储空间是一个整块。按照 用户的需要,分配时先是从一个整块里分割出满足需要的 一小块,以后,归还时,如果新归还的块能和现有的空间 能合并,则合并成一块; (2)如果不能和任何空闲块合并,则可以把空闲块链成 一个链表。再进行分配时,从空闲块链表中找出满足需要 的一块,或者整块分配出去,或者从该块上分割一小块分 配出去。
c语言符号表

C 语言符号表C 语言符号表是一个重要的编译器数据结构,它用于存储和管理程序中的各种符号。
符号是指程序中的变量、函数、常量、类型等具有标识作用的名称。
符号表的作用是在编译过程中,为符号分配内存地址、类型、作用域等属性,并在需要时查找和修改符号的相关信息。
本文将从以下几个方面简述 C 语言符号表的概念、结构、功能和实现方法:符号表的概念和分类符号表的结构和组织方式符号表的功能和操作符号表的实现方法和技术符号表的概念和分类符号表的概念符号表是一种映射关系,它将程序中的符号名称映射到其对应的属性集合。
属性集合包括了符号的内存地址、数据类型、作用域、存储类别、初始化值等信息。
例如,下面的 C 语言代码片段中,定义了一个全局变量globalA,一个静态变量globalB,一个函数funcA和一个主函数main:/*** 全局变量*/int globalA =2022;/*** 静态变量*/static int globalB =2023;int funcA() {int localFuncAValue =13;return0;}int main(int argc, char*argv[]) {int localMainValue =14;return0;}对于这段代码,编译器会为每个符号创建一个符号表项,并填充其属性。
一个可能的符号表如下:符号名称内存地址数据类型作用域存储类别初始化值globalA1000int全局外部2022globalB1004int全局静态2023funcA2000int()全局外部-main3000int(int, char**)全局外部-localFuncAValue-4(%rbp)int局部(funcA)自动-localMainValue-4(%rbp)int局部(main)自动-可以看到,每个符号表项由一个符号名称和一个属性集合组成。
属性集合可以根据不同的编译器设计而有所差异,但一般都包含了上述几个基本属性。
07第7章-符号表管理技术

符号表的组织方式要根据内存和存取速度的限制 做相应的调整。
2014-1-4
12
符号表的内容: 符号表是由一些表项组成的二维表格 每个表项可分为两部分: 名字域:存放符号名字; 属性域:记录与该名字相对应的各种属性
2014-1-4
13
符号表示例 名字 目标地址 Computer 0 X1 4 FORM 8 类型 2 1 3 维数 声明行 引用行 指针 1 2 9,4,5 7 0 3 12,14 0 2 4 6
2014-1-4
24
1、强类型语言:所有变量都必须显式说明。
(1)遇到变量声明时,先查找符号表以确定是否重复声明,若 是则产生错误信息,否则插入符号表。
有序表:先找位置再插入
无序表:添加表尾
(2)遇到变量引用时,查找符号表,若查到则将查到的信息用 于语义检查和代码生成,否则报告错误(变量未声明)
例: 给出编译下面程序的有序符号表。 main() { int m,n[5]; real x; char name; } 名字 类型 维数 m int 0 main keyword 0 n int 5 name char 0 x real 0
2014-1-4
30
③散列符号表: 散列符号表不仅可以提高查找操作的效率,同时也可以提高 插入操作的效率,所以在许多实际编译器的符号表实现中均 采用了散列技术 散列符号表又称哈希(hash)符号表,其关键在于哈希函数, 将程序中出现的符号通过哈希函数进行映射,得到的函数值 作为该符号在表中的位置。
2014-1-4 28
② 有序表:对每一个符号排序组织的符号表,在符号表中 的表项按其符号的字符代码串(可以看成一个整数值)值 的大小从大到小(或从小到大)排列的。 例:程序中符号的出现情况如下: ………… …a……//a第一次出现 …b……//b第一次出现 ……a…//a第二次出现 …d……//d第一次出现 ……c…//c第一次出现 …b……//b第二次出现 …… 其中h为表头,p为表尾 编译扫描次序是a,b,d,c。由于c代码小于d代码,因此c 应在d表项之前。 排序表的表项建立及符号查找,通常采用"二分法"。 2014-1-4 29
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
删除
(1) index
(2) score
(3) p
符号名表
INFORMATION 整型,变量 实型,变量
整型,形式参数
7
8.1 符号表的组织与作用
对符号表进行操作的时机
定义性出现
int index
使用性出现
if index < 100 ...
8
8.1 符号表的组织与作用
按名字的不同种属建立多张符号表,如常数表、 变量名表、过程名表、…
编译原理
第八章 符号表
1
源程序
表
词法分析器
出
编 译 程
单词符号
语法分析器
格
语法单位 错
语义分析与中间代码
序 总
管
框
理
生成器
四元式 处 优化段
四元式 理
目标代码生成器
目标代码
2
第八章 符号表
符号表的组织与作用 整理和查找 符号表的内容 名字的作用范围
3
第八章 符号表
符号表的组织与作用 整理和查找 符号表的内容 名字的作用范围
改进:自适应线性表
name type size ...
n项
19
二分查找
表格中的项按名字的“大小”顺序整理排 列
填表慢,查找快。
查找时间复杂度:O(Log2n)
改进:组织成二叉树
name type size ...
n项
20
杂凑查找(HASH技术)
杂凑函数H(SYM):0~N-1
N:符号表的项数
24
小结
符号表的组织与作用 整理和查找 PL编译器实习
25
作业
预习《编译原理大作业实习》
第三节 PL 语法分析
三、表格处理
26
14
PROCEDURE INCWAP(M,N:INTEGER);
LABEL START;
四元式表
VAR K:INTEGER;
BEGIN START:
OPR OPN1 OPN2 (1) Link (2) par INCWAP 1
K:=M+1;
(3) par INCWAP 2
M:=N+4; N:=K; END.
整型,变量
12
PROCEDURE INCWAP(M,N:INTEGER);
LABEL START;
VAR
K:INTEGER;
BEGIN
START:
K:=M+1;
M:=N+4;
N:=K;
常数表
END.
值(VALUE)
(1)
1
(2)
4
13
PROCEDURE INCWAP(M,N:INTEGER);
LABEL START;
4
第八章 符号表
符号表的作用
一致性检查和作用域分析 辅助代码生成
5
8.1 符号表的组织与作用
符号表的每一项(入口)包含两大栏
名字栏,也称主栏,关键字栏 信息栏,记录相应的不同属性,分为若干子栏
名字
信息
6
8.1 符号表的组织与作用
对符号表的操作
填入名称
查找名字
访问信息
填写修改信息 NAME
11
PROCEDURE INCWAP(M,N:INTEGER);
LABEL START;
VAR
K:INTEGER;
BEGIN
START:
K:=M+1;
M:=N+4; N:=K;
符号名表
END.
NAME
INFORMATION
(1) M 形式参数,整型,值参数
(2) N 形式参数,整型,值参数
(3) K
PL抽象机
执行结果
22
要求
1. 扩充语句,如增加for 语句、repeat 语句、case语句等 2. 增加函数的说明和使用 3. 扩充数据类型,如实型、记录类型等 4. 扩充其它语言成分
注意: 1. 每个同学必须完成第1部分的扩充; 2. 第2、3、4部分的扩充为选作; 3. 扩充的语言成分的多少是验收评分的重要标准。
VAR
K:INTEGER; BEGIN
四元式表
START:
OPR OPN1 OPN2
K:=M+1; M:=N+4; N:=K;
(1) Link (2) par INCWAP 1
END.
(3) par INCWAP 2
(4) +
M
1
(5) +
N
4
(6) :=
K
(7) return
RESULT
M N K M N
23
上机实习检查要求
要求提供的材料
实践报告 源程序(含完整的工程文件) 一个或多个说明扩充功能的PL语言示例程序,要求这些
程序能够覆盖所有的扩充功能
上机检查的流程
提交实践报告,简要说明完成的功能 编译并运行PL编译和解释程序,显示“说明扩充功能的
PL语言示例程序”的执行结果 回答老师的问题
INFORMATION 四元式: (4)
16
第八章 符号表
符号表的组织与作用 整理和查找 符号表的内容 名字的作用范围
17
8.2 整理和查找
线性查找 二分查找 杂凑查找(HASH技术)
18
线性查找
按关键字出现的顺序填写各项
填表快,查找慢。
结构简单,节省空间,效率低,查找时间复杂 度:O(n)
(4) +
M
1
(5) +
N
4
(6) :=
K
(7) return
入口名表
RESULT
M N K M N
NAME
INFORMATION
(1) INCWAP 二目子程序,入口四元式: (1)
15
PROCEDURE INCWAP(M,N:INTEGER);
LABEL START; VAR
K:INTEGER; BEGIN
要求
计算简单高效 函数值分布均匀
填表快,查找快
21
PL编译器实习框架
test.pl
增加for、repeat、 case语句
PL编译程序
PL.PAS,PL.C →PL.exe
test.pld b
PL代码解释程序
INTERPRET.PAS,INTERPRET.C →INTERPRET.exe
OPR (1) Link
四元式表
OPN1 OPN2
START:
(2) par INCWAP 1
K:=M+1; M:=N+4; N:=K; END.
(3) par INCWAP 2
(4) +
M
1
(5) +
N
4
(6) :=
K
ቤተ መጻሕፍቲ ባይዱ
(7) return
标号表
RESULT
M N K M N
NAME (1) START
name type size ...
name type ...
name size ...
N
N
N
项
项
项
K个单元
10
PASCAL程序段示例
PROCEDURE INCWAP(M,N:INTEGER); LABEL START; VAR
K:INTEGER; BEGIN START:
K:=M+1; M:=N+4; N:=K; END.
符号表的组织方式
安排各项各栏的存储单元为固定长度 用间接方式安排各栏存储单元
name type size ...
...... ...... ......
name type size ...
9
8.1 符号表的组织与作用
符号表的存放次序
把每一项置于连续K存储单元中,构成一张K*N的表
把整个符号表分成m个子表,如T1,T2,…Tm,每个子 表含有N项.