parsing - 无法用 LL 表示的 LR 语法示例?

标签 parsing lr-grammar ll-grammar

所有 LL 语法都是 LR 语法,但反之则不然,但我仍然很难区分。我对没有等效 LL 表示的 LR 语法的小示例(如果存在)感到好奇。

最佳答案

嗯,就语法而言,很简单——任何简单的左递归语法都是 LR(可能是 LR(1))而不是 LL。所以列表语法如下:

list ::= list ',' element | element

是 LR(1)(假设元素的产生式是),但不是 LL。这样的语法可以通过左因子分解等相当容易地转换为 LL 语法,所以这并不是太有趣。

更令人感兴趣的是 LR 但不是 LL 的语言——这种语言存在 LR(1) 语法,但对于任何 k 都没有 LL(k) 语法。一个例子是需要可选尾随匹配的事物。例如,任意数量的 a 符号后跟相同数量或更少的 b 符号的语言,但不能有更多的 b -- { a^i b^j | 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 或输入末尾之后。

This post cs.stackechange.com 上有很多关于此的引用

关于parsing - 无法用 LL 表示的 LR 语法示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8809545/

相关文章:

parsing - LL 和递归下降解析器之间的区别?

parsing - 为什么左递归、非确定性或二义性文法不能是 LL(1)?

java - 在 Android 中解析 double 时出错

java - 使用 ANTLR 将非贪婪序列作为字符串获取

parsing - 在编写基于 LR(0) 算法的解析器时,什么是 magic 和 tau 步骤?

parsing - 了解语法是否是 LR(1) 且没有解析表

java - 将 Univocity 解析器与 Spring Batch 结合使用

python - 使用 Parsimonious Python 库解析多行文本

parsing - LL(1) S → a | 的解析表巴| C