【问题标题】:Is LR(2) parser a subset of LL(3)?LR(2) 解析器是 LL(3) 的子集吗?
【发布时间】:2013-04-27 14:04:07
【问题描述】:

有人问我 LL(3) 是否是 LR(2) 的子集,反之亦然。

我成功证明了 LL(3) 不是 LR(2) 的子集:

在 LL(3) 中,我们可以在读取开头的 3 个字符后识别规则。

在 LR(2) 中,我们可以在读取 2 个字符后识别规则。

因此,假设规则为空(upsilon),那么 LL(3) 将提供比 LR(2) 更多的信息。因此,LL(3) 不包含在 LR(2) 中。

我如何证明另一种方式?

【问题讨论】:

  • 它们是 LR(2)/LL(3) 语言集还是 LR(2)/LL(3) 语法集?
  • 对于语言,LL(3) 是 LR(2) 的严格子集...
  • 更多的是cs.stackexchange的问题,而不是堆栈溢出:)

标签: parsing lr ll


【解决方案1】:

https://cs.stackexchange.com/a/48 声明这些语言集都不是其他语言的子集。

更新:实际上它声明 LL(3) 是 LR(2) 的子集,抱歉。

【讨论】:

  • 它实际上是说 LL ⊂ LR(1) ,它还提到了 LR(1)=LR(k)=LR ,因此 LL IS 包含在 LR 中
  • 确实,最后一句话是关于 LL(*),而不是 LL。
  • 好的,你认为 LR(2) 也可以是 LL(3) 的子集吗?
  • 没关系,答案是否定的,我终于在某个网站上找到了。谢谢
  • 根据陈述,LR 显然是 LL(k) 的超集,所以现在你要问的是 LR(2) 是否是 LL(k) 的子集,只有当它们是时才有可能同一套。这显然是错误的 → LR(k) 不是 LL(k) 的子集
【解决方案2】:

根据我的编译器构建课程的幻灯片。

LR(k) = LR(1) 是任何 LL(k) 的超集

因此,LR(2) 或 LR(1) 是 LL(3) 或任何 LL(k) 的超集

查看链接中的图片。 Languages diagram. LR(k), LL(k)

我无法证明,但很明显 LR(k) | k >= 1,比 LL(k) | 更强大任何 k,因为 LL(k) 不支持左递归语法。不过,这仍然不是证据

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    相关资源
    最近更新 更多