什么是 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 定义的条目都被认为是“错误”。
数据结构
网络
关系型数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP