什么是LR解析器?

LR Parser 是一类用于解析上下文无关语法的自底向上解析器。LR 解析被称为 LR (K) 解析,其中

  • L 代表从左到右扫描输入

  • R 代表最右推导

  • K 是用于制定解析决策的前瞻输入符号的数量。

LR 解析器是一个移位归约解析器,它创建了确定性有限自动机的使用,通过从下到上读取堆栈来识别所有适用前缀的集合。

它决定什么句柄(如果有的话)是可行的。右句形式的可实现前缀是包含句柄的前缀,但句柄右侧没有符号。

因此,如果组装了识别正确句子形式的可行前缀的有限状态机,则可以使用它来影响 shiftreduce 解析器中的句柄选择。

因为 LR 解析器创建了一个 DFA 的使用来识别可行的前缀来管理句柄的选择,所以它应该保持对 DFA 状态的跟踪。因此,LR 解析器堆栈包括两种符号——状态符号可以识别 DFA 和语法符号的状态。

解析器以 DFA 的初始状态开始,即堆栈上的I 0。解析器通过考虑堆栈顶部的下一个输入符号“a”和状态符号 I i进行操作。

如果存在从DFA 中“a”上的状态 I i到状态 I j 的转换,则符号 a 之后是状态符号 I j到堆栈上。

如果在 DFA 中没有从 I i到 a 的转换,并且如果堆栈顶部的状态 I i在列出时识别出一个包含句柄 A → a 的可行前缀,则解析器通过弹出来给出减少α 并将 A 压入堆栈。

这类似于在 DFA 中开发从 I i到 α的后向转换,然后在 A 上开发前向转换。解析器的每个转换动作都与 DFA 中终端符号上的转换相关。

因此,DFA 和下一个输入符号的当前状态决定了解析器是移动下一个输入符号还是进行归约。

如果它可以生成一个表,将每个状态和输入符号对映射为“shift”、“reduce”、“accept”或“error”,我们将获得一个可用于管理解析阶段的表。这样的表被称为解析“动作”表。