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



我试着把我的规则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 NUM2NUM2,因为NUM2已经在T之后的S中。

根据你的评论,我将更新答案。正如我所写的,语法可能不是您想要的,下面是更改后的语法:
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)吗?答案是"是的"。但是语法是否识别出你所期望的是另一个问题。

但是,如果您需要完全符合原始语法,则此输入将被接受:

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

最新更新