不同种类的LR Parsers使用什么作为前瞻?

时间:2017-10-18 07:57:21

标签: parsing lr bottom-up

  1. 是否正确,如果下一个输入符号没有转换(因为它没有预测),LR(0)-Parsers会简单地减少?
  2. 是否正确,SLR(1)-Parsers使用产品的FOLLOW-Set作为预测?
  3. 是否正确,LR(1)-Parsers使用FIRST-, FOLLOW-Set作为预测?
  4. closure的算法明确使用FIRST

    closure(S)
    For each item [A → α ⋅ B β, t] in S,
      For each production B → γ in G,
        For each token b in FIRST(βt),
          Add [B → ⋅ γ, b] to S
    

    然后,我对此感到困惑。

    在第4.7.1 Canonical LR(1) Items段中,龙书说:

      

    因此,我们被迫仅在那些输入符号上减少A→α   a [A→α·,a] 是一个LR(1)项的状态   堆。这样的一组将始终是 FOLLOW(A)的子集,   但它可能是一个合适的子集,如例4.51所示。

1 个答案:

答案 0 :(得分:3)

  1. LR(0)解析器没有预测,因此如果在给定的解析器状态下两者都可行,则无法在reduce和shift操作之间做出决定。所以减少状态不能有转换过渡。

  2. 是的,SLR算法过高估计每个减少行动的先行集,只需使用非终端的FOLLOW集即可。

  3. 没有。规范LR算法基于解析器上下文(即状态)计算每个动作的先行集。要计算此集合,了解每个非终端的第一组(并且能够计算任何句子形式的第一组)是有用的,但计算的超前集合不是任何非终端的第一组。正如教科书中所指出的,它是非终端的FOLLOW集的一个子集被减少,并且在某些语法中,它将是一个合适的子集。这意味着"相同"两个不同状态的减少可能具有不同的前瞻集,因为在不同的上下文中达到了两个状态。正如您所注意到的,教科书提供了一个例子,值得详细研究这个例子。