2012-04-30 20 views
5

上でより良いメッセージを与えることを私たちはANTLR文法の次のサブ部分を持っている:ANTLR構文エラーの処理方法や、予期しないトークン

誰かがすべてがうまくている数値を入力する
signed_int 
     : SIGN? INT 
    ; 

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

、彼らは 場合このタイプのエラーを処理するための良い方法は何

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

:誤っ1O(1及び資本O)のようなものを入力し、私たちのような不可解な エラーメッセージが表示されますか?私は のキャッチオールSYMBOLトークンタイプを定義していると考えましたが、これはあまりにも多くのパーサー構築エラー につながります。私はAntlrのエラー処理について調べていきますが、私は をここに掲載していくつかの洞察を探していると考えました。

答えて

4

レクサーとパーサーのreportErrorメソッドをオーバーライドする必要があります。 あなたのレクサーファイルにこのコードを追加することによってそれを行うことができます:あなたのファイルの使用に続いて

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); 
} 

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

とメソッドを作成は、入力文字列が指定された文法と一致するかどうかを確認するパーサにマッチしますParser.matches(入力);指定された入力が文法と一致するかどうかを確認します。一致する場合はtrueを返し、そうでない場合はfalseを返します。falseを返すと、ユーザーにカスタマイズされたエラーメッセージを与えることができます。

関連する問題