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所示。
答案 0 :(得分:3)
LR(0)解析器没有预测,因此如果在给定的解析器状态下两者都可行,则无法在reduce和shift操作之间做出决定。所以减少状态不能有转换过渡。
是的,SLR算法过高估计每个减少行动的先行集,只需使用非终端的FOLLOW集即可。
没有。规范LR算法基于解析器上下文(即状态)计算每个动作的先行集。要计算此集合,了解每个非终端的第一组(并且能够计算任何句子形式的第一组)是有用的,但计算的超前集合不是任何非终端的第一组。正如教科书中所指出的,它是非终端的FOLLOW集的一个子集被减少,并且在某些语法中,它将是一个合适的子集。这意味着"相同"两个不同状态的减少可能具有不同的前瞻集,因为在不同的上下文中达到了两个状态。正如您所注意到的,教科书提供了一个例子,值得详细研究这个例子。