第9部分 符号表与错误处理.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
(5) 把α插到aj之前,并从α的首部开始继续分析,即将i插入到“i=i+;”中,得到“i=i+i;”。 至此,我们完成了对输入串“i=i+)”的错误校正。 对递归下降分析器来说,虽然原则上可用上述校正错误的方法,但因无法将语法树已构造部分明显表示出来,故上述方法未必可行。 考虑到递归下降分析器实际上是由一组递归程序组成的,其中每一递归程序都对应一个文法的非终结符号,并且在语法分析的每一时刻,当前正在执行的递归程序也代表了与之对应的非终结符的未完成分支。 因此,我们可以采用这样的策略来校正源程序中的语法错误:在执行某递归程序中,当扫描到输入符号ai时发现一个语法错误,则除报错之外还将根据ai及它所表示的未完成分支的结构,尽量设法插入或删除一些符号对该错误进行校正,使语法分析能够继续进行下去;若无法做到这一点,则带着该语法错误的有关信息返回到调用此过程的上一层过程,在那里再谋求对语法错误进行校正。 此外,对LL(1)分析器和算符优先分析器,我们还可以用分析表作为工具来进行错误校正。 例如,使用LL(1)分析表会遇到两种语法分析错误: (1) 栈顶终结符与输入字符不匹配。 (2) 栈顶非终结符为A而输入字符为a,但分析表M[A,a]中为空。 处理这两种出错情况的基本思想是跳过一些分析步骤,继续进行分析。 具体有两种处理方法: (1) 将输入指针移向下一个输入字符,即跳过当前输入字符a,但分析栈不变。这种处理方法是把输入字符a作为多余的字符来处理,以寻求栈顶符号与下一个输入字符的匹配。 (2) 将栈顶符号弹出而输入字符不变,这意味着输入串中缺少了与栈顶终结符匹配的输入字符或与栈顶非终结符匹配的短语,由此可以跳过栈顶符号继续分析下去。 例如,表4.3的LL(1)分析表在增加了错误处理功能后如表9.1所示。 在这个分析表中,有两种错误入口: 一种仍用空白符,即输入指针移向下一个字符; 另一种用e标记,即弹出栈顶符号。 不难发现所有标记e的位置是由FOLLOW(E)={),#}、FOLLOW(T)={+,),#}和FOLLOW(F)={*,+,),#}所确定的。 3.自下而上分析中的错误校正 对于算符优先分析器来说,会产生这样一类错误:栈顶终结符和当前输入字符之间无优先关系。 此时,可在优先关系表中的相应位置标记错误处理子程序编号。 表9.2就是表4.7优先关系表增加了错误处理后的结果。 其中: (1) e1:栈顶符号为“i”或“)”而当前输入字符为“i”或“(”,即缺少运算符,这时可在当前输入字符之前插入假想运算符“+”。 (2) e2:栈顶符号为“(”而当前输入符号为“#”,即缺少右括号“)”,故从栈中弹出“(”。 (3) e3:栈顶符号为“#”而当前输入符号为“)”,即右括号不配对,故从输入串中删去“)”。 算符优先分析器会产生的另一类错误是:当按优先关系表进行归约时,却发现没有一个产生式的候选式可与分析栈中的“可归约串”匹配,这时应按下述几种情况处理: (1) 按“+”、“*”归约时,其两端均应有非终结符,否则表示缺少运算对象。 (2) 按“i”归约时,其两端若有非终结符,则表示缺少运算符。 (3) 按“(”、“)”归约时,在括号之间若没有非终结符,则表示缺少表达式。 LR分析器是根据分析表来确定各个分析动作的。当分析器处于某一状态s并面临输入符号为a时,就以符号对(s,a)查LR分析表。如果分析表中ACTION[s,a]栏为“空”(即在分析器当前格局下既不能移进输入符号a也不能将其归约),就表明已经发现了一个语法错误,此时分析器应调用相应的出错处理子程序进行处理。 因此,可以在ACTION表的每一空白项中填入一个指向相应出错处理子程序的编号。 至于每一出错处理子程序所完成的操作,则可根据各类语法错误所在语法结构的特点预先进行设计。

文档评论(0)

a13355589 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档