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

时间:2015-04-13 17:41:26

标签: parsing compiler-construction grammar ll

我被赋予了将该语法转换为LL(1)

的任务
E → E+E | E-E | E*E | E/E | E^E | -E | (E)| id | num

所以第一步我消除了歧义并得到了这个:

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中并单击'Build LL(1)parse table'时,我会收到警告,上面的语法不是LL(1)。

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

1 个答案:

答案 0 :(得分:3)

你的语法仍然含糊不清,所以它不能是LL(1)。

此生产F → -E可以将表达式与较低优先级运算符混合在一个级别(一元运算符)中,而不应出现它们。

请注意id + - id + id有两个派生树。

你不应该在那里使用E,而应该使用代表原子价值的符号。你可以替换

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

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

F → -F | A如果您想允许多个一元缩误。