在编译器设计中,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。它功能非常强大,适用于大量语法。
它需要较少的时间和空间复杂度。它需要更多的时间和空间复杂度。它也需要更多的时间和空间复杂度。

更新于: 2021年11月2日

53K+ 浏览量

启动您的 职业生涯

通过完成课程获得认证

开始学习
广告