编译器设计首先并遵循

时间:2015-08-10 13:41:34

标签: parsing compiler-construction grammar bottom-up top-down

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

enter image description here

1 个答案:

答案 0 :(得分:0)

要为任何非终端S计算FOLLOW(S),请应用followwing规则,直到任何FOLLOW集都无法添加任何内容。

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

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

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

  4.   

    尝试计算其中需要FOLLOW(A)的FOLLOW(S),但是作为A.   生产是在S生产后,我们还没有计算出FOLLOW(A)   那么,我们是否应该加下FOLLOW(A)以及FOLLOW(S)???

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

    1. 根据规则1,后面的(S)将包含$。

    2. 此外,根据规则2,S出现在主体中,后面跟着D(非终端),因此,除了第一个(D)中的epsilon之外的所有内容都必须在FOLLOW中(S)。因此,FOLLOW(S)必须包含。

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

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

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

      1. 此外,在C-production中,S后跟b,因此FOLLOW(S)必须包含f。
      2. 因此,关注(S)= {a,b,f,$}。

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