1
  1. 如果下一个输入符号没有转换(因为它没有前瞻),LR(0)-Parsers 会简单地减少它是否正确?
  2. SLR(1)-Parsers 使用产品的 FOLLOW-Set 作为前瞻是否正确?
  3. LR(1)-Parsers 使用 FIRST-,而不是FOLLOW-Set 作为前瞻,对吗?

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]是处于堆栈顶部状态的 LR(1) 项的输入符号 a 进行 A → α减少。此类 a 的集合将始终是FOLLOW(A)的子集,但它也可以是真子集,如示例 4.51 中所示。

4

1 回答 1

3
  1. LR(0) 解析器没有前瞻,因此如果在给定的解析器状态下两者都可能,则它无法决定减少和移位操作。所以减少状态不能有移位转换。

  2. 是的,SLR 算法仅使用被归约的非终结符的 FOLLOW 集就高估了每个归约操作的前瞻集。

  3. 不会。规范的 LR 算法根据解析器上下文(即状态)为每个动作计算一个前瞻集。为了计算这个集合,知道每个非终结符的 FIRST 集是有用的(并且能够计算任何句子形式的 FIRST 集),但是计算的前瞻集不是任何非终结符的 FIRST 集。正如教科书中所指出的,它是被约简的非终结符的 FOLLOW 集合的一个子集,并且在某些语法的某些状态下,它将是一个适当的子集。这意味着两个不同状态的“相同”减少可能具有不同的前瞻集,因为这两个状态是在不同的上下文中达到的。正如您所注意到的,教科书提供了一个示例,值得详细研究这个示例。

于 2017-10-18T15:05:10.313 回答