编译原理教程第二版课件作者胡元义第6-8章节第8章节.pptVIP

编译原理教程第二版课件作者胡元义第6-8章节第8章节.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
图8–7 线性符号表 图8–8 有序符号表   对于有序符号表,一般采用折半查找法进行查表,即首先从表的中项开始比较,如果未找到则将查找范围缩小一半,然后继续查找,直到找到或查找失败为止。使用这种折半查找法对一个含有N项的符号表来说,查找其中的一项最多只需做1+lbN次比较。虽然这种查找法的效率有所提高,但是对于一个边填写边引用的动态查找符号表来说,每填进一项就引起表中内容重新排序,这无疑会增加时间的开销。   对于动态查找的符号表,可以采用二叉树结构来组织有序符号表。对二叉树中的任一结点P来说,它的左子树上的任何结点都大于结点P的值,而右子树上的任何结点都小于结点P的值(见图8–9),这样一棵二叉树实际上是二叉排序树。每当向符号表中填入一项时,总是将其作为二叉排序树的叶结点插入到合适位置。查找的过程也是这样,首先将给定值K与二叉排序树根结点值比较,若相等则查找成功;若不等,则当根结点值小于K时到根的左子树去继续查找,否则到根的右子树去继续查找。在随机情况下,二叉排序树的平均查找长度为1+4lbN。较之折半查找法,虽然二叉排序树的查找速度略有降低,但它大大减少了生成有序符号表的时间,是一种较好的有序符号表结构。 图8–9 二叉排序树   3.散列符号表   散列符号表是大多数编译程序采用的一种符号表。符号表采用散列技术,相对来讲具有较高的运行效率,特别适用于边填写边引用的动态查找符号表。   散列符号表又称哈希符号表,其关键在于引进了一种函数——哈希函数,并将程序中出现的标识符通过哈希函数进行映射,得到的函数值作为该标识符在符号表中的位置。   哈希函数(Hash)一般具有如下性质:   (1) 函数值只依赖于对应的标识符;   (2) 函数的计算简单且高效;   (3) 函数值能比较均匀地分布在一定范围内。   构造散列函数的方法很多,如直接定址法、数字分析法、平方取中法和除留余数法等。散列表的表长通常是一个定值N,因此散列函数应该将标识符的编码散列成0~N?1之间的某一个值,以便每一个标识符都能散列到这样的符号表中。   由于用户使用的标识符是随机的,因而很难找到一种散列函数使得标识符与函数值一一对应。两个或两个以上的不同标识符散列到同一表项地址的情况称为散列冲突。由于冲突是不可避免的,因此,解决冲突问题也是构造散列符号表要考虑的重要问题。关于冲突的处理,详见“数据结构”课程中的有关内容。 8.1.6 符号表的内容   对于常见的程序设计语言而言,其变量名及过程名登记项的信息栏通常包含如下信息:   (1) 变量名:   ① 种属(简单变量、数组、记录结构等);   ② 类型(整型、实型、双精度实型、逻辑型、字符串型、标号或指针等);   ③ 所分配的数据区地址(一般为相对地址);   ④ 若为数组,应填写其内情向量并给出内情向量的首址;   ⑤ 若为记录结构,则应把该登记项与其各分量(即域)按某种方式连接起来;   ⑥ 是否为形式参数,若是则应记录其类型;   ⑦ 定义性出现或引用性出现标志(指标号);   ⑧ 是否对该变量进行过赋值的标志,等等。   (2) 过程名:   ① 是否为程序的外部过程;   ② 若为函数,应指出它的类型;   ③ 是否处理过相应的过程或函数定义;   ④ 是否递归定义;   ⑤ 指出过程的形参,并按形参排列的顺序将它们的种属、类型等信息与过程名相联系,以便其后检查实参在顺序、种属及类型上是否与形参一致。 8.2.1 语法错误的校正   1.单词错误的校正   词法分析的主要任务是把字符串形式的源程序转换为一个单词系列。由于每一类单词都可以用某一正规式表示,因而在识别源程序中的单词符号时,通常采用一种匹配最长子串的策略。如果在识别单词的过程中发现当前余留的输入字符串的任何前缀都不能和所有词型相匹配,则调用单词出错程序进行处理。然而,由于词法分析阶段不能收集到足够的源程序信息,因此让词法分析程序担负校正单词错误的工作是不恰当的,事实上还没有一种适用于各种词法错误的校正方法。最直接的做法是,每当发现一个词法错误时,就跳过其后的字符直到出现下一个单词为止。 8.2 错 误 处 理   单词中的错误多数属于字符拼写错误,通常采用一种“最小海明距离法”来纠正单词中的错误。当发现源程序中的一个单词错误时,程序试图将错误单词的字符串修改成一个合法的单词。我们以插入、删除和改变字符个数最小为准则考虑下面几种情况:   (1) 若知道下一步是处理一个关键字,但当前扫描的余留输入字符串的头几个字符却无法构成一个关键字,此时可查关键字表并从中选出一个与此开头若干字符最接近的关键字来替换。   (2) 如果源程序中某标识符有拼写错误,则以此标识符查符号表,并用符号表中与之最接近的标识符取代它。

您可能关注的文档

文档评论(0)

时间加速器 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档