Parsing 我该怎么做这个语法LL(1)?

Parsing 我该怎么做这个语法LL(1)?,parsing,compiler-construction,grammar,theory,ll,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 |

假设我有这个语法

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),因为由此生成的解析表将有多个终端的多个条目。我似乎遗漏了什么?

我知道了怎么做,所以最后一步我们有了这个配置

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'