Parsing 无法用LL表示的LR语法示例?

Parsing 无法用LL表示的LR语法示例?,parsing,lr,ll,Parsing,Lr,Ll,所有LL语法都是LR语法,但不是相反,但我仍然难以处理这种区别。我很好奇LR语法的小例子,如果有的话,它们没有等价的LL表示。好吧,就语法而言,它很简单——任何简单的左递归语法都是LR(可能是LR(1))而不是LL。下面是一个语法列表: list ::= list ',' element | element 是LR(1)(假设元素的产量为),但不是LL。这样的语法可以很容易地通过左因子分解之类的方法转换成LL语法,所以这并不太有趣 更令人感兴趣的是LR而不是LL的语言——这是一种存在LR(1)

所有LL语法都是LR语法,但不是相反,但我仍然难以处理这种区别。我很好奇LR语法的小例子,如果有的话,它们没有等价的LL表示。

好吧,就语法而言,它很简单——任何简单的左递归语法都是LR(可能是LR(1))而不是LL。下面是一个语法列表:

list ::= list ',' element | element
是LR(1)(假设元素的产量为),但不是LL。这样的语法可以很容易地通过左因子分解之类的方法转换成LL语法,所以这并不太有趣

更令人感兴趣的是LR而不是LL的语言——这是一种存在LR(1)语法但没有LL(k)语法的语言。例如,需要可选尾随匹配的内容。例如,任何数量的
a
符号后跟相同数量或更少的
b
符号,但不超过
b
s--{a^i b^j|i>=j}的语言。有一个简单的LR(1)语法:

但没有LL(k)语法。原因是LL语法在查看a时需要决定是匹配a+b对还是奇数a,而LR语法可以将该决定推迟到看到b或输入结束后


在cs.stackechange.com上有很多关于这方面的参考资料,这似乎不太可能。该语法似乎与
if/else
非常匹配,即
语句::=if(…)语句| if(…)语句else(…)语句
。据我所知,LL解析器可以很好地处理这个问题。@DeadMG:正如您所注意到的,悬挂else语法是相同的模式,这就是为什么它不是LL,任何LL解析器都不能干净地处理它。当然,对于手工编写的解析器,您可以使用特别的解决方法(在这种情况下通常是小型LR解析器),但这不会改变语法不感兴趣的事实。这是否意味着几乎所有遵循此结构的语言都有非LL语法,并且几乎所有LL解析器生成器都必须有变通方法?是的。这个非LL问题就是为什么许多语言都有一个必须与if匹配的
endif
或其他结束标记,因为这使语言再次成为LL。@ChrisDodd:对不起,但是“琐碎的LR(1)语法”是不明确的,所以它不可能是LR:
aab
有两个不同的解析树,以
S
的前两个选项中的任一个作为根。我也不会说“任何左递归语法都是LR”,但您可能想说“任何左递归LR语法都不是LL”。
S ::= a S | P
P ::= a P b | \epsilon