符号表的组织与操作
符号表
![符号表](https://img.taocdn.com/s3/m/2197f784ec3a87c24028c499.png)
三、杂凑技术
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章符号表的组织与
![第6章符号表的组织与](https://img.taocdn.com/s3/m/e9332b3589eb172dec63b709.png)
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
编译原理符号表的应用
![编译原理符号表的应用](https://img.taocdn.com/s3/m/157af327f4335a8102d276a20029bd64783e62c6.png)
编译原理符号表的应用1. 什么是编译原理符号表编译原理中的符号表是一种数据结构,用于记录程序中各个符号的相关信息,包括变量名、函数名、常量等。
在编译过程中,符号表起着重要的作用,可以进行词法分析、语法分析和语义分析等过程中的变量和函数的命名检查、重名检查以及类型检查等功能。
2. 符号表的组织结构符号表可以采用不同的组织结构,最常见的有线性表、散列表和树等。
下面列举了几种常见的符号表组织结构:•线性表:符号表可以通过数组或链表等数据结构来表示。
•散列表:采用散列函数对符号进行映射,能够快速地查找符号。
•树:符号表可以用二叉搜索树、AVL树或红黑树等数据结构来表示,支持快速的查找、插入和删除操作。
3. 符号表在编译过程中的应用符号表在编译过程中扮演着重要的角色,下面介绍了符号表在不同阶段的应用:3.1 词法分析阶段在词法分析阶段,编译器通过符号表来记录程序中出现的各个标识符的信息,包括变量名、函数名和常量等。
符号表可以用来进行标识符的重名检查,以及维护标识符的属性信息,比如变量的类型、作用域和内存地址等。
3.2 语法分析阶段在语法分析阶段,编译器需要判断语法是否正确,并生成语法树。
符号表在此阶段可以用来进行各种类型的语法检查,比如检查函数参数的类型、检查类型转换的合法性等。
符号表还可以用来维护函数的参数表和局部变量表等信息。
3.3 语义分析阶段在语义分析阶段,编译器需要对代码进行语义检查,包括类型检查、作用域检查等。
符号表是进行这些检查的重要依据,通过符号表可以判断变量是否被定义、变量的作用域和类型是否匹配等。
3.4 中间代码生成阶段在中间代码生成阶段,编译器需要将源代码转换成中间代码,符号表可以用来生成中间表示时的参考依据。
符号表可以用来维护中间变量的属性信息,并生成中间代码时进行类型转换的判断。
3.5 代码优化和目标代码生成阶段在代码优化和目标代码生成阶段,符号表可以用来进行变量的寄存器分配和内存分配等操作。
编译原理符号表的作用
![编译原理符号表的作用](https://img.taocdn.com/s3/m/046397d4b9f67c1cfad6195f312b3169a451ea94.png)
编译原理符号表的作用介绍编译原理中的符号表是一个重要的数据结构,用于存储程序中的标识符及其相关信息。
标识符可以是变量、常量、函数名等,在编译过程中需要进行词法和语义分析,符号表提供了一个地方来管理这些标识符,并为编译器的其他模块提供必要的信息。
作用符号表在编译过程中起着关键作用,它具有以下几个主要作用。
1. 标识符的声明符号表记录了程序中所有标识符的声明情况,包括标识符的类型、作用域等信息。
对于变量,符号表可以记录其数据类型和内存地址;对于函数,符号表可以记录其参数列表、返回值类型等。
编译器可以通过符号表查找标识符的声明信息,并根据需要进行语义检查和代码优化。
2. 标识符的引用和解析编译过程中,标识符可能会被多次引用,符号表用于解析标识符的引用。
编译器可以根据符号表中的信息确定标识符的类型、作用域等,从而进行语义检查和类型推导。
如果编译器在符号表中找不到对应的标识符,就会报错或警告,提示可能存在的错误。
3. 作用域管理符号表还可以用于管理标识符的作用域。
在程序中,不同的代码块可能定义了相同名称的标识符,符号表可以通过作用域信息来区分这些标识符。
当编译器遇到一个标识符时,它可以在符号表中查找该标识符的作用域,并根据作用域规则来解析标识符的含义。
4. 错误检测和提示符号表还可以用于错误检测和提示。
编译器可以通过符号表判断标识符是否已经定义或声明,以及是否满足相应的语义规则。
如果标识符在符号表中已经存在多个定义,编译器可以发现这种错误,并给出相应的错误提示信息。
符号表的组织结构为了高效地实现符号表的作用,通常采用哈希表或树形结构来组织符号表。
下面是一些常见的符号表组织结构。
1. 线性表符号表可以使用线性表结构进行组织,例如数组、链表等。
线性表结构简单直观,适用于较小规模的符号表。
但对于大规模的符号表,线性表的查找效率较低。
2. 哈希表哈希表是一种基于键值对存储的数据结构,可以快速地查找和插入数据。
符号表中的标识符可以作为哈希表的键,对应的信息可以作为值进行存储。
符号表的组织和
![符号表的组织和](https://img.taocdn.com/s3/m/f12f7c2326fff705cc170afa.png)
5.2 符号表的主要属性及其作用
– 不同的符号类别包含了不同的属性,由于它们的信 息不同,也就导致了符号表的组织有较大的差别。 例如,数量类型的变量名字和过程名字:
• 对于一个变量名要记录其类型(如整型、实型、布尔型等)、占用 的存储字节以及相对与某个基准位置的相对位置;
• 对一个过程名要记录的属性包括参数的个数及其类型,该过程是否 有返回值,过程中的变量声明,甚至过程声明(如果像Pascal语言 允许嵌套过程声明)等信息。
• 同样,在内层作用域中,外层的标识符将被内层的同名标 识符所屏蔽,变得不可见,即外层中同名标识符的可见范 围是作用域中挖去内层块的范围,在内存块形成了作用域 洞。
整理课件
– (6 )存储分配信息
• 编译程序需要根据符号的存储类别定义以及它们在程序中 出现的位置和顺序来确定每一个符号应该分配的存储区域 及其具体位置。
整理课件
– 作用域与可见性
• 标识符的可见性从另外一个角度说明其有效性,它与作用 域有一定一致性。
• 标识符的作用域包含可见范围,但是,可见范围不会超过 作用域。
• 可见性在理解同名是不是合法的作用域嵌套时十分直观。 对于外层块域内层块定义的同名标识符,在外层作用域中, 内层所定义的标识符时不可见的,即外层所引用的是外层 所定义的标识符;
不同的程序语言规定了符号 的不同性质以及语法、语义和规 则,几种基本整的理课件符号属性。
– (1)符号名
• 语言中的符号名通常用标识符来表示。根据语言的定义,程序中 出现的重名标识符定义将按照该标识符在程序中的作用域和可视 规则进行相应的处理。而在程序的运行过程中,符号表中的符号 名始终是唯一的标志。
4. 在面相对象语言中,还必须把一个类或其超类所定义同名方法 存放在一个方法表中,指向每个方法的实现操作,以便实现面 相对象的继承性质。
第9-10章 符号表管理和存储组织
![第9-10章 符号表管理和存储组织](https://img.taocdn.com/s3/m/5bbe0e38376baf1ffc4fad76.png)
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语言符号表](https://img.taocdn.com/s3/m/dec28a99b1717fd5360cba1aa8114431b90d8e24.png)
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章-符号表管理技术
![07第7章-符号表管理技术](https://img.taocdn.com/s3/m/bc45457ff242336c1eb95e7c.png)
符号表的组织方式要根据内存和存取速度的限制 做相应的调整。
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
符号表的组织与管理
![符号表的组织与管理](https://img.taocdn.com/s3/m/bca58a2f910ef12d2af9e7fc.png)
15
根据语言的定义,程序中出现的重名标识符定义将按照该标识 符在程序中的作用域和可视性规则进行相应的处理。 而在符号表运行过程中,表中的标识符名始终是唯一的标志。 在一些允许操作重载(operator over load)的语言中,函 数名、过程名是可以重名的,对于这类重载的标识符要通过它 们的参数个数和类型以及函数返回值类型来区别,以达到它们 在符号表中的唯一性。
一般来说一个变量的作用域就是该变量可以出现的场合,也就
是说在某个变量作用域范围内该变量是可引用的,这就是变量
可视性的作用域规则。
21
其它两种情况影响到一个变量的可视性
⑴ 函数的形式参数:
int a; // 外部定义的整型变量 a int func(float a, int b) // 函数内部定义的局部整型变量 a, // 屏蔽了外部定义的整型变量 a {
一般来说,若把外部变量视为 0 层的话,则函数内部作为第 1 层,依次向内嵌套定义的分程序分别为 2,3,…层。Байду номын сангаас
在 C 语言程序中函数之间是并列定义的,因此每个函数内部 都定义为第一层,而函数内的分程序也可以是并列定义的,对 于并列定义的分程序当然具有相同的层次号。
24
5、符号变量的存储分配信息
根据符号变量的存储类别定义及它们出现的位置和次序来确定 每一个变量应分配的存储区及在该区中的具体位置,用相对区 头的位移量表示。 通常有两类存储区,即静态存储区和动态存储区;
} // 第二层尾
} // 第一层尾
23
怎么确立符号的作用域和可视性?
为确立符号的作用域和可视性。符号表属性中除了需要符号的 存储类别之外还需要表示该符号在程序结构上被定义的层次。 符号表中设置一个表达符号所在层次的属性域,存放该符号的 定义层次。
第九章符号表
![第九章符号表](https://img.taocdn.com/s3/m/28e9b1576529647d262852ba.png)
NAME:P KIND:PROCEDUR LEVEL:LEV ADR: SIZE:4
NAME:G KIND:VARIABLE LEVEL:LEV+1 ADR:DX
…… ……
……
第九章符号表
……
9.1 符号表的作用和地位
1. 收集符号属性
在编译程序分析标识符说明部分时,收集有
关标识符的属性,在符号表中建立符号的相
位置的属性信息。 出现先后次序、存储区表头相对位移量。
第九章符号表
符号属性(信息)
6. 符号的其它属性: (1) 数组内情向量 (2) 记录结构型的成员信息 成员所占存储空间、排列次序 (3) 函数及过程的形参 每个函数或过程的形参个数、排列次序、形
参的类型。
第九章符号表
9.3 符号表的组织
第三种:折衷方式,根据符号属性相似程度 分类组织成若干张表,每张表中记录的符号 都有比较多的相同属性。
第九章符号表
9.3.2 符号表项的排列
符号表作为一个多元组,表中元组的排列组 织是构造符号表的重要成分。
在编译程序的整个工作过程中,符号表被频 繁地用来建立表项,找查表项,填充和引用 表项的属性。因此表项的排列组织对该系统 运行的效率起着十分重要的作用。
符号表的作用和地位
3. 作为目标代码生成阶段地址分配的依据 在目标代码生成阶段,当对符号名进行地址
分配时,符号表是地址分配的依据。 对一个多遍扫描的编译程序,不同遍所用的
符号表也往往各有不同,因为每遍所关心的 信息各有差异。
第九章符号表
9.2 符号表的主要属性和作用
不同的语言定义的标识符属性不尽相同,但 以下几种通常都是需要的:
保留字表和运算符表:找到后转换为内码 标识符表:找到—已登录;未找到—登录 查找算法:顺序、折半、散列
编译第9章
![编译第9章](https://img.taocdn.com/s3/m/5ccc56db240c844769eaeeb7.png)
符号名表SNT
NAME (1)M (2)N (3)K INFORMATION 形参,整数,变量 形参,整数,变量 整数,变量
常数表CT
值(VALUE) (1) 1 (2) 4
入口名表ENT NAME INFORMATION (1)INCWAP 二目子程序,入口QT(1) /*记录入口名INCWAP的入口地址*/ 标号表LT LABLE INFORMATION (1)10 QT(4) /*记录了标号10对应的四元式序列号*/
9.2 符号的主要属性(信息)及作用
几种通常都是需要的。 • 1 符号名
– 作为标识符在表中唯一区别一般不允许重名。 – 对于重载可以通过参数类型、个数和返回值类 型来区分。 – 通常把一个标识符在符号表中的位置的整数值 称之该标识符的内部代码。
• 2 类型
– 定义一个标识符的基本类型或它的组合类型都 是符号表中表示标识符属性的重要信息。
• 3、折衷方式是根据符号属性相似程度分 类组织成若干张表,每张表中记录的符 号都有比较多的相同属性。 – 在管理复杂性和空间效率方面都取得 折中的效果。
符号表举例
编译程序按名字的不同种属分别使用许多符号表, 如常数表、变量名表、过程名表等等。 SUBROUTINE INCWAP(M,N) 10 K=M+1 M=M+4 N=K RETURN END 经编译头三阶段后所产生的主要表格有:符号名表 SNT、常数表CT、入口名表ENT、标号表LT和四 元式表QT
五、说明部分的分析与处理
• 对每个过程说明的对象(变量,常量和过程) 造名字表 –填写标பைடு நூலகம்符的所在层次、属性和分配的相 对位置。标识符的属性不同时,所需填入 的信息也不同。 –登录信息由ENTER过程完成。
符号表的组织与管理66页PPT
![符号表的组织与管理66页PPT](https://img.taocdn.com/s3/m/e167228077232f60ddcca1e5.png)
1、最灵繁的人也看不见自己的背脊。——非洲 2、最困难的事情就是认识自己。——希腊 3、有勇气承担命运这才是英雄好汉。——黑塞 4、与肝胆人共事,无字句处读书。——周恩来 5、阅读使人充实,会谈使人敏捷,写作使人精确。——培根
符号表的组织与管理
51用的 法律。 ——杰 斐逊 52、法律源于人的自卫本能。——英 格索尔
53、人们通常会发现,法律就是这样 一种的 网,触 犯法律 的人, 小的可 以穿网 而过, 大的可 以破网 而出, 只有中 等的才 会坠入 网中。 ——申 斯通 54、法律就是法律它是一座雄伟的大 夏,庇 护着我 们大家 ;它的 每一块 砖石都 垒在另 一块砖 石上。 ——高 尔斯华 绥 55、今天的法律未必明天仍是法律。 ——罗·伯顿
第六章(2)符号表的管理
![第六章(2)符号表的管理](https://img.taocdn.com/s3/m/61f51fcba5e9856a571260b3.png)
}
} a = 1, b = 1 printf(“a = %d, b = %d\n”, a, b);
}
33
2.在语言程序的局部化单位中,标识符的出现分为定 义性出现和使用性出现。
⑴定义性出现的标识符:局部化单位的声明部分出现 的标识符,其作用是确定该标识符的属性信息,如 名字,类型,存储位置等。一个标识符在一个局部 化单位只能被声明一次。
28
❖对于散列表,新符号的登录是通号表的目的:
判断该符号的存在性; 获取该符号的语义属性. ❖符号表的查找算法:顺序查找、折半查找、杂凑查 找.
30
6.3.3 符号表的局部化处理
一、问题的引出
1.源语言程序的局部化单位 程序中允许有声明的 部分称为一个局部化单位,通常是一个子程序(函数、 过程)或分程序:
19
6.3.1 符号表的建立和查找
一.符号表的初始化 在编译过程中某个时刻,符号表的状态反
映了该时刻被编译的语言程序正被编译的位置 的状态.具体来说主要是反映了在该时刻被编译 的语言程序中可视标识符的状态. 符号表的初始化,在对语言程序开始编译的时刻, 定义建立符号表的初始状态.
20
1.符号表的表长是渐增变化的情况: ❖线性组织和二分法组织的符号表,其表的长度在编译开始时 通常为0,而随着符号的逐步登录,表长增长. ❖按这类方法组织的符号表,其初始化方法只需将表尾推向表
一、符号表的总体组织
符号表的每一项包含两部分:标识符的名字;该名字的信 息。
不同类别的标识符所包含的信息是不同的。 符号表的总体组织既可以采用多表结构,也可以采用单表
结构,也可以二者折中。究竟采用哪种结构并没有统一的规 定,编译程序可根据实际处理语言的需要进行选择。
符号表原理介绍(详细)
![符号表原理介绍(详细)](https://img.taocdn.com/s3/m/c6fb121d59eef8c75fbfb39c.png)
§6.2 符号的主要属性及作用
例: int a; float b; struct cc{ int d; float e; // 外部定义的整型变量a // 外部定义的实型变量b // 外部定义的结构类型cc, cc的第一个结构分量d // cc的第二个结构分量t … // 外部定义的结构型变量c
编译程序分析到下述两个说明语句int则在符号表中收集到关于符号a的属性是一个整型变量关于符号b的属性是具有5个浮点型元素的一维数61二上下文语义的合法性检查的依据同一个标识符可能在程序的不同地方出现而有关该符号的属性是在不同情况下收集的
编译原理
第六章 符号表
§6.1 符号表的作用和地位
在编译程序中符号表用来存放语言程序中出现的有关 标识符的属性信息 属性信息,这些信息集中反映了标识符的语 属性信息 语 义特征属性。 在词法分析 语法分析 词法分析及语法分析 词法分析 语法分析过程中,不断积累和更新表中 的信息。 在词法分析到代码生成的各阶段 各阶段,按各自的需要从表 各阶段 中获取不同的属性信息。
§6.2 符号的主要属性及作用
外部变量)被指定分配到该公共静态存储区 公共静态存储区中。 公共变量(外部变量 公共变量 外部变量 公共静态存储区 C/C++中的外部变量就属于这类共静态存储区的分配。在公共静 态区中的变量具有的生命周期是该程序运行的全过程,且其作用 域亦是整个语言程序。 编译程序为局部静态量 局部静态量可设立若干个局部静态区 局部静态区。 局部静态量 局部静态区 对外部静态量 外部静态量,为每个程序文件建立一个局部静态区,对内部静 外部静态量 内部静 态量,则为每个具有内部静态量定义 具有内部静态量定义的函数或过程,建立一个局 态量 具有内部静态量定义 局 部静态区。 部静态区 被Static所定义的符号变量具有的生命周期也是该程序运行的全 过程。但被Static定义的变量若在函数之外则为所在之文件中所 有函数可视。而若变量在函数内被定义为Static,则它仅为所在 函数可视。分别分配不同的静态变量,这仅是编译处理上的问题, 与语言无关。
编译原理课件06符号表的组织与管理
![编译原理课件06符号表的组织与管理](https://img.taocdn.com/s3/m/b1ae0cd4b14e852458fb5779.png)
44
若一个函数是无参的,则该函数符号项中“函数-形参” 指
针域值为“空”,若某个形式参数是它所属函数的最后 一 个形式参数,则该形参符号项中“函数-形参”指针域 值
为“空”
例如,有函数: func1 (para1,para2,para3) func2 ( )
45
在符号表中得到如图9.11的表示:
首先要确定其被分配的区域
其次是根据变量出现的次序 而有关区域的标志及相对位置都是作为该变量的语义信息 被收集在该变量的符号表属性中
6
符号的主要属性及作用
语言符号可分为:关键字符号、操作符 符号、标识符符号 1.符号名:
标识符:变量的名字、函数的名字、过程的 名字 通常把一个标识符在符号表中的位置的整数 值称之为该标识符的内部代码 在经过分析处理的语言程序中标识符不再是 一个字符串而是一个整数值
8
3.符号的存储类别:
一种是用关键字指定,例如在FORTRAN中用COMMAN来
定义公共存储区变量,用SAVE来定义函数或过程的内部静 态存储变量,在C语言中用static定义是属于文件的静态存 储变量或属性函数内部的静态存储变量,用regist定义使用 寄存器存储的变量
9
另一种方式是根据定义变量说明在程序中的位置来决定, 例如在C语言中,在函数体外默认存储类关键字所定义的 变量是外部变量,即程序的公共存储变量,而在函数体内 默认存储类关键字所定义的变量是内部变量,即属性该函
3
二.符号表的功能
收集有关标识符的属性,并在符号表中建立符号的 相应属性信息 例如:int A; float B[5]; 2. 上下文语义的合法性检查的依据: 检查标识符属性在上下文中的一致性和合法性 例如,在C语言中同一个标识符可作引用说明和定义说明 ┇ int i[3,5]; //定义说明i ┇ extern float i; // 引用说明i ┇
第9章符号表
![第9章符号表](https://img.taocdn.com/s3/m/4383645465ce0508773213d8.png)
defined false
表示尚未定义
(2)表示符号的数据类型可以用若干个bit位来表示;也可 用1个整型量来表示(C语言为例)
data-type Char Short int long
unsigned float double
3个bit位 000
001 或
010 011 100 101 110
data-type char short int long
在目标代码生成阶段,当对符号名进行地址分配时, 符号表是地址分配的依据。
一张符号表的的组成:包括两项,即名字栏和信 息栏。
名字栏(NAME)
信息栏 (INFORMATION)
信息栏包含许多子栏和标志位,用来记录相应名
字和种种不同属性,名字栏也称主栏。主栏的 内容称为操作大致可 归纳为五类:
不等长关键字段符号表---采用关键字池的 索引结构。
例如我们有一组标识符 an exempler of key-wrds field 关键字段的组织结构如图。 在此结构中,关键字池可以是一个字符数组,也可以是一个字符串空间。如
果关键字池是字符数组时,符号表中关键字段可以是一个整型数值段,整型值表 示该关键字在池中位置的下标。若关键字是一个字符串,则符号表中关键字段可 以是一个指向字符的指针,指针指向该关键字在池中的位置。P是指向池的空区。
……
则符号表中表项排列将如图所示: 其中h表示该符号表之表头,是表的开 始位置,p表示该符号表的表项是符号表当 前的结束位置。
② 排序组织及二分法
语言中的每一个符号,排序组织的符号表,就是在符号表中的表项按 其符号的字符代码串(可以看成一个整数值)的值的大小从大到小(或 从小到大)排列的。对上述例子中的符号出现情况按排序组织得到的符 号表将如图所示:
- 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项.