我怀疑有一个问题,试图计算需要 FOLLOW(A) 的 FOLLOW(S),但是由于 A 生产是在 S 生产之后,我们还没有计算 FOLLOW(A)。所以,我们应该添加 FOLLOW( A)太inf FOLLOW(S)???
1 回答
要计算任何非终结符 S 的 FOLLOW(S),请应用以下规则,直到无法将任何内容添加到任何 FOLLOW 集中。
将 $ 放在 FOLLOW(S) 中,其中 S 是开始符号。
如果存在产生式 S -> CBD,则 FIRST(D) 中除 epsilon 之外的所有内容都在 FOLLOW(B) 中。
如果存在一个骄傲 S -> CB,或一个生产 S -> CBD,其中 FIRST(D) 包含 epsilon,那么 FOLLOW(S) 中的所有内容都在 FOLLOW(B) 中。
试图计算需要 FOLLOW(A) 的 FOLLOW(S),但由于 A 生产在 S 生产之后,我们还没有计算 FOLLOW(A)。所以,我们是否应该在 FOLLOW(S) 中添加 FOLLOW(A) ???
所以,从给定的语法中可以看出,
根据规则 1,follow(S) 将包含 $。
此外,根据规则 2,S 出现在仅后跟 D( non-terminal ) 的主体中,因此,除了 FIRST(D) 中的 epsilon 之外的所有内容都必须在 FOLLOW(S) 中。所以,FOLLOW(S) 必须包含一个。
此外,根据规则 3,考虑到产生式 A->ASD |epsilon 并且 FIRST(D) 包含 epsilon,我们应该得到 FOLLOW(S) = FOLLOW(A)。
所以,是的,您需要在 FOLLOW(S) 之前计算 FOLLOW(A)。
而且,FOLLOW(A) = FIRST(S) 中的所有内容,除了 epsilon + b = {a,b}。
- 此外,在 C 产生式中,S 后跟 b,因此 FOLLOW(S) 必须包含 f。
因此,FOLLOW(S) = {a,b,f,$}。
我不知道您是如何计算出计算 FOLLOW(S) 需要 FOLLOW(A) 的。事实并非如此。请再次阅读本答案开头提到的规则 1 至 3。