先决条件: LR解析器
LR解析器:
这是一种高效的自底向上语法分析技术,可用于解析一大类上下文无关文法,称为 LR(0) 解析。
L 代表从左到右扫描
R 代表最右边的反向推导
0 代表没有。前瞻的输入符号数
LR解析的优点:
- 它几乎可以识别所有可以为其编写 CFG 的编程语言结构
- 它能够检测语法错误
- 它是一种高效的非回溯移位减少解析方法。
LR解析方法的类型:
- 单反
- CLR
- LALR
单反解析器:
SLR 是简单的 LR。它是最小的语法类别,状态数很少。 SLR很容易构建,类似于LR解析。 SLR 解析器和 LR(0) 解析器的唯一区别在于,在 LR(0) 解析表中,由于我们正在进入对应于所有终止状态的 ‘reduce’,因此有可能出现 ‘shift reduction’ 冲突。我们可以通过以下方式解决这个问题进入与处于终止状态的生产 LHS 的 FOLLOW 对应的“减少”。这称为 SLR(1) 项目集合
构建SLR解析表的步骤:
- 编写增强语法
- LR(0) 要查找的项目集合
- 查找生产 LHS 的 FOLLOW
- 在解析表中定义2个函数:goto[终端列表]和action[非终端列表]
示例 – 为给定的上下文无关文法构建 LR 解析表
S->AA
A–>aA|b
解决方案:
STEP1 –寻找增广文法
给定文法的增广文法是:-
S’–>.S [第 0 次生产]
S–>.AA [第一次生产]
A–>.aA [第二次生产]
A–>.b [第三次生产]
STEP2 –查找 LR(0) 项集合
下图显示了 LR(0) 项目集合。我们将一一了解。
这个文法的终结符是 {a,b}。
此文法的非终结符是 {S,A}
规则 –
如果任何非终端有 ‘ 。 ‘ 在它之前,我们必须编写它的所有产生式并添加 ‘ 。 ‘ 在它的每一个生产之前。
规则 –
从每个状态到下一个状态, ‘ 。 ‘ 移到右边的一个位置。
- 在图中,I0 由增广文法组成。
- 当 ‘ 时,Io 进入 I1。第 0 个产生式的 ‘ 向 S(S’->S.) 的右侧移动。这个状态是接受状态。 S 被编译器看到。
- 当 ‘ 时,Io 进入 I2。 ‘ 1st 产生向右移动 (S->AA)。 A 被编译器看到
- 当 ‘ 时,I0 变为 I3。 ‘ 第二个产品的 ‘ 向右移动 (A->aA) 。 a 被编译器看到。
- 当 ‘ 时,I0 变为 I4。 ‘ 第三个产生式的右移 (A->b.) 。 b 被编译器看到。
- 当 ‘ 时,I2 变为 I5。 ‘ 1st 产生向右移动 (S->AA.)。 A 被编译器看到
- 当 ‘ 时,I2 变为 I4。第三次产生的’向右移动 (A->b.)。 b 被编译器看到。
- 当 ‘ 时,I2 变为 I3。 ‘ 第二个产品的 ‘ 向右移动 (A->aA) 。 a 被编译器看到。
- 当 ‘ 时,I3 变为 I4。 ‘ 第三个产生式的右移 (A->b.) 。 b 被编译器看到。
- 当 ‘ 时,I3 转到 I6。 ‘ 的第二次产生向右移动 (A->aA.)。 A 被编译器看到
- 当 ‘ 时,I3 转到 I3。 ‘ 第二个产品的 ‘ 向右移动 (A->aA) 。 a 被编译器看到。
STEP3 –
查找生产 LHS 的 FOLLOW
关注(S)=$
跟随(A)=a,b,$
要查找非终结符的 FOLLOW,请阅读语法分析中的 follow set。
第四步-
在解析表中定义了2个函数:goto[终结符列表]和action[非终结符列表]。下面是SLR解析表。
- $ 默认情况下是一个接受状态的非终端。
- 0,1,2,3,4,5,6 表示 I0,I1,I2,I3,I4,I5,I6
- I0 在 I2 中给出 A,因此将 2 添加到 A 列和 0 行。
- I0 在 I1 中给出 S,因此将 1 添加到 S 列和 1 行。
- 同样5写在A列2行,6写在A列3行。
- I0 给出了 I3 .so S3(shift 3) 被添加到一列和 0 行。
- I0 在 I4 中给出 b。所以 S4(shift 4) 被添加到 b 列和 0 行。
- 类似地,S3(shift 3) 被添加到一列和 2,3 行,S4(shift 4) 被添加到 b 列和 2,3 行。
- I4 是还原状态为 ‘ 。 ‘ 在最后。 I4 是语法(A–>.b) 的第三个产生式。这个产生式的LHS 是A. FOLLOW(A)=a,b,$ 。在 a,b,$ 和第 4 行的列中写入 r3(reduced 3)
- I5 是还原状态为 ‘ 。 ‘ 在最后。 I5 是语法(S->.AA)的第一个产生式。该产品的 LHS 是 S。
跟随(S)=$ 。在 $ 和第 5 行的列中写入 r1(reduced 1) - I6 被简化为 ‘ 。 ‘ 在最后。 I6 是语法的第二产生式(A–>.aA)。该产品的 LHS 是 A。
跟随(A)=a,b,$ 。在 a,b,$ 和第 6 行的列中写入 r2(reduced 2)