我试着把我的规则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
已经在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 ; ;