




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
新工科建设·计算机类系列教材
免费提供编译原理16目录第一章引言第二章形式语言理论基础第三章自动机理论基础第四章词法分析第五章语法分析—自顶向下分析方法第六章语法分析—自底向上分析方法第七章语义分析及中间代码的生成第八章代码优化第九章目标代码的生成第十章符号表和出错处理第十一章
面向对象语言的编译第十二章
并行编译技术第十三章
软件构造22024/11/63学习目标10符号表和出错处理
符号表在整个编译期间的作用主要有两条:一是辅助语义的(即上下文有关的)正确性检查;二是辅助代码生成。着重需要掌握以下内容符号表的作用符号表中的内容嵌套结构语言的栈式符号表
目录10.1符号表的结构与存放10.2符号表的建立10.3程序的错误10.4出错处理10.5本章小结4
符号表是一个包含程序中的变量、子程序、常量、过程定义、数组信息等内容的数据库。
一般地,符号表由一些表项组成二维表格。
名字域
—存放符号或其内部码每个表项
属性域
—存放属性和特征例如:
名字域属性域名字1属性1......名字n属性n10.1符号表的结构和存放符号表的组织方式简单方式:固定名字域和属性域的长度。
有的语言标识符长度不超过6个字符,可定为6位。间接方式:在符号表的名字域中存放一个指针或一个指针和一个整数,把标识符存放到一个字符串数组中。见图10.210.1.1符号表的组织和内容符号表的内容
属性域的内容因符号表名字域内容不同而不同。例如数组:维数、下标界偶、存储区域等信息数组信息向量表。如图10.3。
静态表(编译前事先构造好):保留字表、标符号表
准函数名表等。
动态表(编译过程中根据需要构造的表):变量名表数组信息表、过程信息表等。10.1.1符号表的组织和内容变量表
如图10.4线性表(无序符号表):按程序中符号出现的先后次序建立的表。如图10.5查找方式:只能线性查找,(查找效率低),结构简单,节省空间,适合于比较小的表。10.1.2线性符号表名字类型地址SUM实型100AVER实型102COUNT整型104项数名字域属性域1a……2ave……3b1……4sum……………
有序符号表:按一定顺序(如字典顺序)排列符号。如图10.6、10.7查找:折半查找法,查找效率较高。
但填入表时会增加移动开销。10.1.3有序符号表项数名字域属性域1a……2ave……3b1……4sum……………
散列符号表(哈希符号表):利用哈希函数值确定符号在表中的位置。hash函数性质:·函数值只依赖于对应符号·函数计算简单、高效·函数值能较均匀分布如:除法散列函数、乘法散列函数、多项式除法散列函数、平方取中散列函数等。“质数除余法”见图10.8查询效率较高,但要解决散列冲突问题。10.1.4散列符号表(哈希符号表)设计一个栈,新符号出现从栈顶压入。查找时从栈顶→栈底例
PASCAL语言分程序嵌套结构例10-1程序的栈式符号表如图10.9、10.10、10.11查找时,最新加入的符号总是最先查找。
适合嵌套结构的程序设计语言,但表太大时,查找速度较慢。10.1.5栈式符号表10.2.1符号表的建立12一、符号表的初始化渐增符号表。如线性符号表和有序符号表
定长符号表。如散列符号表在初始状态时,表的内容都应该为空。一般符号表在词法分析时创建,其它阶段都可能要填表。如图10.12、10.1310.2.2符号表的查填一、对符号表的操作
·对给定符号,查看是否是在表中
·对没查到的符号,向表中填入
·对已查到的符号,查询有关信息
·对已查到的符号,增加或更新有关信息
·删除一个或一组无用表项二、查填符号表的形式可分为两种情况:
1、隐式说明语言的符号表查填如FORTRAN“I–N”规则。语句中每出现一个符号均需查表,当第一次出现时填表。142、显式说明语言的符号表查填如Pascal、C语言
说明部分:出现的符号,先查表,若没有,则填表。语句部分:出现的符号,先查表,若查不到,到外层
查(对于分程序结构),最后仍未查到,说明该符号未
定义,输出出错信息。10.2.2符号表的查填通常用程序设计语言编写的源程序往往包含一些错误,很少能一次在机器上通过,并算出预期结果,需要反复修改和调试。所以,人们希望编译程序能有较强的错误处理能力,能检查出程序中的各种错误,并准确无误地报告出这些错误的性质和位置。1510.3程序的错误
编译程序用来对源程序进行编译,当程序在语法(包括词法)上正确时,可以得到相应的等价的目标代码。当程序在语义上正确时,以正确的输入数据运行目标代码可以得到预期的输出结果。然而,一个程序,尤其是大型软件的程序,其中难免包含错误。1610.3.1错误存在的必然性1710.3.2错误的种类①词法错误。②语法错误。③语义错误。④违反环境限制的错误。程序错误的种类
在编译的过程中,发现源程序的错误时采取一定的措施,使得能继续编译下去,这称为错误复原。如果把所给不正确程序变换成正确的程序,则称之为错误校正。在错误复原时,应重视以下两个方面: 1.株连信息的遏止。 2.重复信息的遏止。1810.3.3错误复原词法的错误:词法分析时发现的词法错误大多是单词拼写错误语法的错误:不同的语法分析技术发现错误的手段和方式是不同的语义的错误:一般分为两类,一类是在编译时可以发现的静态语义错误,另一类是在运行时才能发现的动态语义错误。1910.4出错处理2010.4.1词法错误的处理
词法分析时发现的词法错误大多是单词拼写错误,这或者是因为书写错误,或者是因为输入错误假定不会有连续几个字符的错误,可以假定有如下几类词法错误:拼错一个字符,如RECORD错写成RCCORD。遗漏一个字符,如REPEAT错写成REPET。多拼一个字符,如UNTIL错写成UNTILE。相邻两个字符颠倒了次序,如LABEL错写成LABLE。基于前面对词法错误的假设,不存在连续几个字符都出错的现象,对词法错误的校正一般有以下几种方法:删除一个字符插入一个字符。替换一个字符。交换相邻两个字符。2110.4.1词法错误的处理2210.4.2语法错误的处理对于语法错误的处理,与词法错误的情况一样,自然涉及下列种类:错误的查出错误的定位错误的局部化重复错误信息的遏止2310.4.2语法错误的处理解决语法错误的处理主要有以下两种方法:自顶向下分析中错误的处理自底向上分析中错误的处理
2410.4.3语义错误的处理语义错误一般分为两类,一类是在编译时可以发现的静态语义错误,另一类是在运行时才能发现的动态语义错误。它主要分为下面两种类型:静态语义错误动态语义错误2510.4.3语义错误的处理语义错误往往难以采用系统而有效的方法来发现和处理。在语义分析时采用语法制导的翻译,通过语法制导定义或翻译方案实现类型一致性检查和某些控制流静态语义检查等,可以发现源程序中运算符不合法、运算分量类型不相容以及控制流方面的静态语义错误。为了发现其他的动态语义错误,通常采用以下两种方式:1.静态模拟检查;2.利用调试工具。2610.5本章小结1.符号表是用来存放编译程序各个阶段收集的、出现在源程序中的各种名字的类型和特征第有关信息,并供编译程序用于进行语法检查、语义检
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论