与算符优先分析器不同,LR语法分析器只要发现已扫描的输入出现一个不正确的后继符号就会立即报告错误。规范LR语法分析器在报告错误之前不会进行任何无效归约;SLR语法分析器和LALR语法分析器在报告错误之前可能执行几步归约,但决不会将出错点的输入符号移进栈。
在LR分析中遇到错误时,意味着既不能将输入符号移进栈,又不能对栈顶符号串进行归约。发现错误后,便进入相应的出错处理子程序。处理错误的方法主要有两类:一类是使用插入、删除或修改输入符号的方法,另一类包括检测到某一个不合适的短语时,它不能与任何产生式匹配。此时,错误处理程序可能跳过其中的一些输入符号,将含有语法错误的短语分离出来。分析程序认定含有错误的符号串是由某一个非终结符A所推导出的,此时该符号串的一部分已经处理。处理结果反映在栈顶的一系列状态中,剩下的未处理的符号仍在输入缓冲中。分析程序跳过一些输入符号,直至找到某一个符号a,它能合法地跟在A的后面。同时,要将栈顶的内容逐个移去,直到找到一个状态s,该状态与A有一个对应的新状态GOTO[s,A],并将该新状态推入栈。此时,分析程序就认为它已找到A的某个匹配并已将它局部化,然后恢复正常的分析过程。
LR语法分析器短语级的错误处理比较容易,不必担心不正确的归约,实现方式是通过检查LR分析表的每个出错表项,并根据语言的使用情况确定最可能引起的错误以及程序员最容易犯的错误,然后为其编写一个适当的错误处理程序,并将程序指针填在分析表的空项中。
例如,表5-18给出了基于表5-16的带有错误处理的二义表达式文法的LR分析表。其中,出错处理程序定义如表5-19所示。
表5-18 带有错误处理子程序的二义表达式文法的LR分析表
表5-19 二义表达式文法LR分析表中错误处理子程序的功能
(www.xing528.com)
例5.19 对输入串i+)进行带有错误处理的LR分析。
利用表5-18对语法错误的表达式i+)进行LR分析的过程如表5-20所示。
表5-20 对输入串i+)的带错误处理的LR分析过程
在第5步时,发现栈顶状态为4,面对的输入符号为‘)’,查表发现出现了错误,调用出错处理程序e2删除‘)’,给出错误信息“右括号不匹配”。继续分析到第6步时,栈顶状态4面对输入符号‘#’,查表发现出现了错误,调用出错处理子程序e1,将一个假想的输入符号i压入符号栈,状态3进栈,给出错误信息“缺少操作对象”。
总之,LR分析法在自左至右扫描输入串的过程中就能发现其中的任何错误,并能准确指出出错位置。LR语法分析器在访问ACTION表时,若遇到一个空(或错误)的表项,将检测到一个错误,但在访问GOTO表时决不会检测到错误。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。