5

Antlr 文法の次のサブパートがあります。

signed_int
        : SIGN? INT
    ;

INT : '0'..'9'+
        ;

誰かが数値を入力した場合は問題ありませんが、1O (1 と大文字の o) のようなものを誤って入力すると、次のような不可解なエラー メッセージが表示されます。

error 1 : Missing token  at offset 14
near [Index: 0 (Start: 0-Stop: 0) ='<missing COLON>'     type<24> Line: 26 LinePos:14]
 : syntax error...

この種のエラーを処理する良い方法は何ですか? キャッチオール SYMBOL トークン タイプを定義することを考えましたが、パーサー構築エラーが多すぎます。Antlr のエラー処理については引き続き調査しますが、洞察を得るためにここに投稿することにしました。

4

2 に答える 2

5

レクサーとパーサーで reportError メソッドをオーバーライドする必要があります。次のコードをレクサー ファイルに追加することで、これを行うことができます。

  @Override
public void reportError(RecognitionException e) {
    throw new RuntimeException(e);
}

そして、入力文字列が指定された文法に一致するかどうかをチェックするメソッドに一致するパーサーを作成します。

 public static boolean matches(String input) {
     try {
         regExLexer lexer = new regExLexer(new ANTLRStringStream(input));
         regExParser parser = new regExParser(new CommonTokenStream(lexer));
         parser.goal();
         return true;
     } catch (RuntimeException e) {
         return false;
     }
     catch (Exception e) {
         return false;
     }
     catch (OutOfMemoryError e) {
         return false;
     }

 }

 @Override
 public void reportError(RecognitionException e) {
     throw new RuntimeException(e);
 }

次に、ファイルで Parser.matches(input); を使用します。指定された入力が文法に一致するかどうかを確認します。メソッドが一致する場合は true を返し、それ以外の場合は false を返します。そのため、false を返す場合は、カスタマイズしたエラー メッセージをユーザーに表示できます。

于 2012-05-03T09:21:24.467 に答える