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

问题描述:

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

  1. 如果A是启动非终结符,把EOF在FOLLOW(A)
    与一个在右手边找到制作:
  2. 对于每一个生产X→αAβ,放FIRST(β) - {EPSILON}在FOLLOW(A)
  3. 如果EPSILON是在FIRST(β),然后把FOLLOW(X)转换成如下(A)
  4. 对于每个生产X →αA,把关注(X)按照(A)

我在我的语法下一块:

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

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

我该怎么办?

+0

也许更好问[cs.se]? – ShiDoiSi 2013-03-21 09:05:20

你不使用递归。你迭代,基于计算出的前一迭代什么计算FOLLOW组:

  1. 如果A是开始非终结,把EOF(一个新的终端指示输入结束时)在F [0] (一个)。

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

  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](*)

FOLLOW(*)== F [N](*)