所有的LL文法都是LR文法,但反之则不然,但我仍然很难区分它们。如果存在的话,我很好奇是否有一些LR文法没有等效的LL表示的小例子。
所有的LL文法都是LR文法,但反之则不然,但我仍然很难区分它们。如果存在的话,我很好奇是否有一些LR文法没有等效的LL表示的小例子。
好的,就语法而言,很容易理解——任何简单的左递归语法都是LR(可能是LR(1)),而不是LL。因此,像下面这样的列表语法:
list ::= list ',' element | element
假设元素的产生式是,LR(1)可行的(但假设它不是LL)。这些语法可以通过左因子化等方式很容易地转换为LL语法,因此并不太有趣。
更有趣的是那些LR但不是LL的“语言”--也就是对于这样的语言,存在一个LR(1)文法,但没有任何k的LL(k)文法。例如,需要可选尾随匹配的事物。例如,任意数量的a
符号,后跟相同数量或更少的b
符号的语言,但不包括更多的b
s - {a^i b^j | i >= j}。有一个微不足道的LR(1)文法:
S ::= a S | P
P ::= a P b | \epsilon
但没有LL(k)文法。原因是LL文法需要在查看a时决定匹配a+b对还是奇数a,而LR文法可以推迟该决策,直到看到b或输入结束。
这篇cs.stackechange.com上的帖子有很多相关参考资料。
if/else
- 即,statement :: = if (...) statement | if (...) statement else (...) statement
。据我所知,这在 LL 解析器中是可以处理的。 - Puppyendif
或其他结束标记,必须与if匹配,因为这使得语言再次成为LL。 - Chris Doddaab
有两个不同的解析树,其中第一个或第二个S
的替代方案可以作为根。此外,我不会说“任何左递归语法都是LR”,但您可能想说“任何左递归LR语法都不是LL”。 - Gunther