LL(1)语法。如果有自递归规则,如何计算跟随集?

时间:2013-03-21 08:54:05

标签: parsing grammar context-free-grammar compiler-construction

根据此paper的规则:

  
      
  1. 如果A是起始非终结符,请将EOF置于FOLLOW(A)中   在右侧找到A的作品:
  2.   
  3. 对于每个产品X→αAβ,将FIRST(β) - {EPSILON}放入FOLLOW(A)
  4.   
  5. 如果EPSILON处于FIRST(β),则将FOLLOW(X)置于FOLLOW(A)
  6.   
  7. 对于每个生产X→αA,将FOLLOW(X)放入FOLLOW(A)
  8.   

我的语法中有下一篇文章:

 ...
    A -> C B
    B -> , A
    C -> EPSILON
    C -> =
    B -> ;
 ...

当我尝试根据规则4计算FOLLOW(B)时,我必须计算FOLLOW(A),反之亦然。因为自我递归,我有StackOverflowException。

我该怎么办?

1 个答案:

答案 0 :(得分:2)

您不使用递归。您迭代,根据前一次迭代计算的内容计算FOLLOW集:

  1. 如果A是起始非终结符,请在F [0](A)中输入 EOF (表示输入结束的新终端)。

  2. 对于每个生产X→αAβ,在F [n](A)中放置FIRST(β) - {EPSILON},

  3. 如果EPSILON处于FIRST(β),则将F [n-1](X)置于F [n](A)

  4. 对于每个生产X→αA,将F [n-1](X)放入F [n](A)。

  5. 当F [n](*)== F [n-1](*)

  6. 时停止

    关注(*)== F [n](*)