在编译器设计中,SLR、CLR 和 LALR 解析器之间有什么区别?
SLR 解析器
SLR 代表 “简单 LR 解析器”。它非常容易且经济高效地执行。SLR 解析动作和从识别可行前缀的确定性有限自动机获取的 goto 函数。它不会为所有语法专门定义解析动作表,但确实在几种编程语言的语法上取得了成功。给定一个语法 G。它增强 G 以生成 G’,并且从 G’ 它可以构造 C,即 G’ 的项目集的规范集合。它可以使用以下简单的 LR 解析表构造技术从 C 构造 ACTION 解析动作函数和 GOTO goto 函数。我们需要了解每个语法的非终结符 A 的 FOLLOW(A)。
CLR 解析器
CLR 指的是规范前瞻。CLR 解析使用 LR(1) 项目的规范集合来构造 CLR(1) 解析表。CLR(1) 解析表与 SLR(1) 解析相比,生成更多状态。在 CLR(1) 中,它只能在前瞻符号中定位归约节点。
LALR 解析器
LALR 解析器是前瞻 LR 解析器。它的功能介于 SLR 和 CLR 解析器之间。它是 CLR 解析器的压缩,因此在此获得的表将小于 CLR 解析表。
为了构建 LALR(1) 解析表,使用了 LR(1) 项目的规范集合。在 LALR(1) 解析中,具有相同产生式但具有多个前瞻的 LR(1) 项目被分组以形成单个项目集。除了解析表有所不同之外,它通常与 CLR(1) 解析相同。
所有这些 LR 解析器的整体结构都是相同的。它们之间存在一些共同因素,例如大小、它们支持的上下文无关语法的类别以及时间和空间方面的成本,它们在这方面有所不同。
让我们看看 SLR、CLR 和 LALR 解析器之间的比较。
SLR 解析器 | LALR 解析器 | CLR 解析器 |
---|---|---|
它非常容易且便宜地实现。 | 它也很容易且便宜地实现。 | 它实现起来很昂贵且困难。 |
SLR 解析器的大小最小。 | LALR 和 SLR 的大小相同。因为它们的状态数较少。 | CLR 解析器最大。因为状态数非常大。 |
SLR 中的错误检测不是立即的。 | LALR 中的错误检测不是立即的。 | CLR 解析器可以立即进行错误检测。 |
SLR 无法为某些类别的语法生成解析表。 | 它的功能介于 SLR 和 CLR 之间,即 SLR ≤ LALR ≤ CLR。 | 它功能非常强大,适用于大量语法。 |
它需要较少的时间和空间复杂度。 | 它需要更多的时间和空间复杂度。 | 它也需要更多的时间和空间复杂度。 |
广告