在此页面上,作者解释了如何确定 CFG 的 FOLLOW 集。在标题语法分析目标:FOLLOW Sets下,他说:
制作跟随集的步骤
约定:a、b 和 c 代表终端或非终端。a* 表示零个或多个终端或非终端(可能两者)。a+ 代表一个或多个... D 是非终结符。
- 将输入结束标记 ($) 放入起始规则的后续集中。
- 假设我们有一个规则 R → a*Db。First(b) 中的所有内容(ε 除外)都添加到 Follow(D)。如果 First(b) 包含 ε,则 Follow(R) 中的所有内容都放入 Follow(D)。
- 最后,如果我们有规则 R → a*D,那么 Follow(R) 中的所有内容都放在 Follow(D) 中。
- 终端的跟随集是一个空集。
到目前为止,一切都很好。但是在这个项目下面的框中,我们读到:
[...] 规则 1 (N → V = E) 的第 2 步表明 first(=) 在 Follow(V) 中。
现在这是我不明白的部分。当他说 First(=) 在 Follow (V) 中时,他显然将 = 映射到 b 并将 V 映射到 D(b 和 D 来自第一个框中的说明)。但(a*)(D)(b)
不匹配()(V)(=)E
。
我完全看错了,还是作者可能写a*Db
而不是a*Dba*
?
(特别是如果您在wikipedia上阅读此内容:“项目 I [A → α • B β, x] 的 FOLLOW(I) 是可以出现在非终结符 B 之后的终结符集,其中 α, β 是任意符号字符串,并且x 是一个任意的前瞻终端。")