编译器设计中 LR 分析器的类型有哪些?
有三种类型的 LR 分析器,如下所示:
简单 LR 分析器 (SLR) − SLR 代表 "Simple LR Parser"。它非常容易且执行成本低。但它无法为某些类别的语法生成解析表,即为什么使用 CLR 和 LALR,它们主要实现了所有类别或类型的语法。它构建解析表,有助于执行输入字符串的解析。如果给定上下文无关文法,则可以进行 SLR 解析。在 LR (0) 中,0 表示没有前瞻符号。
SLR 解析动作和 goto 函数来自确定性有限自动机,该自动机识别可行的前缀。它不会为所有语法专门生成解析动作表,但确实在某些编程语言的语法上实现了。给定一个语法 G。我们增强 G 以生成 G',并且从 G' 它可以构建 C,即 G' 的项目规范集合。
规范前瞻 LR 分析器 (CLR) − CLR 定义规范前瞻。CLR 解析使用 LR (1) 项目的规范集合来构建 CLR (1) 解析表。与 SLR (1) 解析相比,CLR (1) 解析表生成更多状态。在 CLR (1) 中,它只能在前瞻符号中定位归约节点。
文法 LR (1) 项目集合的构建
它需要三件事
- 增强文法
- 闭包函数
- goto 函数
增强文法 − 它是一个新的文法 G',它包含一个新的产生式 S' → S 以及给定文法 G 的所有其他产生式。
闭包
- 过程 closure (I)
- 开始 重复
- 对于 I 中的每个项目 A→α ∙B β, a,
- 每个产生式 B→γ 和
- 每个终结符 b∈FIRST (β a)
- 如果 B→ ∙ γ 不在 I 中
- 将 B→ ∙γ,b 添加到 I 中
- 直到无法再将更多元素加入到 I;
- 结束
𝐠𝐨𝐭𝐨(𝐈, 𝐗)− 如果 I 中存在产生式 𝐀 → 𝛂 ∙ 𝐗 𝛃, 𝐚,则 𝐠𝐨𝐭𝐨(𝐈, 𝐗) 是 𝐀 → 𝛂 𝐗 ∙ 𝛃, 𝐚 项目集的闭包。
前瞻 LR 分析器 (LALR) − LALR 分析器是前瞻 LR 分析器。它的功能介于 SLR 和 CLR 分析器之间。它是 CLR 分析器的压缩,因此在此获得的表将小于 CLR 解析表。
在这里,首先,我们将构建 LR (1) 项目。接下来,我们将查找具有相同第一个组件的项目,并将它们合并以形成单个项目集。这意味着状态具有相同的第一个组件,但不同的第二个组件可以集成到单个状态或项目中。