【问题标题】:Is every LL(1) grammar also a LALR(1) grammar?每个 LL(1) 文法也是 LALR(1) 文法吗?
【发布时间】:2018-03-26 13:44:05
【问题描述】:

所以一个来源说是,另一个说不是

一位消息人士这样说:

另一个人这样说:

我找到的最接近的答案是这样的:

Relationship between LR(0), LL(0), LALR(1), etc?

但这并不能回答 LL(1) 和 LALR(1) 之间的关系

如果您能回答更一般的问题,即 LL(k) 和 LALR(k) 之间的关系是什么,那就更有帮助了

谢谢。

【问题讨论】:

  • 我不知道第一个图表来自哪里,但它完全不可靠。运算符优先级 语法 是 LR(1)。有些人(和维基百科)似乎认为“优先”这个词不相关,但这是不正确的。 运算符语法可能有歧义,因此不是 LR(1),但如果可以导出优先关系,则该语法是 LR(1)。
  • @rici 当运算符优先级语法可能不明确时,运算符优先级语法如何成为 LR(1)?这是否意味着如果语法是运算符优先级,那么我可以 100% 确定它也是 LR(1) 吗?你也有这个来源吗?谢谢
  • 如果解析中的任何点至多存在一个优先关系,则运算符语法就是运算符优先级。 <• 关系是移位动作,•> 是归约。所以不可能有换班冲突。证明不存在 reduce-reduce 冲突只是稍微复杂一些。
  • 任意运算符语法可能不明确,您可以构建一个运算符优先级解析器,而不是基于语法的优先关系。但是,这并没有使语法运算符优先级(恕我直言)。例如,这就是维基百科页面的问题。
  • 如果您需要资源,请在Computer Science 等学术网站上提问。我们是务实的程序员。

标签: parsing compiler-construction


【解决方案1】:

可以在computing science 站点的answer 中找到明确的答案(至少在 SE 网络上),在那里解析理论问题可能会吸引更好的响应。

阅读该答案中的图表时,请注意语法的包含关系和语言的包含关系之间存在差异。最明显的例子之一是所有 LR(k) 文法都可以机械地转换为 LR(1) 文法,结果只有两类 LR 语言: 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 中有一个练习,它提供了一个不是 LALR(1) 的 LL(1) 语法示例;您可以在this answer 中找到转录的语法。这应该提供一个关于如何为 k > 1 构造示例的想法。(找到不是 LL(k) 的 LALR(k) 语法很简单:你只需要左递归。)

【讨论】:

    猜你喜欢
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    • 2012-01-19
    • 2011-09-23
    相关资源
    最近更新 更多