SLR(1) 分析
SLR(1)(Simple LR)通过 FOLLOW 集解决 LR(0) 中的冲突。
核心思想
LR(0) 的规则 2 中,对规约项目 ,在所有输入符号上都填规约。SLR(1) 限制:仅当输入符号 时才规约。
SLR(1) 分析表构造规则(与 LR(0) 的区别仅在规则 2):
- 规则 1、3、4 同 LR(0)
- 规则 2(SLR 修改):若 (),则对每个 ,
冲突判断
若 SLR(1) 表中仍有双重定义条目,则文法不是 SLR(1)。
完整示例
文法 :
项目集规范族:
求 FOLLOW 集:
- FOLLOW(S) = \{\}S$ 为开始符号)
- FOLLOW(S') = \{\}$
SLR(1) 分析表:
| 状态 | $$$ | |||
|---|---|---|---|---|
| 0 | 1 | |||
| 1 | ||||
| 2 | 4 | |||
| 3 | ||||
| 4 |
中 是规约项,FOLLOW(S) = \{\}ACTION[3, $] = R_2$ 而非所有符号填规约,有效减少了 LR(0) 中多余规约。
SLR(1) 局限性
FOLLOW 集不区分规范推导的具体上下文。
示例:,,
- ,
- LR(0) 中状态 有规约 - 规约冲突
- SLR(1) 仍无法区分()
- 需 LR(1) 引入搜索符区分
重点 SLR(1) 用 FOLLOW 集解决冲突,但 FOLLOW 集不区分规范推导的路径。