好吧,我正在努力理解以下几集,我想我得到了它,除了一件事:
X -> a X
X -> b X
X -> epsilon
遵循this page的规则,FOLLOW(X)应包含$,文件结束符(规则1)。然后,遵循规则3,FOLLOW(X)包含FOLLOW(X)的所有内容,这使我的大脑融化。
对我来说,直觉上,FOLLOW(X)应该是{a,b,$},但在kfg Edit中尝试这个例子只能给我{$}。为什么呢?
答案 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。