遵循自递归规则集

时间:2010-08-06 12:01:43

标签: grammar context-free-grammar

好吧,我正在努力理解以下几集,我想我得到了它,除了一件事:

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

遵循this page的规则,FOLLOW(X)应包含$,文件结束符(规则1)。然后,遵循规则3,FOLLOW(X)包含FOLLOW(X)的所有内容,这使我的大脑融化。

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

1 个答案:

答案 0 :(得分: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。