首页 理论教育 编译原理:LL(1)分析错误处理

编译原理:LL(1)分析错误处理

时间:2023-11-17 理论教育 版权反馈
【摘要】:LL分析中的错误处理有些分析程序还可以进行错误校正,试图从给出的不正确的程序中推断出正确的程序,如跳过某些单词、添加标点符号等。语法分析中的错误处理方法通常有以下几种。ε产生式一个非终结符的ε产生式可以当作默认值使用,这样可能推迟某些错误检查,但会减少在错误恢复期间必须考虑的非终结符数。对表4-1所示的LL分析表加入同步符号后,如表4-4所示。其中,“synch”表示由相应非终结符的后跟符号集得到的同步符号。

编译原理:LL(1)分析错误处理

语法错误是高级语言程序设计中最容易出现的错误,编译程序中的语法分析程序应至少能判断出一个程序在语句构成上是否正确,如果源程序包括语法错误,尽可能地判断具体的错误发生的位置和原因,给出有意义的错误信息,以便用户对源程序进行调试。反之,若程序中没有语法错误,分析程序不应声称有错误存在。

LL(1)分析中的错误处理

有些分析程序还可以进行错误校正,试图从给出的不正确的程序中推断出正确的程序,如跳过某些单词、添加标点符号等。若语法分析器发现了错误但不做错误校正,则很难生成有意义的错误信息。语法分析中的错误处理方法通常有以下几种。

(1)忽略方式:在分析某个句子时,当碰到某个不适当的符号时,忽略后继符号,直到遇到界符为止。与此同时,还应该从分析栈内移出该句已识别的部分。

(2)删除符号:这种方法很容易实现,完全不需要改变分析栈。当读入不适当的符号之后,就删除这个符号及后继的一些符号,直到遇到合适的符号为止。

(3)插入符号:在某些情况下,如缺少运算符、分界符等,以语法分析程序所做的工作最少为原则,在适当的位置添加适当的符号是合理的,此时应通知用户缺少相应的符号,但语法分析可以按正确结果继续进行。

(4)在产生式的适当位置添加相应的错误信息,或对产生式进行某些形式的改变以便能尽快从某种类型的错误中恢复过来。

存在的多种不同的语法分析方法处理和发现错误的方式也可能不一样。在预测分析过程中,出现了两种情况,则说明遇到了语法错误。第一,栈顶的终结符与当前输入符号不匹配;或者,非终结符A处于栈顶,面临输入符号a,但分析表项M[A,a]为空。

发现错误后,要尽快地从错误中恢复过来,使分析能继续进行下去。错误恢复的基本做法是跳过输入串中的一些符号直至遇到“同步符号”为止。这种做法的有效性依赖于同步符号集的选择,可以从以下几个方面考虑。

(1)FOLLOW(A)

如果忽略一些输入符号直到遇见FOLLOW(A)中的符号,然后再将A从栈中弹出,那么就可能使分析过程继续下去。

(2)将较高层的开始符号作为同步符号

语法结构之间常常存在层次结构,例如表达式是赋值语句的内层结构。如果语法要求语句以分号作为结束符,那么下一条语句开头的关键字将不在表达式的FOLLOW集中。在赋值语句后缺少分号的情况下,可能导致下一条语句开头的关键字被忽略。因此,可以将高层次语句的开始符号作为同步符号。(www.xing528.com)

(3)FIRST(A)

当FIRST(A)中的某个符号在输入中出现时,可以根据A恢复语法分析。

(4)ε产生式

一个非终结符的ε产生式可以当作默认值使用,这样可能推迟某些错误检查,但会减少在错误恢复期间必须考虑的非终结符数。

(5)所有终结符

如果栈顶的终结符号与输入符号不匹配,一种简单的想法就是将该终结符号弹出栈,并发出一条信息称已经插入了这个终结符号,同时继续进行语法分析。也就是,将不包括自身在内的所有终结符作为当前输入符的同步符号。

例4.9 对输入串)i*+i进行带有错误恢复的语法分析。

对表4-1所示的LL(1)分析表加入同步符号后,如表4-4所示。其中,“synch”表示由相应非终结符的后跟符号集得到的同步符号。

表4-4 加入同步符号的LL(1)分析表

分析时,若发现M[A,a]为空,则跳过输入符号a;若该项为“同步”,则弹出栈顶的非终结符;若栈顶的终结符号不匹配输入符号,则弹出栈顶的终结符。对输入串)i*+i带有错误恢复的分析过程如表4-5所示。

表4-5 )i*+i带有错误恢复的分析过程

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈