1

ANTLR文法に問題がありますが、問題が発生していません。1時間以上問題を解決しようとしています。私は自分の問題を次の単純な文法に分解しました。

        grammar TestGrammar;

        options {
          language = Java;
          k=2;
        }

        compu_method :  '/begin COMPU_METHOD'  NAME  NAME  NAME  NAME
              (
              (formula)
              |('COEFFS' realnumber realnumber realnumber realnumber realnumber realnumber)
              )*
              '/end COMPU_METHOD';

            formula : '/begin FORMULA' (.)* '/end FORMULA';

            realnumber: (INT | FLOAT);

        NAME : LETTER (LETTER|'0'..'9'|'['|']'|'.')* ; 
        fragment LETTER : 'A'..'Z' | 'a'..'z' | '_' ; 

        INT : MINUS? ('0' | '1'..'9' '0'..'9'*) ; 
        FLOAT : MINUS? ('0'..'9')+ '.' ('0'..'9')* Exponent? | MINUS? '.' ('0'..'9')+ Exponent? | MINUS? ('0'..'9')+ Exponent ; 
        MINUS : '-' ; 
        fragment Exponent : ('e'|'E') ('+'|'-')? ('0'..'9')+ ;

        WS : ( '\r\n'|'\n'|' '|'\r'|'\t'|'\u000C' ) { $channel=HIDDEN;}; 

そして、私が一致させようとしている入力は次のとおりです。

/begin COMPU_METHOD
        foo
        foo
        foo
        foo
        COEFFS 0.000000 1.000000 0.000000 0.000000 0.000000 1.000000
/end COMPU_METHOD

通訳者は常に「入力が一致しない'COEFFS'が'\u0005'を期待している」と表示します

しかし、なぜ?

グラマーで(数式)と('COEFFS' ...)の順序を変更しても問題ありませんが、理由がわかりません。

4

1 に答える 1

1

エラーを修正した後 ( に無効なNトークンがあり、ルールcompu_methodの後にセミコロンを忘れている)、入力の解析に問題はありません。formula次の解析ツリーを取得します。

ここに画像の説明を入力

インタープリターではなくデバッガーを使用したことに注意してください (これにはバグがあります)。したがって、問題はおそらくインタープリターを使用したことです。

于 2012-05-02T17:29:43.570 に答える