我的语法不是 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
中的 T
和 T
中的 NUM2
,因为它们已经在 ST
中。我还从 ST
的末尾删除了 C
,因为 LIST
的末尾有 O
,而 C D
已经存在。最初的问题是语法 LL(1),'yes' 是。但是语法是否识别你所期望的是另一个问题。
如果您确实需要您的原始语法,那么将接受此输入:
for name := num to num to num num do begin operator ; end ; ;
我已经尝试将我的规则放入 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
中的 T
和 T
中的 NUM2
,因为它们已经在 ST
中。我还从 ST
的末尾删除了 C
,因为 LIST
的末尾有 O
,而 C D
已经存在。最初的问题是语法 LL(1),'yes' 是。但是语法是否识别你所期望的是另一个问题。
如果您确实需要您的原始语法,那么将接受此输入:
for name := num to num to num num do begin operator ; end ; ;