1

好吧,我试图理解跟随集,我想我明白了,除了一件事:

X -> a X
X -> b X
X -> epsilon

按照本页的规则,FOLLOW(X) 应包含 $,即文件结尾字符(规则 1)。然后,按照规则 3,FOLLOW(X) 包含 FOLLOW(X) 的所有内容,这让我的大脑融化了。

对我来说,直觉上,FOLLOW(X) 应该是 {a,b,$},但是在kfg Edit中尝试这个例子只给了我 {$}。为什么?

4

1 回答 1

2

FOLLOW(X) 通常是其自身的一个子集,因此规则 3 在应用于右递归产生式时没有任何贡献。

虽然这很容易通过描述来解决,但您的困难可能源于考虑计算算法。为了计算 FOLLOW 集,您可以根据规则迭代地填充它们直到饱和。那么你也不需要为琐碎的情况做任何事情。

然而,没有任何规则可以将 a 或 b 放入 FOLLOW(X),而且我看不出有任何理由期望它们出现在 FOLLOW(X) 中。语法很简单,可以想象它可以生成的完整语法树集:

                                                                  X
                                                                 /|
                                                 X              / X
                                                /|             / /|
                                  X            / X            / / X
                                 /|           / /|           / / /|
                     X          / X          / / X          / / / X
                    /|         / /|         / / /|         / / / /|
          X        / X        / / X        / / / X        / / / / X
         /|       / /|       / / /|       / / / /|       / / / / /|
 X      / X      / / X      / / / X      / / / / X      / / / / / X
 |     /  |     / /  |     / / /  |     / / / /  |     / / / / /  |
 ε    α   ε    α α   ε    α α α   ε    α α α α   ε    α α α α α   ε    ...

( for α ∊ {a, b} )

他们只允许 X 在最右边,所以没有办法让 X 后跟 a 或 b。

于 2010-08-23T19:41:03.620 回答