计算跟随集

时间:2012-05-09 15:28:31

标签: compiler-theory

好的,我已经了解了如何计算Follow_k(N)集(N是非终结符):对于形式A的每个生产规则 - > aBc你将First_k(First_k(c)Follow_k(A))添加到Follow_k(B)(a,c是任何一组终端和非终端,甚至是lambda)。 ......然后你重复这个,直到没有什么可以补充的。

但生产规则的情况如下:S - > ABCD(A,B,C,D都是非终结符)?

我应该 将First_k(First_k(BCD)Follow_k(S))添加到Follow_k(A)或
将First_k(First_k(CD)Follow_k(S))添加到Follow_k(B)或
将First_k(First_k(D)Follow_k(S))添加到Follow_k(C)或
将First_k(First_k(lambda)Follow_k(S))添加到Follow_k(D)或
完成上述所有工作?

更新:
我们以下面的语法为例:

S - > ABC
A - >一个
B - > b
C - > Ç

直观地说,Follow_1(S)= {}因为在S
之后没有任何内容 Follow_1(A)= {b}因为b跟在A,
之后 Follow_1(B)= {c}因为c跟在B,
之后 Follow_1(C)= {}因为在C.之后没有任何内容 为了使用算法得到这个结果,你必须考虑S - >的所有情况。 ABC

但我的判断或例子可能不对,所以问题仍然存在......

1 个答案:

答案 0 :(得分:2)

如果您在遇到其他类似的语法问题时遇到麻烦,请给这个online first, follow, & predict set finder一个机会。它是自动的,您可以比较其输出的答案,以了解如何解决这些问题。

  

但是生产规则会发生什么,例如:S - > ABCD(A,B,C,D都是非终结符)?

以下是rules for finding follow sets

  
      
  1. 首先将$(输入标记的结尾)放在Follow(S)中(S是起始符号)
  2.   
  3. 如果有生产A→aBb,(其中a可以是整个字符串)那么FIRST(b)中除ε之外的所有内容都放在FOLLOW(B)中。
  4.   
  5. 如果有生产A→aB,那么FOLLOW(A)中的所有内容都在FOLLOW(B)
  6.   
  7. 如果有生产A→aBb,其中FIRST(b)包含ε,那么FOLLOW(A)中的所有内容都在FOLLOW(B)
  8.   

让我们使用你的示例语法:

  • S - > ABC
  • A - >一个
  • B - > B'/ LI>
  • C - > ç

    1. 规则1说跟随(S)包含$。
    2. 规则2给出了我们:跟随(A)包含第一个(B);另外,跟随(B)包含第一个(C)。
    3. 规则3表示以下(C)包含以下(S)。
    4. 你的作品都不可为空,所以我们不关心规则#4。如果符号派生ε或者它导出可以为空的非终结符号,则该符号可以为空。

Nullability transitivity可以煽动人们。考虑一下这个语法:

  • S - > A
  • A - >乙
  • B - > ε

由于B导出ε,B可以为空。由于A导出B,它导出ε,A也可以为空。 S派生A,派生B,派生ε,所以S也可以为空。

当然,你没有把它提起来,但它是编译器课程混乱的常见原因,所以我想我会把它解决。

此外,如果您需要一些示例语法,http://faculty.stedwards.edu/laurab/cosc4342/g1answers.txt可能会很方便。