根据此paper的规则:
- 如果A是起始非终结符,请将EOF置于FOLLOW(A)中 在右侧找到A的作品:
- 对于每个产品X→αAβ,将FIRST(β) - {EPSILON}放入FOLLOW(A)
- 如果EPSILON处于FIRST(β),则将FOLLOW(X)置于FOLLOW(A)
- 对于每个生产X→αA,将FOLLOW(X)放入FOLLOW(A)
我的语法中有下一篇文章:
...
A -> C B
B -> , A
C -> EPSILON
C -> =
B -> ;
...
当我尝试根据规则4计算FOLLOW(B)时,我必须计算FOLLOW(A),反之亦然。因为自我递归,我有StackOverflowException。
我该怎么办?
答案 0 :(得分:2)
您不使用递归。您迭代,根据前一次迭代计算的内容计算FOLLOW
集:
如果A是起始非终结符,请在F [0](A)中输入 EOF (表示输入结束的新终端)。
对于每个生产X→αAβ,在F [n](A)中放置FIRST(β) - {EPSILON},
如果EPSILON处于FIRST(β),则将F [n-1](X)置于F [n](A)
对于每个生产X→αA,将F [n-1](X)放入F [n](A)。
当F [n](*)== F [n-1](*)
关注(*)== F [n](*)