Compiler construction 语法不是LL(1),即使它没有左递归或公共前缀

Compiler construction 语法不是LL(1),即使它没有左递归或公共前缀,compiler-construction,grammar,Compiler Construction,Grammar,据推测,下面的语法不是LL(1)。然而,我找不到这样做的理由。我认为它完全是LL(1),因为它没有左递归,也没有常见的前缀问题。有人能澄清一下吗 LL(1)意味着可以构造一个解析器,它使用单个令牌进行前瞻,在stmt中,assignment和subr\u call都是从ID开始的,因此解析器不能仅仅通过查看第一个令牌(ID)来区分这两种情况。来自斯坦福注释 非正式地说,LL(1)没有 左递归产品,并已左分解。请注意,这些是必要的 LL(1)但不充分的条件,即存在没有左递归或左递归的文法 非LL(

据推测,下面的语法不是LL(1)。然而,我找不到这样做的理由。我认为它完全是LL(1),因为它没有左递归,也没有常见的前缀问题。有人能澄清一下吗

LL(1)意味着可以构造一个解析器,它使用单个令牌进行前瞻,在
stmt
中,
assignment
subr\u call
都是从
ID
开始的,因此解析器不能仅仅通过查看第一个令牌(
ID
)来区分这两种情况。

来自斯坦福注释

非正式地说,LL(1)没有 左递归产品,并已左分解。请注意,这些是必要的 LL(1)但不充分的条件,即存在没有左递归或左递归的文法 非LL(1)的常用前缀


因此,这些是必要条件,而不是充分条件。

LL(1)
a simplest language=左前看1个标记。。事实上,对于stmt来说,查看ID并不能区分赋值和subr_调用
stmt->ID(rest_赋值| rest_subr_调用)
将是
LL(1)
@JoopEggen:和
expr
?或者你只是提供了一个例子?@rici yes expr有同样的问题:primary to ID和subr_call to ID。