16

作成しているJavaツールで論理式を解析するためにANTLRを使用していますが、生成されたANTLRレクサーとパーサーに無効な入力文字列を渡しても例外が発生しないため、問題が発生しています。予想どおり、RecognitionExceptionをスローする代わりに、生成されたファイルはエラーメッセージをコンソールに出力し、エラーが発生しなかったかのように返します。これにより、後で空のデータが発生したときにプログラムがクラッシュします。

ANTLRWorksバージョン1.4.3を使用してファイルを生成しました。コンソールに出力するのではなく、実際にエラーをスローするための何らかのオプションがあるはずですが、何も見つかりませんでした。ANTLRに実際にエラーメッセージをスローさせる方法を知っている人はいますか?C#でのこの同じ問題は、古いバージョンのANTLRを使用することで解決されたことがわかりましたが、それは私がする必要があることですか?

編集:バートが私が探していた方向に私を向けた後、私はこのページを見つけました

https://theantlrguy.atlassian.net/wiki/display/ANTLR3/Migrating+from+ANTLR+2+to+ANTLR+3

その「エラー処理」セクションには、私が望むことをより正確に実行するコードが含まれていました。ANTLRが例外をキャッチする方法を変更するには、文法ファイルで次のように言うことができます。

@rulecatch {
   catch (RecognitionException e) {
    throw e;
   }
}

これにより、ANTLRは例外を処理して回復するのではなく、例外をスローします。そのセクションには、すべての可能な例外がスローされることを確認するために、不一致および回復関数をオーバーライドすることについてのいくつかのこともあります。

4

2 に答える 2

17

reportError(...)簡単な修正は、ANTLRが誤った構文/入力から回復しようとするのではなく、レクサーとパーサーをオーバーライドして、独自の例外をスローすることです。

grammar YourGrammar;

// options/header/tokens

@parser::members {
  @Override
  public void reportError(RecognitionException e) {
    throw new RuntimeException("I quit!\n" + e.getMessage()); 
  }
}

@lexer::members {
  @Override
  public void reportError(RecognitionException e) {
    throw new RuntimeException("I quit!\n" + e.getMessage()); 
  }
}

// lexer & parser rules

エラー報告(および回復)の詳細:https ://theantlrguy.atlassian.net/wiki/display/ANTLR3/Error+reporting+and+recovery

于 2011-12-28T18:41:40.113 に答える
3

この回答で提案されているように、エラーリスナーを使用する必要があります

ただし、antlr3からantlr4 / antlr v4にすばやく移行するには、これをグラマーとして使用できます。

@parser::members 
{
  private final Logger log = LogManager.getLogger(this.getClass().getName());
  public java.util.HashMap<String, Double> memory = new java.util.HashMap<String, Double>();

  @Override
  public void notifyErrorListeners(Token offendingToken, String msg, RecognitionException ex)
  {
    throw new RuntimeException(msg); 
  }
}

@lexer::members 
{
  @Override
  public void recover(RecognitionException ex) 
  {
    throw new RuntimeException(ex.getMessage()); 
  }
}
于 2015-01-30T20:35:12.857 に答える