不同类型的 LR 解析器使用什么作为前瞻?
What do the different kinds of LR Parsers use as lookahead?
- 如果下一个输入符号没有转换(因为它没有前瞻性),LR(0)-Parsers 简单地减少是否正确?
- SLR(1)-Parsers 使用产生式的 FOLLOW-Set 作为前瞻是否正确?
- 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
段下说:
Thus, we are compelled to reduce by A → α only on those input symbols
a for which [A → α·, a] is an LR(1) item in the state on top of the
stack. The set of such a's will always be a subset of FOLLOW(A),
but it could be a proper subset, as in Example 4.51.
LR(0) 解析器没有前瞻性,因此如果在给定的解析器状态下两者都可能的话,它无法在减少和移位操作之间做出决定。所以一个reduce状态不能有移位转换。
是的,SLR算法高估了每个归约动作的前瞻集,仅使用被归约的非终结符的FOLLOW集。
没有。规范的 LR 算法根据解析器上下文(即状态)为每个操作计算前瞻集。要计算这个集合,知道每个非终结符的第一个集合(并且能够计算任何句子形式的第一个集合)是很有用的,但是计算出的先行集合不是任何非终结符的第一个集合。正如教科书上所说,它是非终结符被约化的FOLLOW集的一个子集,在某些文法的某些状态下,它会是一个真子集。这意味着两个不同状态下的 "same" 减少可能具有不同的前瞻集,因为这两个状态是在不同的上下文中达到的。教科书提供了一个例子,如你所见,值得详细研究这个例子。
- 如果下一个输入符号没有转换(因为它没有前瞻性),LR(0)-Parsers 简单地减少是否正确?
- SLR(1)-Parsers 使用产生式的 FOLLOW-Set 作为前瞻是否正确?
- 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
段下说:
Thus, we are compelled to reduce by A → α only on those input symbols a for which [A → α·, a] is an LR(1) item in the state on top of the stack. The set of such a's will always be a subset of FOLLOW(A), but it could be a proper subset, as in Example 4.51.
LR(0) 解析器没有前瞻性,因此如果在给定的解析器状态下两者都可能的话,它无法在减少和移位操作之间做出决定。所以一个reduce状态不能有移位转换。
是的,SLR算法高估了每个归约动作的前瞻集,仅使用被归约的非终结符的FOLLOW集。
没有。规范的 LR 算法根据解析器上下文(即状态)为每个操作计算前瞻集。要计算这个集合,知道每个非终结符的第一个集合(并且能够计算任何句子形式的第一个集合)是很有用的,但是计算出的先行集合不是任何非终结符的第一个集合。正如教科书上所说,它是非终结符被约化的FOLLOW集的一个子集,在某些文法的某些状态下,它会是一个真子集。这意味着两个不同状态下的 "same" 减少可能具有不同的前瞻集,因为这两个状态是在不同的上下文中达到的。教科书提供了一个例子,如你所见,值得详细研究这个例子。