我的语法不是 LL(1)?哪里不对?

My grammar isn't LL(1)? Where it's incorrect?

我已经尝试将我的规则放入 https://www.cs.princeton.edu/courses/archive/spring20/cos320/LL1/ 但它无法解析字符串

for name := num to num do begin operator ; end ;

S ::= for NAME := NUM1 T NUM2 do LIST C
NAME ::= name
NUM1 ::= num T
T ::= to NUM2
NUM2 ::= num
LIST ::= begin O
O ::= operator C D
C ::= ;
D ::= O
D ::= end C

语法是 LL(1),但是这个工具似乎在内部使用 S 作为开始规则,而您的语法中已经有了它。如果将其重命名为 'X'(例如),它似乎可以被识别。此外,您可能不希望 NUM1 ::= num T,因为 T 在规则 S 中的 NUM1 之后已经可用,应该重命名。您可能也不希望 T ::= to NUM2 拥有 NUM2,因为 NUM2 已经在 S 之后 T

根据您的评论,我会更新答案。正如我所写的,语法可能不是你想要的,这里是更改后的语法:

ST ::= for NAME := NUM1 T NUM2 do LIST
NAME ::= name
NUM1 ::= num
T ::= to
NUM2 ::= num
LIST ::= begin O
O ::= operator C D
C ::= ;
D ::= O
D ::= end C

我已经删除了 NUM1 中的 TT 中的 NUM2,因为它们已经在 ST 中。我还从 ST 的末尾删除了 C,因为 LIST 的末尾有 O,而 C D 已经存在。最初的问题是语法 LL(1),'yes' 是。但是语法是否识别你所期望的是另一个问题。

如果您确实需要您的原始语法,那么将接受此输入:

for name := num to num to num num do begin operator ; end ; ;