如何填充语法分析表中的条目?


语法分析器是编译的第二阶段。语法分析器以来自前一阶段(即词法分析阶段)生成的标记作为输入,并将它们分组,以便可以识别它们的语法。

例如:

考虑 I0

I0 − E′ → ∙ E

      E → ∙ E + T

     E → ∙ T

     T → ∙ T ∗ F

     T → ∙ F

     F → ∙ (E)

     F → ∙ id

填充移进项

将SLR语法分析表构造算法的规则(2a)应用于I0的一组产生式。只有当点之后是终结符时,才应用规则(2a)。考虑F → ∙ (E)

将A → α ∙ a β与F → ∙ (E)进行比较

F →ε(E )
A →α.aB

∴ A = F, α = ε, a = (, β = E)

应用规则,goto (Ii, a) = Ij

∵     goto (I0, ( ) = I4

∴    Action [0, ( ] = Shift 4

∴ 在第0行和左括号列前写入s4

类似地,比较F → ∙ id

应用规则(2a)

将A → α ∙ a β与F → ∙ id进行比较

F →εidE
A →α.aB

∴ A = F, α = ε, a = id, β = ε

∴ goto (I0, id) = I5

∴ Action [0, id] = shift 5

在第0行和id列前写入s5

类似地,通过以类似的方式处理从I0到I11的所有状态,将完成表用移进操作填充。

填充归约项(r) − 为了填充归约(r)项,我们必须应用SLR语法分析表构造的规则(2b)。

从I0到I11,我们必须查看A → α ∙形式的产生式。

考虑

I2 − E → T ∙

T → T ∙ * F

在这里,我们有E → T ∙形式的产生式A → α ∙,其中点出现在最后位置。因此,将A → α ∙与E → T ∙进行比较。

E →T
A →α.

应用规则,我们必须找到FOLLOW (E)

FOLLOW (E) = { +, ), $}

问题中E → T的产生式编号为(2)

在状态2的行和+, ), $的列前写入r2。

action [2, +] = r2, action [2, )] = r2, action [2, $] = r2。

这里,r2指的是使用产生式编号2进行归约

类似地,考虑另一个状态I3

I3 − T → F ∙

应用规则(2b)

将T → F ∙与A → α ∙进行比较

T →F
A →α.

∴ A = T, α = F

FOLLOW (T) = { +,*, ), $}

由于T → F是问题中的产生式编号(4)

在状态3的行和+,*, ), $的列前写入r4。

Action [3, +] = r4                 Action [3, $] = r4

Action [3, )] = r4                  Action [3, )] = r4

类似地,用归约(r)项填充Action表。

填充goto项 − 可以使用语法分析表构造的规则(3)为非终结符填充goto表。

由于             I1 = goto(I0, E)

应用规则(3)

goto[0, E] = 1

在第0行和E列前写入1。

类似地,          goto (I0, T) = I2

应用规则(3)

goto [0, T] = 2

在第0行和T列前写入2。

类似地,我们可以填充goto表中的其他条目

填充“接受”项

应用规则(2C),存在一个产生式。

E′ → E ∙ 在I1中。

因此,在第1行和$列前写入“接受”。

∴ action [1, $] = “接受”。

通过填充所有移进、归约、接受、goto项,我们得到以下SLR语法分析表。

在表中,s表示移进,r表示归约。

更新于:2021年11月2日

332 次查看

启动你的职业生涯

通过完成课程获得认证

开始
广告