我如何制作这个语法LL(1)?

时间:2015-03-18 21:22:14

标签: parsing compiler-construction grammar theory ll

让我说我有这个语法

E -> T+Ex | F
T -> T*Fy | w
F -> E | z | ε

现在我需要把它变成LL(1)。我一直在遵循这些步骤,但我提出的解决方案似乎并不合适。 拳头可以消除ε-制作

E -> T+Ex | F | T+x
T -> T*Fy | w | T*y
F -> E | z

现在我们将消除周期

E -> T+Ex | T+x | z
T -> T*Fy | w | T*y
F -> T+Ex | T+x | z

不,我们将消除立即左递归

E -> T+Ex | T+x | z
T -> wT'
T' -> *FyT' | *yT' | ε
F -> T+Ex | T+x | z

最后,我们将替换发生T的某些RHS产品

E -> wT'+Ex | wT'+x | z
T -> wT'
T' -> *FyT' | *yT' | ε
F -> wT'+Ex | wT'+x | z

现在这对我来说似乎不是LL(1),因为由此生成的解析表将为多个终端提供多个条目。我似乎缺少什么?

1 个答案:

答案 0 :(得分:1)

我想出了如何做到这一点,所以在最后一步我们有这个配置

E -> wT'+Ex | wT'+x | z
T -> wT'
T' -> *FyT' | *yT' | ε
F -> wT'+Ex | wT'+x | z

我们现在需要执行左因子分解来删除表格

的制作
S -> aB | aC

并使它们成为正确的形式

S -> aA
A -> B | C

使用此我们可以将语法转换为

E -> wT'+E' | z
E' -> Ex | x
T -> wT'
T' -> *T'' | ε
T'' -> FyT' | yT'
F -> wT'+F' | z
F' -> Ex | x

由于FF'EE'相同,我们可以删除此作品,以便我们留下。

E -> wT'+E' | z
E' -> Ex | x
T -> wT'
T' -> *T'' | ε
T'' -> EyT' | yT'