每个 LL(1) 文法都是 LALR(1) 文法吗?
Is every LL(1) grammar also a LALR(1) grammar?
所以一个消息来源说是,另一个消息来源说不是
一位消息人士这样说:
另一个人这样说:
我找到的最接近的答案是:
但这并没有回答 LL(1) 和 LALR(1) 之间的关系
也 如果你能回答更一般的问题,即 LL(k) 和 LALR(k) 之间的关系,那将更有帮助
谢谢。
可以在此 answer in the computing science 站点中找到明确的答案(至少在 SE 网络上),其中解析理论问题可能会吸引更好的响应。
阅读该答案中的图表时,请注意 grammars 的包含关系与 languages 的包含关系之间存在差异。最明显的例子之一是所有 LR(k) 文法都可以机械地转换为 LR(1) 文法,结果只有两类 LR languages : LR(0) 和 LR(1)。 (事实上,您可以将 LR(k) 语言简化为 SLR(1),因此各种算法的区别在语言级别也消失了。)另一方面,LL(k) 语言是严格的包含层次结构。 LL(k) 语言的并集(对于有限的 k)是 LR(1) 的严格子集。
但是对于文法来说,关系并不是那么简单。显然,LL(k)、LR(k)、LALR(k)、SLR(k) 等直观地形成层次结构,因为没有必要使用所有先行信息,并且因为对于任何文法都可以添加需要 k+1 前瞻的产品(对于 LL 和 LR 算法)。
LL(k) 文法必然是 LR(k) 但它们不一定是 LALR(k)。 Appel's Modern Compiler Implementation textbook which provides an example of an LL(1) grammar which is not LALR(1); you can find the grammar transcribed in this answer有练习。这应该提供一个关于如何为 k > 1 构造示例的想法。(找到不是 LL(k) 的 LALR(k) 语法是微不足道的:你所需要的只是左递归。)
所以一个消息来源说是,另一个消息来源说不是
一位消息人士这样说:
另一个人这样说:
我找到的最接近的答案是:
但这并没有回答 LL(1) 和 LALR(1) 之间的关系
也 如果你能回答更一般的问题,即 LL(k) 和 LALR(k) 之间的关系,那将更有帮助
谢谢。
可以在此 answer in the computing science 站点中找到明确的答案(至少在 SE 网络上),其中解析理论问题可能会吸引更好的响应。
阅读该答案中的图表时,请注意 grammars 的包含关系与 languages 的包含关系之间存在差异。最明显的例子之一是所有 LR(k) 文法都可以机械地转换为 LR(1) 文法,结果只有两类 LR languages : LR(0) 和 LR(1)。 (事实上,您可以将 LR(k) 语言简化为 SLR(1),因此各种算法的区别在语言级别也消失了。)另一方面,LL(k) 语言是严格的包含层次结构。 LL(k) 语言的并集(对于有限的 k)是 LR(1) 的严格子集。
但是对于文法来说,关系并不是那么简单。显然,LL(k)、LR(k)、LALR(k)、SLR(k) 等直观地形成层次结构,因为没有必要使用所有先行信息,并且因为对于任何文法都可以添加需要 k+1 前瞻的产品(对于 LL 和 LR 算法)。
LL(k) 文法必然是 LR(k) 但它们不一定是 LALR(k)。 Appel's Modern Compiler Implementation textbook which provides an example of an LL(1) grammar which is not LALR(1); you can find the grammar transcribed in this answer有练习。这应该提供一个关于如何为 k > 1 构造示例的想法。(找到不是 LL(k) 的 LALR(k) 语法是微不足道的:你所需要的只是左递归。)