2011-01-20 5 views
2

私はAntlr 2.XとAntlr 3.1.X CSharpとpythonターゲットについてよく知っています。エラー報告の例外をスローするAntlr3 Cランタイムとは何か

しかし、私は現在、Antlr 3 Cターゲットをプロジェクトに使用するようになっています。

私の問題は、私の文法やツリー文法のエラーを報告する方法です。

トークンと一致するルールを考え、マップに入れます。トークンが一意であることを確認します。トークンがすでにマップに入っていて、エラーを報告するためにhteパーサーの外に例外をキャッチしていると、通常は例外がスローされます。

Antlr Cランタイムに相当する以下のルールは何ですか?

token_match: ID 
{ 
    if(mp.find($ID.Text)) 
     throw std::exception("Non unique token found"); 
} 

答えて

1

意味的なエラーを表示するには、独自の方法を使用することをおすすめします。しかし、このためにANTLRにとどまる必要がある場合:

まず、カスタム例外タイプを作成する場合は、独自のエラーハンドラを作成する必要があります。 antlr3baserecognizer.c:1000のオリジナルを見てください。

static void   
displayRecognitionErrorNew (pANTLR3_BASE_RECOGNIZER recognizer, 
          pANTLR3_UINT8 * tokenNames) 
{ 
... 
    switch (ex->type) 
    { 
    case ANTLR3_UNWANTED_TOKEN_EXCEPTION: 
... 
    case NUTF_EXCEPTION: 
     printf("Non unique token found"); 
     break; 

次に、例外構造を処理する関数またはルールコードを記述します。あなたの例外を設定するantlr3baserecognizer.c:325を見てください。

ex = antlr3ExceptionNew(ANTLR3_RECOGNITION_EXCEPTION, 
         (void *)ANTLR3_RECOGNITION_EX_NAME, 
         NULL, 
         ANTLR3_FALSE); 

ex->type    = NUTF_EXCEPTION 
ex->line    = ins->getLine (ins); 
ex->charPositionInLine = ins->getCharPositionInLine (ins); 
ex->index    = is->index (is); 
ex->streamName   = ins->fileName; 
ex->message    = "That was totally unexpected"; 

次に、エラーを検出したときに実際に例外をスローする必要があります。私はこれを行う唯一の方法は、あなたのコードを追加し、あなたのルールから呼び出す不一致()をオーバーライドすることだと思います。

最後に、新しい機能を使用するようにANTLRに指示します。

@parser::apifuncs { 
    RECOGNIZER->displayRecognitionError  = displayRecognitionErrorNew; 
    RECOGNIZER->antlr3RecognitionExceptionNew = antlr3RecognitionExceptionNewNew; 
    RECOGNIZER->mismatch      = mismatchNew; 
} 
+0

お返事ありがとうございます。ちょうどメモ、私の問題は、それらのメンバーを過負荷ではない、それは完了しました:)私の質問は、ネイティブコードで自分自身の検証です。例外を投げてエラーを報告する適切な方法はありますか? – chollida

関連する問題