如何填充语法分析表中的条目?
语法分析器是编译的第二阶段。语法分析器以来自前一阶段(即词法分析阶段)生成的标记作为输入,并将它们分组,以便可以识别它们的语法。
例如:
考虑 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 → | α | . | a | B |
∴ 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 → | ε | ∙ | id | E |
A → | α | . | a | B |
∴ 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表示归约。