3

この論文の規則によると:

  1. Aが非終端記号の開始である場合は、EOFをFOLLOW(A)に入れ
    ます。右側にAがあるプロダクションを検索します。
  2. X→αAβの各プロダクションについて、FIRST(β)− {EPSILON}をFOLLOW(A)に入れます。
  3. EPSILONがFIRST(β)にある場合は、FOLLOW(X)をFOLLOW(A)に入れます
  4. 各プロダクションX→αAについて、FOLLOW(X)をFOLLOW(A)に入れます

文法に次の部分があります。

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

ルール4に従ってFOLLOW(B)を計算しようとすると、FOLLOW(A)を計算する必要があり、その逆も同様です。したがって、自己再帰のためにStackOverflowExceptionが発生します。

私は何をすべきか?

4

1 に答える 1

4

再帰は使用しません。前の反復で計算されたものに基づいてFOLLOWセットを計算し、反復します。

  1. Aが非終端記号の開始である場合は、EOF(入力の終了を示す新しい終端記号)をF [0](A)に入れます。

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

于 2013-03-21T23:02:50.957 に答える