2011-12-25 16 views
0

言語用のレクサーを書くためにantlrを使用しています。
文法を定義した後、antlrは、nextToken関数を含むlexerクラスのJavaコードを生成しました。私はこの機能を使用するたびに、それは私のために認識されたトークンを返しますが、それは未定義のトークンを見れば、それは、RecognitionException例外をスローし、それをキャッチしたときに、それは別の例外がスローされます。antlrエラー(RecognitionExceptionが発生したときに無限ループ)

catch (RecognitionException e) {throw new TokenStreamRecognitionException(e);} 

私はキャッチを書いていますこの例外をキャッチして何かを出力に出力するが、問題はこれの後で、単にエラーを出力して次のトークンに行くのではなく、前にトークンに戻って再びテストして戻ってくるようだ次のような無限ループに終わるこの未定義のトークンに戻ってください:

ID  a_1 
error occured at: rowNum:1 colNum:8 
line 1:8: unexpected char: '&' 
ID  a_1 
error occured at: rowNum:1 colNum:8 
line 1:8: unexpected char: '&' 
ID  a_1 
error occured at: rowNum:1 colNum:8 
line 1:8: unexpected char: '&' 
... 

どうすればよいですかnextTokenは、エラーを出力して残りの入力プログラムを実行するだけですか?

ウェブ全体を検索しましたが、問題を解決できませんでした。以前はこのエラーに遭遇した可能性があります。

答えて

0

レクサールールの最後にOTHERルールを定義し、そのルールを任意の文字に一致させることができます。これは、先行するレクサーの規則が一致しなかった場合、常に一致します。

:あなたは複合文法を使用している場合、その

lexer grammar T; 

@members { 
    @Override 
    public Token nextToken() { 
    Token t = super.nextToken(); 
    if(t.getType() == OTHER) { 
     // do something 
    } 
    return t; 
    } 
} 

// other lexer rules 

OTHER 
: . 
; 

注意、grammar T;、そしてあなたは、特にこのようなことレクサーメンバーのブロックを定義する必要があります:あなたはそれがOTHERタイプかない場合nextToken()をオーバーライドして、検査します

grammar T; 

@lexer::members { 
    @Override 
    public Token nextToken() { 
    Token t = super.nextToken(); 
    if(t.getType() == OTHER) { 
     // do something 
    } 
    return t; 
    } 
} 

... 
+0

ありがとうBart、はい私は "その他"のルールを定義する必要がありますが、私の主な問題は私のEclipseで "AntlrEclipse"プラグインを使って私の文法と "nextToken" 、それは私の主な問題であるように見える、それはエラーを記述し、thに行くのではなく、それは入力ファイルに戻り、この未定義のトークンを再度検査しようとするので、無限ループにつながるので、Antlrの "nextToken"関数を使用して、あなたが言ったようにオーバーライドする必要があると思います。 – nafiseh

関連する問題