0

我怀疑有一个问题,试图计算需要 FOLLOW(A) 的 FOLLOW(S),但是由于 A 生产是在 S 生产之后,我们还没有计算 FOLLOW(A)。所以,我们应该添加 FOLLOW( A)太inf FOLLOW(S)???

在此处输入图像描述

4

1 回答 1

0

要计算任何非终结符 S 的 FOLLOW(S),请应用以下规则,直到无法将任何内容添加到任何 FOLLOW 集中。

  1. 将 $ 放在 FOLLOW(S) 中,其中 S 是开始符号。

  2. 如果存在产生式 S -> CBD,则 FIRST(D) 中除 epsilon 之外的所有内容都在 FOLLOW(B) 中。

  3. 如果存在一个骄傲 S -> CB,或一个生产 S -> CBD,其中 FIRST(D) 包含 epsilon,那么 FOLLOW(S) 中的所有内容都在 FOLLOW(B) 中。

试图计算需要 FOLLOW(A) 的 FOLLOW(S),但由于 A 生产在 S 生产之后,我们还没有计算 FOLLOW(A)。所以,我们是否应该在 FOLLOW(S) 中添加 FOLLOW(A) ???

所以,从给定的语法中可以看出,

  1. 根据规则 1,follow(S) 将包含 $。

  2. 此外,根据规则 2,S 出现在仅后跟 D( non-terminal ) 的主体中,因此,除了 FIRST(D) 中的 epsilon 之外的所有内容都必须在 FOLLOW(S) 中。所以,FOLLOW(S) 必须包含一个。

  3. 此外,根据规则 3,考虑到产生式 A->ASD |epsilon 并且 FIRST(D) 包含 epsilon,我们应该得到 FOLLOW(S) = FOLLOW(A)。

所以,是的,您需要在 FOLLOW(S) 之前计算 FOLLOW(A)。

而且,FOLLOW(A) = FIRST(S) 中的所有内容,除了 epsilon + b = {a,b}。

  1. 此外,在 C 产生式中,S 后跟 b,因此 FOLLOW(S) 必须包含 f。

因此,FOLLOW(S) = {a,b,f,$}。

我不知道您是如何计算出计算 FOLLOW(S) 需要 FOLLOW(A) 的。事实并非如此。请再次阅读本答案开头提到的规则 1 至 3。

于 2015-08-10T21:34:38.130 回答