所有LL语法都是LR语法,但不是相反,但我仍然很难处理这种区别。我很好奇LR示例中没有等效LL表示的小例子(如果有的话)。
答案 0 :(得分:18)
嗯,就语法而言,它很简单 - 任何简单的左递归语法都是LR(可能是LR(1))而不是LL。所以列表语法如:
list ::= list ',' element | element
是LR(1)(假设元素的产生是)但不是LL。这样的语法可以很容易地通过左因子等转换成LL语法,所以这不是太有趣了。
更感兴趣的是LR而不是LL的语言 - 这是一种语言,对于任何k,存在LR(1)语法但没有LL(k)语法。一个例子是需要可选的尾随匹配的东西。例如,任意数量的a
符号的语言后跟相同数量或更少的b
符号,但不会更多b
s - {a ^ i b ^ j |我> = j}。有一个简单的LR(1)语法:
S ::= a S | P
P ::= a P b | \epsilon
但没有LL(k)语法。原因是LL语法需要在查看a时决定是匹配a + b对还是奇数a,而LR语法可以将该决定推迟到看到b或输入结束之后。< / p> cs.stackechange.com上的
This post有很多关于此
的参考资料