📜  LR 解析中的错误恢复

📅  最后修改于: 2022-05-13 01:56:17.568000             🧑  作者: Mango

LR 解析中的错误恢复

LR 解析器是一个自底向上的解析器。它总是用于处理上下文无关语法 (CFG)。它通常被计算机编程语言编译器以及其他相关工具使用。 LR 解析器在使用从左到右的输入时产生最左推导。通过从叶子开始构建,它有助于减少顶级语法产生式,这就是它被称为自下而上解析器的原因。 LR解析器是当今广泛使用的所有确定性解析器中最强大的解析器。 LR 解析器基本上有 4 种类型

  1. LR(0) 解析器
  2. 单反解析器
  3. LALR 解析器
  4. CLR 解析器

LR解析中的错误恢复:

当到目前为止扫描的输入没有有效的延续时,LR 解析器会报告错误。在通知错误之前,CLR 解析器永远不会执行单个归约,而 SLR 或 LALR 可能会执行多个归约,但它们永远不会将不正确的输入符号移动到堆栈中。

当解析器检查表并发现相关的操作项为空时,在LR解析中识别出错误。 Goto 条目永远不能用于检测错误。

LR Parser 基本上使用提到的两种技术来检测错误:

  1. 句法阶段恢复
  2. 恐慌模式恢复

句法阶段恢复:

句法阶段恢复遵循给定的步骤:

  1. 调用解析器表中的错误过程的程序员错误是根据语言确定的。
  2. 创建错误过程,可以以表格错误条目可接受的方式更改堆栈顶部和/或输入中的某些符号。

在句法阶段恢复期间检测到一些错误:

  1. 结构错误
  2. 缺少运算符
  3. 拼写错误的关键字
  4. 不平衡括号

恐慌模式恢复:

这种方法涉及从输入中逐个删除连续字符,直到获得一组同步标记。诸如 或 之类的分隔符正在同步标记。好处是它易于实现并确保您不会陷入无限循环。缺点是会跳过大量数据而没有检查其他问题。

恐慌模式恢复遵循给定的步骤:

  1. 扫描堆栈,直到在某个非终端“B”上找到带有 goto() 的状态“a”(通过从堆栈中删除状态)。
  2. 在识别出可以跟在“B”之后的符号“b”之前,拒绝零个或多个输入符号。

使用 LR Parser 进行错误恢复的示例:

考虑以下用于检测错误的语法:

E → E + E 
E → E * E 
E → ( E ) 
E → id

第一步:首先为给定的语法制作解析表:

解析表

上面例子的解析表

第 2 步:让给定的字符串解析为:

String: id+)$

第 3 步:现在解析器对给定字符串的工作描述如下:

           STACK                     INPUT        
0                     id+)$
0id3                        +)$
0E1                        +)$
0E1 + 4                           )$
0E1 + 4                            $
0E1 + 4id3                            $
0E1 + 4E7                            $
0E1                            $

Step 4:以检测到错误的形式给出输出:

Action(4, )) = error i.e.,
“unbalanced right parenthesis” c2
removes right parenthesis “missing
operand” e2 pushes id3 on stack

因此,以这种方式使用 LR 解析器检测到错误。