Parsing 为什么这不是语法LL(1)

Parsing 为什么这不是语法LL(1),parsing,compiler-construction,grammar,ll,Parsing,Compiler Construction,Grammar,Ll,我接到一个任务,要把这个语法转换成LL(1) 第一步,我消除了歧义,得到了: E → E+T | E-T | T T → T*P | T/P | P P → P ^ F | F F → id | num | -E | (E) E → TE' E' → +TE' | -TE' | ɛ T → PT' T' → *PT' | /PT' | ɛ P → FP' P' → ^FP' | ɛ F → id | num | -E | (E) 之后,我消除了左递归,得到如下结果: E → E+T

我接到一个任务,要把这个语法转换成LL(1)

第一步,我消除了歧义,得到了:

E → E+T | E-T | T 
T → T*P | T/P | P
P → P ^ F | F
F → id | num | -E | (E)
E  → TE'
E' → +TE' | -TE' | ɛ
T  → PT'
T' → *PT' | /PT' | ɛ
P  → FP'
P' → ^FP' | ɛ
F  → id | num | -E | (E)
之后,我消除了左递归,得到如下结果:

E → E+T | E-T | T 
T → T*P | T/P | P
P → P ^ F | F
F → id | num | -E | (E)
E  → TE'
E' → +TE' | -TE' | ɛ
T  → PT'
T' → *PT' | /PT' | ɛ
P  → FP'
P' → ^FP' | ɛ
F  → id | num | -E | (E)
当我将其放入JFLAP并单击“buildll(1)parse table”时,我得到警告,上面的语法不是LL(1)


为什么此语法不是LL(1),我需要将什么更改为LL(1)。

您的语法仍然不明确,因此不能是LL(1)

本产品
F→ -E
使表达式可以在不应该出现的级别(一元运算符)中与优先级较低的运算符混合使用

注意,
id+-id+id
有两个派生树

这里不应该使用
E
,而应该使用表示原子值的符号。你可以代替

F → id | num | -E | (E)


F→ -F | A
如果要允许多个一元负数。

F→ id | num |-F |(E)
如果您不想引入另一个非终点答案。我已经像你们一样引入了新的终端符号,现在可以工作了。