证明每个 SLR (1) 都是明确的,但有些明确的文法不是 SLR (1)。检查以下产品。S → L = R S → R L →* R L → id R → L

解决方案

Step1 - 首先,将其转换为增广语法 G' 并对产生式进行编号

(0) S′ → S

(1) S → L = R

(2) S → R

(3) L →∗ R

(4) L → id

(5) 右→左

Step2 - 找到闭包和 goto 函数来构造 LR (0) 项目。

在下面的一组 LR(0) 项中,Boxes 代表新状态,圆圈代表重复状态

Step3 - FOLLOW的计算 - 应用FOLLOW的规则(1),我们得到

FOLLOW(S)= $(1)

  • S → L = R

应用规则 (2) FOLLOW - 比较 S → L = R 与 A → α B β。

S →ΕL= R
A →BΒ

∴ A = S, α = ε, B = L, β = {= R}

FIRST(β) = FIRST(= R) = {=} 不包含 ε

遵循规则 (2a)

FOLLOW(L)= {=} (2)

应用 FOLLOW− 的规则 (3) 比较 S → L = R 与 A → α B

S →大号 =R
一→αΒ

∴ FOLLOW(R)= { FOLLOW(S)} (3)

  • S → R

不能应用 FOLLOW 的规则 (2)。

因为 S → R 不能与 A → α B β 进行比较。因为,如果我们比较,我们会得到,α = ε,B = R,β = ε。但是 β 不应该是 ε 来应用这个规则。

应用 FOLLOW 的规则 (3) - 比较 S → R 与 A → α B

年代 →εR
一→αΒ

∴ A = S, α = ε, B = R

FOLLOW(R)= { FOLLOW(S)} (4)

  • 左→*右

不能应用 FOLLOW 的规则 (2)。

因为 L →* R 不能与 A → α B β 进行比较。因为 β 将是 ε,这是不可能的。

应用 FOLLOW 的规则 (3) - 比较 L →∗ R 与 A → α B

大号 →*R
一→αΒ

∴ A = L, α =∗, B = R

FOLLOW(R)= { FOLLOW(L)} (5)

  • L →id

不能应用 FOLLOW 的规则 (2) 和 (3)。

由于 L → id 不能与 A → α B β 和 A → α B 匹配。

  • R → L

不能适用规则 (2)。

因为 R → L 不能与 A → α B β 匹配。

应用 FOLLOW 的规则 (3) - 比较 R → L 与 A → α B

R →L
一→一种Β

∴ A = R, α = ε, B = L

FOLLOW(L)= { FOLLOW(R)} (6)

结合语句(1)到(6)

FOLLOW(S)= $(1)

FOLLOW(L)= {=} (2)

FOLLOW(R)= { FOLLOW(S)} (3)

FOLLOW(R)= { FOLLOW(S)} (4)

FOLLOW(R)= { FOLLOW(L)} (5)

FOLLOW(L)= { FOLLOW(R)} (6)

从 (1)

            FOLLOW(S)= $

从 (1), (2), (3), (4), (5), (6)。

                                 FOLLOW(L)= FOLLOW(R)= {=, $}

解析表的构建

填充班次条目

由于 goto (I 0 ,*) = I 4

∴ 动作 [0,∗] = s4

由于 goto (I 0 , id) = I 5

∴ 动作 [0, id] = s5

同样,所有班次条目都填充到表中。

填充减少条目 (r)

应用规则 (2b) 构建 SLR 解析表

考虑

I 2 S → L ∙= R

R → L ∙

R → L ∙ 与 A → α ∙ 比较

R →大号.
一→α.

∴ A = R, α = L

由于 R → L 是给定问题中的生产编号 (5)。

∴ 在行状态 2 和列 =, $前面写上 r5。

类似地,Reduce 的其他条目被填充到表中。

填写“接受”条目

考虑我1

I 1 − S′ → S ∙

应用解析表构造规则(4)

∴ 在行状态 1 和列 $前面写上“接受”。

通过填写所有的 shift、reduce、goto 和 accept 条目,我们得到以下解析表。

下表准确显示 Action [2, =] = s6 或 r5 中有多个条目。

状态 I 2 - S → L ∙ = R

R → L ∙

R → L ∙ 是 A → α ∙ 形式

∴ 减少规则可以应用在它上面。

R → L 是给定问题中的生产编号 (5)。

∴ 动作 [2, =] = r5

∴ 转到 (I 2 , =) = I 6

∴ 动作 [2, =] = s6

因此,有移位 | 减少条目操作 [2, =] 上的冲突。这表明给定的语法不是 SLR (1)

猜你喜欢