2017-05-17 7 views
0

レクサーで例外をキャッチするにはどうすればよいですか?パーサにはルールが失敗した(または指定された入力ストリームとの不一致)されている場合ANTLRは例外をスローします、我々は簡単にこのexception.CatchにAntlr3.Refでレクサーで例外をキャッチすることができます:Error handeling in antlr 3.0 ...Antlr3のレクサーで例外をキャッチ

attribute : 
     Value1 integer1["Value1"] { System.out.println("Accepted"); } 
    | Value2 integer2["Value2"] { System.out.println("Accepted"); } 
    ; 
catch[Exception e] {System.out.println("General error Reported");} 

それは私がレクサー自身で例外をキャッチすることができますどのようにparser.Butに動作します?.Sayをパーサに私は

str:STRING|DIGIT; 

とレクサーSTRINGのようにルールが

STRING : ('"' 'a'..'z' '"'); 
のように定義されたのです

私の入力ストリームは "God" ....二重引用符が見当たらない場合や、余分な二重引用符を入れた場合、その例外はレクサー自体にキャッチされる必要があります...これを行う方法はありますか?出来ますか?

答えて

0

上書きANTLR独自の例外処理を使用するには、次のいずれかの方法(これはレクサーとパーサの両方に適用されます) - これが唯一の入力の不整合によって引き起こされる例外に適用されることに注意してください。

  • emitErrorMessage() - 処理するためにエラーメッセージヘッダーが
  • getErrorMessage()
  • を作成する方法を変更する - - メッセージがユーザ
  • getErrorHeader()にどのように表示されるか、エラーの記述が作成される方法を変更する
  • displayRecognitionError() - は例外からのメッセージの作成方法を変更するため、または完全に例外が処理される方法を変更する

ANTLRのレクサーとパーサの主な違いは、レクサーに、何の開始規則または「現在の」がないということですrule - レクサーは、利用可能なすべてのルールを並行して照合しようとします。したがって、不一致が発生した場合、特定のルールに帰属することはできません(したがって、特定のルールではcatchブロックを使用して処理することもできません)。