如何填写解析表中的条目?
解析器是编译的第二阶段。解析器将前一阶段(即词法分析器阶段)生成的标记作为其输入,并以可以识别它们的语法的方式对它们进行分组。
例如,
考虑我0
我0 - E′ → ∙ E
E → ∙ E + T
E → ∙ T
T → ∙ T * F
T → ∙ F
F → ∙ (E)
F → ∙ id
填写移动条目
将 SLR Parsing Table 构造算法的规则 (2a) 应用于 I 0的产生式集合。规则 (2a) 仅在点后有终结符时适用。考虑 F → ∙ (E)
比较 A → α ∙ a β 与 F → ∙ (E)
F → | ε | ∙ | ( | E ) |
一→ | α | . | 一种 | B |
∴ A = F, α = ε, a = (, β = E)
应用规则,goto (I i , a) = I j
∵ 转到 (I 0 , ( ) = I 4
∴ 动作 [0, ( ] = Shift 4
∴ 在第 0 行和第 0 列前面写上 s4 (
同样,比较 F → ∙ id
应用规则 (2a)
比较 A → α ∙ a β 与 F → ∙ id
F → | ε | ∙ | ID | E |
一→ | α | . | 一种 | B |
∴ A = F, α = ε, a = id, β = ε
∴ goto (I 0 , id) = I 5
∴ 动作 [0, id] = shift 5
在第0行和列id前面写s5
类似地,通过以类似方式处理从 I 0到 I 11的所有状态,将用移位动作填充完整的表。
Reduce Entries (r)的填充 - 为了填充 reduce (r) 条目,我们必须应用 SLR Parsing Table 构造的规则 (2b)。
从 I 0到 I 11我们必须看到形式 A → α ∙ 的产生式
考虑
我2 - E → T ∙
T → T ∙ * F
在这里,我们有形式 A → α ∙ 的产生式 E → T ∙,其中点出现在最后一个位置。因此,比较 A → α ∙ 与 E → T ∙
E → | 吨 | ∙ |
一→ | α | . |
应用规则,我们必须找到 FOLLOW (E)
跟随 (E) = { +, ), $}
问题中 E → T 的产生数是 (2)
在状态 2 的行和 +,),$列的前面写上 r2。
动作 [2, +] = r2,动作 [2, )] = r2,动作 [2, $] = r2。
这里,r2 是指使用生产号 2 减少
同样,考虑另一个状态 I 3
I 3 − T → F ∙
应用规则 (2b)
比较 T → F ∙ 与 A → α ∙
→ | F | ∙ |
一→ | α | . |
∴ A = T, α = F
跟随 (T) = { +,*, ), $}
因为 T → F 是问题中的生产编号 (4)
在状态 3 的行和 +,*, ), $列的前面写上 r4。
动作 [3, +] = r4 动作 [3, $] = r4
动作 [3, )] = r4 动作 [3, )] = r4
同样,通过 reduce (r) 条目填充 Action 表。
goto Entries 的填充- 可以使用解析表构造的规则 (3) 为非终结符填充 goto 表。
因为,I 1 = goto(I 0 , E)
应用规则 (3)
转到[0, E] = 1
在第 0 行和 E 列前面写 1。
类似地,goto (I 0 , T) = I 2
应用规则 (3)
转到 [0, T] = 2
在第 0 行和第 T 列前面写 2。
同样,我们可以在 goto Table 中填写其他条目
填写“接受”条目
应用规则 (2C),有一个产生式。
E′ → E ∙ 在 I 1中。
因此,在第 1 行和第 $列前面写上“接受”。
∴ 动作 [1, $] = "接受。"
通过填充所有 shift、reduce、accept、goto 条目,我们得到以下 SLR 解析表。
表中 s 表示移位,r 表示减少。
以上是 如何填写解析表中的条目? 的全部内容, 来源链接: utcz.com/z/363382.html