什么是 SLR(1) 分析器?


SLR 代表 “简单 LR 分析器”。它非常简单且执行效率高。但它无法为某些类型的语法创建分析表,这就是为什么使用 CLR 和 LALR,它们主要实现了所有类型的语法。它构建分析表,帮助执行输入字符串的分析。

SLR(1) - 具有 SLR 分析表的语法被称为 SLR(1)。

SLR 分析器的工作原理

如果给出上下文无关文法,则可以进行 SLR 分析。在 LR(0) 中,0 表示没有前瞻符号。

LR(0) 项目的规范集合

语法 G 的 LR(0) 项目包含一个产生式,其中符号点 (.) 插入到产生式右部 (R.H.S) 的某个位置。

例如 - 对于产生式 S → ABC,生成的 LR(0) 项目将是 -

S →∙ ABC

S → A ∙ BC

S → AB ∙ C

S → ABC ∙

产生式 S → ε 只生成一个项目,即 S →∙

规范 LR(0) 集合有助于构建称为简单 LR (SLR) 分析器的 LR 分析器。

要为语法创建规范 LR(0) 集合,需要 3 个东西 -

  • 增广语法
  • 闭包函数
  • goto 函数

增广语法 - 如果语法 G 具有起始符号 S,则增广语法是具有新起始符号 S' 的新语法 G'。此外,它还将包含产生式 S' → S。

闭包 - 对于上下文无关文法 G,如果 I 是语法 G 的项目或状态集,则 -

  • I 中的每个项目都在闭包 (I) 中。

  • 如果规则 A → α. B β 是闭包 (I) 中的一个规则,并且 B 有另一个规则,例如 B → γ,则闭包 (I) 将包含 A → α. Bβ 和 B → . γ

goto (I, X) - 如果 I 中存在产生式 A → α ∙ X β,则 goto (I, X) 定义为 A → α X ∙ β 项目集的闭包,其中 I 是项目集,X 是语法符号(非终结符)。

SLR 分析表的构建

SLR 分析表基本上有两个部分

  • 动作
  • goto

可以使用以下算法填充动作和 goto 表 -

算法

输入 - 增广语法 G'

输出 - SLR 分析表

方法

  • 最初构建项目集

C = {I0, I1, I2 … … In},其中 C 是语法 LR(0) 项目的集合。

  • 解析动作基于每个项目或状态 I1

各种动作是 -

  • 如果 A → α ∙ a β 在 Ii 中,并且 goto (Ii, a) = Ij,则设置 Action [i, a] = “移进 j”。
  • 如果 A → α ∙ 在 Ii 中,则将 Action [i, a] 设置为“归约 A → α”,对于所有符号 a,其中 a ∈ FOLLOW (A)。
  • 如果 S' → S ∙ 在 Ii 中,则动作表 Action [i, $] 中的条目为“接受”。
  • SLR 表的 goto 部分可以填充为 - 状态 i 的 goto 转移仅针对非终结符进行考虑。如果 goto (Ii, A) = Ij,则 goto [i, A] = j

  • 所有未由规则 2 和 3 定义的条目都被认为是“错误”。

更新于: 2021 年 11 月 2 日

6K+ 次查看

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告

© . All rights reserved.