第九章符号表与错误处理

合集下载

符号表专题知识讲座

符号表专题知识讲座


网 :
在一起

业 的
➢优点:每个符号表中存储符号旳属性个数和构造
计 算
完全相同


习 网
➢缺陷:一种编译程序将同步管理若干个符号表,
站 增长了总体管理旳工作量和复杂度
23
❖第2种:把全部语言中旳符号都组织在一张符号表中

威 网
➢优点:总体管理非常集中单一,且不同种类符号旳共
: 专
同属性可一致地管理和处理
机 学 习
空间大小等。

站 对于指针:所指对象类型等。
10
五.符号表旳功能
1.搜集符号属性




专 业
2.上下文语义旳正当性检验旳根据





习 网
3.作为目旳代码生成阶段地址分配旳根据

11
六.符号表旳分类
静态表:事先构造好旳表,如保存字表、原则
盛 威
函数名表等。需要时去查相应旳此类
网 :
号表LT和四元式表QT
31
符号名表SNT
NAME INFORMATION
(1)M 参数,整数,变量
盛 (2)N 参数,整数,变量

网 :
(3)K
整数,变量



计 算 机
常数表CT
学 习
值(VALUE)


(1) 1
(2) 4
32
入口名表ENT
NAME
INFORMATION
(1)INCWAP 二目子程序,入口QT(1)
学 习
地址:变量所分配单元旳首址或地址位移

胡元义版编译原理课后习题答案

胡元义版编译原理课后习题答案
(3) S→a (4) L→S (5) L→S;L
则文法G[S′]的LR(0)项目集示范族为 I0:S′→·S I4:S→a· I10:L→S;·L I5 : S→while e· do s I6 : S→begin L·end I7 : L→S· S→·while e do S L→·S S→·begin L end L→·S;L S→·a S→·while e do S
所有外层分程序的符号表都无法找到此标识符,则表
明程序中使用了一个未经说明 ( 定义 )的标识符,此时 可按语法错误予以处理。
8.4 对下列程序,当编译程序编译到箭头所指位 置时,画出其层次表(分程序索引表)和符号表: program stack(output); var m, n:integer; r:real;
w h ile L S ; I4 I7 a s I1 0 I6 b eg in en d I9 w h ile L I1 2 a
图8-2 习题8.5中文法G[S′]的DFA
在 LR(0) 项 目 集 规 范 族 中 , 只 有 I7 含 有 “ 移 进”/“归约”冲突,且该冲突可用SLR(1)方法解决。
图8-1 分程序索引表和符号表示意图
8.5 已知文法G[S]: S→while (e) S S→{L}
S→a
L→S;L L→S
/*a代表赋值句*/
构造该文法的LR型的错误校正分析程序。
【解答】 首先将文法G[S]拓广为G[S′]:(0) S′→S (1) S→while e do S
(2) S→begin L end
号的处理,这就需要用到语法符号的相关属性。为了在需
要时能找到这些语法成分及其相关属性,就必须使用一些 表格来保存这些语法成分及其属性,这些表格就是符号表。

PLC21-功能指令(第九章)

PLC21-功能指令(第九章)

2.减法运算指令 对有符号数进行相减操作,包括整数减法、双整数减法、 实数减法。 梯形图表示:
语句表示:整数减法指令“-I IN1,OUT”;双整数减法指 令“ - D IN1,OUT”;实数减法指令“ - R IN1,OUT”。
当信号EN=1时,被减数IN1与减数IN2相减,其结果传送到 OUT中。
四、比较指令 数值比较指令用于比较两个数值; 字符串比较指令用于比较两个字符串的ASCll码字符。
操作数按指定条件进行比较。
条件成立时,触点闭合,所以实际上是一种位指令。 仅说明数值比较指令 . 类型有:字节比较、整数比较、双字整数比较和实数比较。 字节比较是无符号的,其它类型为有符号的。 比较指令的关系符有:等于=、大于>、小于<、不等<>、 大于等于>=、小于等于<= 等6种。 对比较指令可进行LD、 A和O编程。以关系符“=”为例说明。
4. 正弦、余弦、正切指令
梯形图表示:
语句表示:正弦指令“SIN IN,OUT”;余弦指令“COS IN,OUT”;正切指令“TAN IN,OUT”。
当允许信号EN=1时,将一个双字长(32位)的实数弧度 值IN分别取正弦、余弦、正切,各得到32位的实数结果传送 到OUT中。 如果已知输入值为角度,要先将角度值转化为弧度值, 使用“(*R)MUL_R”指令,用角度值乘以π /180。
当信号EN=l时,被乘数IN1与乘数IN2相乘,结果送到OUT 中。在语句表示中,要先将被乘数送到OUT中,然后和IN1中 的数据进行相乘,溢出以及输入非法参数或运算中产生非法值, 都会使特殊标志SM1.1置位。
4.除法运算指令 对有符号数进行相除操作,包括:整数除法、双整数除法、 完全整数除法和实数除法。
3.块传送指令 字节块(BMB)的传送、字块(BMW)的传送和双字块的 传送(BMD)指令传倒数量的数据到一个新的存储区,数据的 起始地址为IN,数据的长度为N个字节、字或双字。 新块的起站地址为OUT。N的范围从l至255。

第9-10章 符号表管理和存储组织

第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)如果不能和任何空闲块合并,则可以把空闲块链成 一个链表。再进行分配时,从空闲块链表中找出满足需要 的一块,或者整块分配出去,或者从该块上分割一小块分 配出去。

《符号表简介》课件

《符号表简介》课件

保持搜索树的平衡性,提高查找性能。
3 缓存技术应用
4 优化算法实现
利用缓存技术减少查找次数,提高符号表 的访问速度。
通过使用更高效的数据结构和算法,提升 符号表的整体性能。
总结与展望
通过本次《符号表简介》的PPT课件,我们深入了解了符号表的定义与作用,常见数据结构及其应用, 代码实例演示,查找算法简介,动态符号表操作以及性能优化方法。希望本次课程能够为大家带来启发 与收获!
哈希查找
利用哈希函数将标识符映射到存储桶,实现 O(1)的平均查找时作
插入操作
将新的标识符和相关信息插入到符号表中的适当 位置。
删除操作
从符号表中删除指定的标识符和相关信息。
符号表性能优化方法
1 散列函数优化
2 搜索树平衡
设计高效的哈希函数,降低冲突和查找时 间。
3
Trie树
使用字典树的数据结构,实现对字符串的前缀匹配和查找操作。
符号表中的查找算法简介
简单查找
逐个比较标识符直到找到匹配项。时间复杂 度为O(n)。
平衡搜索树
通过平衡二叉搜索树结构,实现对有序符号 表的高效查找。
二分查找
对有序符号表进行查找,通过递归地分半查 找提高效率。时间复杂度为O(log n)。
《符号表简介》PPT课件
欢迎大家来到本次《符号表简介》的PPT课件!在本次课件中,我们将一起 探索符号表的定义与作用,常见数据结构及其符号表应用,以及代码实例演 示。让我们开始吧!
符号表的定义与作用
1 什么是符号表?
符号表是一种数据结构,用于存储和管理程序中的标识符及其关联信息。
2 符号表的作用
符号表在编程语言和编译器中起到关键作用,提供了标识符的唯一性、类型信息、内存 位置等。

第9章 符号表

第9章 符号表

9.2 符号的主要属性
不同语言定义的标识符属性不尽相同, 不同语言定义的标识符属性不尽相同,以下几 种通用的属性: 种通用的属性:
符号名 符号的类型 符号的存储类型 符号的作用域及可视性 符号变量的存储分配信息 符号的其它属性
数组内情向量 记录结构型的成员信息 函数及过程的形参
Байду номын сангаас
第9章 符号表
9.1 符号表的作用 9.2 符号表的主要属性
9.1 符号表的作用
在编译程序中符号表用来存放语言程序中出现 的有关标识符的属性信息, 的有关标识符的属性信息,这些信息集中反映 了标识符的语义特征属性。 了标识符的语义特征属性。 符号表的作用: 符号表的作用:
收集符号属性 提供上下文语义的合法性检查的依据 作为目标代码生成阶段地址分配的依据

《编译原理符号表》PPT课件

《编译原理符号表》PPT课件

精选课件ppt
26
符号表的总体组织
属性3栏与属性4栏冗余,可将其合并;
增加了符号表管理和运行的复杂性,但减少了空间开销;
精选课件ppt
27
符号表的总体组织
总结:
为便于符号表的组织管理,每张符号表的表长通常为定 长是合理的;
每张符号表可以看作是一个多元组,每个元组由若干属 性组成,元组之间有相同的成员个数和一致的排列;
下推链域的组织
精选课件ppt
40
等长属性值域组织
可以取相应的数据类型表达属性值
符号布尔性质的属性域
defined 1(true) 表示已定义
defined 0(false) 表示未定义
表示符号的基本数据类型
Data-type 3个bit位(整型值)
Char
0 0 0 (0)
short
散列组织
对符号进行某种函数操作(杂凑函数)所得的函数值确 定它在符号表的位置;
Vhash = fhash(符号代码值)
改进:Lhash = mod(Vhash,N) ……….. …a…… ……..b.. …..a….. ……..d.. …c……. ……b….
精选课件ppt
33
符号表项的排列
▪ 函数外表示文件可视性,函数内表示所在函数可视;
动态存储区:生命周期是定义该变量的局部范围;
精选课件ppt
15
标识符符号的属性(信息)
具体位置:
按该变量在存储区类分别依出现先后的次序排列下 相对该存储区表头的相对位移量来表示的;
… Int a; …. float b; … Struct cc{
元组之间的区分由表项中“符号”一栏区分;
精选课件ppt

编译原理符号表的原理及典型实例

编译原理符号表的原理及典型实例

05
符号表的设计与实现
符号表的数据结构设计
符号表的数据结构应满足高效、 易扩展和易维护的要求,通常 采用哈希表、二叉树等数据结
构实现。
符号表应包含符号名称、符 号类型、符号属性等信息, 以便在编译过程中快速查找
和识别符号。
符号表还应支持动态添加、删 除和修改等操作,以适应源代
码中符号的变化。
符号表的实现算法
常量名的符号表实例
总结词
常量名符号表实例展示了如何使用符号表来管理程序中的常量。
详细描述
常量名符号表记录了常量的名称、类型和值等信息。通过符号表,编译器能够方 便地查找常量的定义和使用,并进行相应的语义分析和代码生成。在处理常量时 ,符号表有助于编译器优化程序的性能,例如常量折叠和常量传播等。
04
编译原理符号表的原 理及典型实例
目录
• 编译原理符号表概述 • 符号表的原理 • 符号表的典型实例 • 符号表在编译过程中的应用 • 符号表的设计与实现
01
编译原理符号表概述
符号表的概念
符号表是一种用于存储程序中标识符 信息的数据结构,主要用于编译过程 中对标识符进行跟踪和管理。
符号表中的每个条目都包含有关标识 符的信息,如名称、类型、作用域等。
如果符号表中存在该标识符的信息,编译器就可以 使用这些信息来生成相应的代码。
符号表的更新
01
在编译过程中,符号表可能会被更新以反映源代码的变化。
02
当源代码中添加、删除或修改标识符时,符号表中的相关信息
也需要相应地更新。
更新符号表的过程通常涉及到在哈希表中插入、删除或修改相
03
应的条目。
03
符号表的典型实例
典型实例

第9章符号表

第9章符号表

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表示该符号表的表项是符号表当 前的结束位置。
② 排序组织及二分法
语言中的每一个符号,排序组织的符号表,就是在符号表中的表项按 其符号的字符代码串(可以看成一个整数值)的值的大小从大到小(或 从小到大)排列的。对上述例子中的符号出现情况按排序组织得到的符 号表将如图所示:

第9章 符号表

第9章 符号表

非块程序结构语言的符号表结构 2、有序表 在编译过程中,由于查找符号表的次数远大于插入符号表的 次数,所以如何提高符号表的查找效率直接影响编译的效率。 有序符号表的表项是根据变量名按字母顺序存放的。因此, 每次插入符号表前,首先要进行查表工作,以确定要插入的符号 在符号表中的位置,然后将符号插入。这样难免会造成原有一些 符号的移动,所以,这种符号表结构在插入符号时开销较大。对 于有序表,最常用的查找技术是折半查找法。
栈式符号表
对于块程序结构语言,其最简单的符号表结构为栈式符号 表,它包括一个符号表栈及一个块索引栈。
符号表栈记录变量的属性,块索引栈指出每个块的符号 表的开始位置。栈式符号表操作过程十分简单,当遇到变量声 明时,将包含变量的属性压入堆栈;当遇到块程序开始时,将 当前的符号表栈顶位置压入块索引栈,从而开始一个新块的变 量处理;当到达块程序结尾时,则根据块索引栈指出的本块的 开始为位置,将该块程序中声明的所有变量记录弹出堆栈,从 而使局部声明的变量在块外不再存在。
第9章 符号表管理技术
在编译的各个阶段经常要收集、使用出现在源程序中的各种信 息,通常把这些信息用一些表格进行记录、存储和管理,如常量表、 数组信息表等等,这些表统称为符号表。
符号表的作用∶ 保存各类标识符的属性 检查语义的正确性 作为目标代码生成阶段地址分配的依据 符号表的作用是通过插入和检索符号表中记录的标识符属性来 实现的。这些属性(如名字、类型、维数等)在声明语句中可直接找 到,有些可根据程序中标识符出现的上下文间接地获得。 在编译时,源程序中每出现一次标识符,就要与符号表打一次 交道,主要工作是查表和存取操作,因此,与符号表的交互占据了 大量的编译时间。所以,如何有效地操作符号表直接影响编译的效 率。
编译到第10行时,有效变量为test1,f, j,fun2, fun1,name, y,x。

第八章 符号表与错误处理

第八章 符号表与错误处理
• 一般的线性表 如:数组,链表,等 • 有序表 查询较无序表快,如可以采用折半查找
• 二叉搜索树
• Hash表
符号表体现作用域信息
作用域与可见性 作用域与符号表组织
• 所有作用域共用一个全局符号表
• 每个作用域都有各自的符号表
作用域与可见性
嵌套的作用域(nested scopes) 开作用域与闭作用域(相应于程序中特殊点)
• 数组内情向量 • 记录结构的成员信息 (如成员的个数、名 称、类型、偏移等) • 函数及过程的形参
符号表的相关操作
创建符号表 在编译开始,或进入一个作用域
插入表项 在遇到新的标识符声明时进行 查询表项 在引用标识符时进行 修改表项 在获得新的语义值信息时进行 删除表项 在标识符成为不可见/不再需要它的任何
field
crash
function

错误处理
错误处理的能力 错误的种类
语法错误的校正
语义错误的校正
错误处理的能力
诊断出各类错误的能力。 准确指出出错位置和错误性质的能力。 通过一次编译找出尽可能多的源程序中错误的 能力。 一定的错误改正能力。
注意:编译器不能以发现错误就停止 编译,而是要对错误进行适当地处理, 从而使编译工作能够继续进行。
• 在当前作用域成为闭作用域时,从栈顶弹出相应的 符号表
所有嵌套的作用域共用一个 全局符号表
【例】右边程序在处理到/*here*/时 的符号表(以哈希表为例) t(2) x(3)

p(1) x(2)
a(1)
x(1)
s(2) Hash Table
r(1)
y(1)
const a=25; var x,y; procedure p; var z; begin …… end; procedure r; var x, s; procedure t; var x; begin …… /*here*/ end; begin …… end; begin …… end.

符号表的组织和管理演示文稿

符号表的组织和管理演示文稿
符号表的组织和管理演示文稿
(优选)符号表的组织和管理
– 例 C语言的变量声明
short int a;
float b = 0.0;
– 把标识符a声明为短整数型,把b声明为浮点类型, 而且初始化为0。那么,编译程序对每个变量要记 录它的类型,以便执行类型检查和分配存储,比如 短整型变量i占2个字节;要记录它在存储器中的位 置(相对位移或绝对地址),以便目标程序运行时 访问;若像b有初始值,则还需要记录这个初始值。
• 例如,对应不同的参数类型,可以定义几个求和重载函数:
int sum ( int a, int b)
double sum ( double a, double b)
float sum(float a, float b, float c)
• 当某个函数中调用到重载函数时,于一个变量名要记录其类型(如整型、实型、布尔型等)、占用 的存储字节以及相对与某个基准位置的相对位置;
• 对一个过程名要记录的属性包括参数的个数及其类型,该过程是否 有返回值,过程中的变量声明,甚至过程声明(如果像Pascal语言 允许嵌套过程声明)等信息。
不同的程序语言规定了符号 的不同性质以及语法、语义和规 则,几种基本的符号属性。
– 首先是要确定变量存储的区域。例如,在Java语言中,整数 的类型(以及所占用的字节)有byte(1个字节)、short(2 个字节)、int(4个字节)以及long(8个字节),而float类 型占4个字节,double类型占8个字节。又如,对寄存器变量, 编译将尽可能地把它们保留在机器的寄存器当中,以提高运 行速度;而对在一个文件中定义的外部变量,它们要在不同 的源程序文件之间访问,需要编译程序把它们放在所有源程 序文件都可以方便寻找到的存储器的位置。

C语言9

C语言9

第 九 章 编 译 预 处 理
7-1
宏定义 不带参数的宏定义 带参数的宏定义
7-1-1 7-1-2
7-2
7-3
文件包含
条件编译
9-1
宏定义
例9-1 请看下面的程序: #define PI 3.14159 main() {float r,l,s; scanf("%f",&r); l=2*PI*r; s=PI*r*r; printf("l=%7.2f,s=%7.2f\n",l,s); } 程序的第一行内容:#define PI 3.14159 就是一个宏定义,PI 称为宏名,其作用是用标识符PI代表3.14159这样一串字符。在此之后 的程序中就可以用标识符PI代替3.14159,称为宏引用。 预处理时,程序中的PI 将被所定义的串3.14159替换,称为宏展开 或宏替换,如程序中的语句:l=2*PI*r;和s=PI*r*r;中的宏展开后分别 为:l=2*3.14159*r;和s=3.14159*r*r;。 有两种形式的宏 :不带参数的宏和带参数的宏。
9-2
文件包含(1)
一个C 程序由若干个源程序组成,而一个源文件还可以将另一个源 文件的全部内容包含进来,即将指定源文件的内容包含在当前文件中。 例如有两个源文件file1.c和file2.c,文件的内容分别如下: file1.c的内容: int max(int x,int y) {int z; if(x>y) z=x; else z=y; return z; } file2.c的内容: #include "file1.c" main() {int a,b,c; scan("%d,%d",&a,&b); c=max(a,b); printf("c=%d\n",c); }

编译原理 符号表与错误处理

编译原理 符号表与错误处理

③当扫描到分程序的结束符END时, 将记入临时工作栈的本层分程序全部登记 项移至正式的符号表中,且修改 POINTER值使其指向本层分程序全部名 字登记项在符号表中的起始位置。此外, 退出此层分程序时,应使其直接外层分程 序成为当前分程序。 (3) 重复步骤(2),直至扫描完整个源程 序为止。
对一遍扫描的编译程序而言,在它工作 过程中,当遇到某分程序的结束符 END 时, 该分程序中的全部标识符已经完成它们的使 命。因此,只需将它们从栈中逐出,也即将 栈顶部指示器回调至刚进入本分程序时的情 况即可,而不再需要把这些登记项上移。事 实上,如上所述的工作栈就完全可作为编译 程序的符号表来使用,将这种符号表称为栈 式符号表。
8.2 常用符号表结构 由于在整个编译过程中需不断地访问符 号表,因而如何构造符号表以及如何查填符 号 表 就 成 为 编 译 程 序 设 计 的 重 要 问 题 之 一。 除了上述介绍的用于嵌套结构程序语言的栈 式符号表外,还有其它常用符号表结构。 1.线性符号表 符号表中最简单且最容易实现的数据结 构是线性表,它是按程序中标识符出现的先 后次序建立的符号表,编译程序不做任何整 理次序的工作。
8.4 符号表的内容(P234) 对于常见的程序设计语言而言,其变量名 及过程名登记项的信息栏通常包含如下信息: (1) 变量名 ①种属(简单变量、数组、记录结构等); ②类型(整型、实型、双精度实型、逻辑 型、字符串型、标号或指针等); ③所分配的数据区地址; ④若为数组,应填其内情向量并给出内情 向量的首址; ⑤若为记录结构,则应把该登记项与其各 分量按某种方式连接起来;
为实现上述查填表, 按如下方式组织符号表: (1) 分层组织符号表的登记项,使各分程 序的符号表登记项连续地排列在一起,不允 许被其内层分程序的符号表登记项所分割。 (2) 建立一个分程序表,记录各层分程序 符号表的有关信息。分程序表中的各登记项 在自左至右扫描源程序中按分程序出现的自 然顺序依次填入,且对每一分程序填写一个 登记项。因此,分程序表各登记项的序号隐 含地表征了各分程序的编号。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

致,因而不容易确定一个固定长度的空间来统一安排。
这时,可在符号表外另设一组存储空间,并在符号表 信息栏中放一指针来指向这个存储空间始址。
第9章 符号表与错误处理
例如,对数组标识符需要存储有关数组维数,每
维上、下界值,数组类型及数组存放的起始地址等信 息。如果将信息与名字一起全部放在符号表中,则因
维数不同而使记录该信息的空间大小不易确定,因此,
第9章 符号表与错误处理
第九章 符号表与 错误处理
基本知识点:符号表的作用及内容,符号表的数据结构 与符号表的组织。错误的种类、对错误的的处理方法。 重点:符号表的数据结构与符号表的组织。对错误的处 理方法。 难点:符号表的结构与符号表的操作,遏止重复错误的 方法。
第9章 符号表与错误处理
符号表的基本知识结构图

a 数组



图9.4 记录数组内情向量的符号表

第9章 符号表与错误处理
名字的作用域:
程序设计语言中一个名字可以出现在不同的范围内,
并且可以具有不同的意义。程序设计语言范围的划分可以 有两种不同的方式——并列的和嵌套的。不同的程序设计 语言,根据其提供的抽象方法不同,采用不同的范围划分 方式。例如,Pascal语言的过程定义,可以是嵌套的,即一 个过程内部可以再定义另一个过程;而C/C++语言的过程 只能是并列的,也就是说C/C++的过程中不能再定义过程, 但是C/C++允许程序块(block)嵌套,每个程序块的范围以花
通常给它们另外安排一个内情向量表来记录数组的全 部信息,同时在符号表的信息栏设置一指针指向内情 向量的入口地址(见图9.4)。此外,对像函数名、过程 名等含有较多信息且不容易规范信息长度的名字都可 以采取这种办法。
第9章 符号表与错误处理
符号表 Nam e In fo rm a t i o n
内情向量表 维数 下 界 i1 首地址 上 界 u1
符号名:若干非空字符组成 符号类型:整形、实型、字符型、逻辑型等 符号的存储类别 符号的作用域 符号变量的存储分配信息 符号的其它属性
第9章 符号表与错误处理
符号名即名字本身,即构成名字的字符串,原则上可以 由任意长的字符组成。当前的大部分编译器的编辑器或 文字处理器允许行的最大值超过256个字符。也就是说, 标识符长度原理上可以超过256个字符,而一般我们习 惯用的标识符长度在10个字符上下。如果把名字的字符 串信息本身直接存放在符号表中,则会造成很大浪费, 同时也无法解决极端情况。
int f(int a,int b)
{ int c; if(a>b) c=1; else c=0; return c; }
第9章 符号表与错误处理
v alu e Nam e a b c In fo rm a t i o n 整型,变量,形参 整型,变量,形参 整型,变量 Nam e (a) f 二目子程序,入口地址 (c) In fo rm a t i o n 1 0 (b)
第9章 符号表与错误处理
而目标代码生成时,编译程序将依据符号表中的符号
名来分配目标地址。几乎在编译程序工作的全过程中, 都需要对符号表进行频繁地访问(查表或填表),其耗费 的时间在整个编译过程中占有很大的比例。因此,合 理地组织符号表并相应选择好的查、填表方法是提高 编译程序工作效率的有效办法。 对于编译程序所用的符号表来说,它所涉及的基 本操作大致可以归纳为五类:
由于程序设计语言对源程序大小一般不做任何限制,符 号表中存放的名字的个数原则上也是无限的,符号表的存储 空间无论开设多大,都会有溢出的可能。因此,符号表的空 间存储,应该是可以动态扩充的。
第9章 符号表与错误处理
9.1 符号表的作用
在编译程序工作的过程中,需要不断收集、记录、 查证和使用源程序中的一些语法符号(简称为符号)的类
(5)指出过程的形式参数,并按形参排列的顺序将它们的种 属、类型等信息与过程名相联系,以便其后检查实参在顺 序、种属及类型上是否与形参一致。
第9章 符号表与错误处理
符号表的管理贯穿整个编译过程,既涉及前端, 也涉及后 端, 尤其与后端的存贮空间分配有密切联系。符号表的内容一 般仅在编译时使用,如果名字的具体信息需要在运行时确定 或者使用,则符号表的部分内容还要保留到运行时,例如动 态数组和跟踪调试信息等。符号表的信息组织与符号表数据 结构的安排对于编译的效率有重大影响。合理组织符号表的 内容,以适应不同阶段的需要,也是符号表设计需要考虑的 问题。
图9.3 按标识符种属组织的各种符号表 (a) 简单变量名表;(b) 常数表;(c) 函数入口名表
第9章 符号表与错误处理
根据符号表名字栏的组织特点,符号表信息栏的
组织方式也分为两类:固定信息内容和仅记录信息存 放地址。
如果名字栏中的标识符按种属分类,则因同类标
识符其基本特征一致,故可将这些信息一一记录在信 息栏中。 如果符号表的名字不分种属,则由于不同种属的 标识符其特征不一致,也即它们所需存储的信息不一
数组、标号等)、名字的类型(整型、实型、逻辑型、字
符型等)、特征(当前是定义性出现还是使用性出现等)、 给此名字分配的存储单元地址及与此名语义有关的其
它信息等。
第9章 符号表与错误处理
根据编译程序工作阶段的不同划分,名字表中的
各种信息将在编译程序工作过程中的适当时候填入。
对于在词法分析阶段就建立符号表的编译程序,当扫 描源程序识别出一个单词(名字)时,就以此名字查找符 号表;若表中无此名的登记项,就将此名字填入符号 表中;至于与此名相关的其它信息,可视工作方便分 别在语法分析、语义分析及中间代码生成等阶段陆续 填入。在语义分析时,符号表中的信息可以用于语义 检查;在代码优化时,编译程序则利用符号表提供的 信息选出恰当的代码进行优化;
名字的作用域,也可以说,仅从静态读程序就可确定名字的
作用域。
第9章 符号表与错误处理
(2) 最近嵌套原则(most closely nested)(下边的作用域规 则以程序块为例,但也适用于过程): ① 程序块B中声明的作用域包括B; ② 如果名字x不在B中声明,那么B中x的出现是在外围 程序块B'的x声明的作用域中,使得B'有x的声明,并且B'比 其它任何含x声明的程序块更接近被嵌套的B。 通俗地讲,名字的声明在离其最近的内层起作用,即
printf("%d %d\n",a,b);
}
/* 结果为:0,0 */
第9章 符号表与错误处理
在不同程序块中声明的a和b,它们的作用域分别为:
声 明
int a=0 int b=0 int b=1 int a=2 int b=3
作用域
B0-B2 B0-B1 B1-B3 B2 B3
图9.5 作用域表
第9章 符号表与错误处理
符号表的操作分为五类:
(1) 判断一个给定的名字是否在表中;
(2) 在表中填入新的名字; (3) 对给定的名字访问它在表中的有关信息; (4) 对给定的名字填入或更新它在表中的某些信息; (5) 从表中删去一个或一组无用的项。
第9章 符号表与错误处理
9.2
符号的主要属性和作用
型和特征等相关信息。为方便起见,一般的做法是让
编译程序在其工作过程中建立并保存一批表格,如常 数表、变量名表、数组内情向量表、过程或子程序名 表及标号表等,将它们统称为符号表或名字表。
第9章 符号表与错误处理
符号表中的每一项包括两个部分:
名字(标识符) 名字有关的信息 这些信息将全面地反映各个语法符号的属性以及它们 在编译过程中的特征,诸如名字的种属(常数、变量、
第9章 符号表与错误处理
9.3
符号表的组织
由于处理对象的作用和作用域可以有多种,所以符
号表也有多种组织方式。按照处理对象的特点,符号表
的组织方式一般可分为直接方式和间接方式。 直接方式是指在符号表中直接填入源程序中定义的
标识符及相关信息(如图9.1)。在图中,Name(名字)栏的
长度是固定的,这种栏目长度固定的表格易于组织、填 写或查找,因而是最简单的一种符号表组织方式, 它
符号表的间接组织方式。
第9章 符号表与错误处理
Nam e 7 5 3
In fo rm a t ro n … … …


S
T
U
D
E
N
T
G
R
A
N
D
A
G
E

图9.2 间接组织方式的符号表
第9章 符号表与错误处理
另一种组织方式是按标识符的种属,如简单变量、
数组、过程等分别建立不同的符号表,如简单变量名 表、数组名表、过程名表等。例如,下面的函数:
/* 最外层,不妨定为B0层 */
/* B1层,被B0嵌套 */ /* B2层,被B1嵌套 */ /* 结果为:2,1 */
/* B3层,与B2并列,并列的名字作用域不交叉 */ /* 结果为:0,3 */ /* 结果为:0,1 */
printf("%d %d\n",a,b);
}
printf("%d %d\n",a,b); }
(3)所分配的数据区地址(一般为相对地址);
(4)若为数组,应填写其内情向量并给出内情向量的首址;
(5)若为记录结构,则应把该登记项与其各分量按某种方式 连接起来;
(6)是否为形式参数,若是,则应记录其类型:
第9章 符号表与错误处理
(7)定义性出现或引用性出现标志; (8)是否对该变量进行过赋值的标志,等等。 过程名: (1)是否为程序的外部过程; (2)若为函数,应指出它的类型; (3)是否处理过相应的过程或函数定义; (4)是否递归定义;
相关文档
最新文档