让我说我有这个语法
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),因为由此生成的解析表将为多个终端提供多个条目。我似乎缺少什么?
答案 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
由于F
和F'
与E
和E'
相同,我们可以删除此作品,以便我们留下。
E -> wT'+E' | z
E' -> Ex | x
T -> wT'
T' -> *T'' | ε
T'' -> EyT' | yT'