在本文中,我们将讨论 LR 解析器及其概述,然后将讨论算法。此外,我们将讨论解析表和 LR 解析器工作图。让我们一一讨论。
LR 解析器:
LR 解析器是上下文无关文法的自底向上解析器,它被计算机编程语言编译器和其他相关工具广泛使用。 LR 解析器从左到右读取它们的输入并产生最右边的推导。它被称为自底向上解析器,因为它试图通过从叶子开始构建来减少顶级语法产生式。在实践中,LR 解析器是所有确定性解析器中最强大的解析器。
LR解析器说明:
术语解析器 LR(k) 解析器,这里的 L 指的是从左到右的扫描,R 指的是最右边的反向推导,k 指的是用于制作解析器的未消耗的“前瞻”输入符号的数量决定。通常,k 是 1 并且经常被省略。如果存在 LR (k) 解析器,则上下文无关文法称为 LR (k)。这首先将标记序列减少到左侧。但是当我们从上面阅读时,推导顺序首先扩展到非终结符。
- 堆栈是空的,我们希望通过 S’→S$ 来减少规则。
- 用一个 ”。”在规则中表示有多少规则已经在堆栈中。
- 一个带点的项目,或者简单地说,该项目是一个产生式规则,其中一个点表示到目前为止已经识别了多少 RHS。关闭项目用于查看可以使用哪些生产规则来扩展当前结构。计算如下:
LR 解析器规则:
LR解析器的规则如下。
- 给定语法规则中的第一项将自己添加为第一个封闭集。
- 如果一个对象存在于形式 A→α 的闭包中。 β。 γ,其中符号之后的下一个符号是非终结符,在点在第一项之前添加符号的产生式规则。
- 对 (B) 下添加的新项目重复步骤 (B) 和 (C)。
LR解析器算法:
LR Parsing 算法对于所有的解析器都是一样的,但是每个解析器的解析表是不同的。它由以下组件组成。
- 输入缓冲器 –
它包含给定的字符串,并以 $ 符号结尾。 - 堆 –
状态符号和当前输入符号的组合用于参考解析表以做出解析决定。
解析表:
解析表分为两部分——Action 表和 Go-To 表。动作表给出了在输入流中实现给定的当前状态和当前终端的语法规则。动作表中使用了四种情况,如下所示。
- 移位动作——在移位动作中,当前终端从输入流中移除,状态n被压入堆栈,它成为新的当前状态。
- 减少行动 – 数字m 写入输出流。
- 规则m左侧提到的符号m表示状态已从堆栈中删除。
- 规则m左侧提到的符号m表示在 goto 表中查找新状态并通过将其压入堆栈来创建新的当前状态。
An accept - the string is accepted
No action - a syntax error is reported
笔记 –
转到表指示应继续哪个状态。
LR解析器图: