2016-07-22 18 views
0

に、私は次の文があります。認識できない文字の(行で)ANTLR印刷インデックス

@lexer::apifuncs 
{ 
    LEXER->rec->displayRecognitionError = recognition_error; 
} 

@parser::apifuncs 
{ 
    RECOGNIZER->displayRecognitionError = recognition_error; 
} 

C機能「recognition_errorは」(ANTLRによってスロー認識エラーを処理する)のように定義されます次

void recognition_error(pANTLR3_BASE_RECOGNIZER recognizer, pANTLR3_UINT8 *token_list) 
{ 

    pANTLR3_EXCEPTION   ex; 
    pANTLR3_LEXER    lexer; 
    pANTLR3_PARSER    parser; 
    pANTLR3_TREE_PARSER   tparser; 
    pANTLR3_INPUT_STREAM  ins; 
    pANTLR3_INT_STREAM   is; 
    pANTLR3_COMMON_TOKEN_STREAM cts; 
    pANTLR3_TREE_NODE_STREAM tns; 

    if (recognizer->type == ANTLR3_TYPE_LEXER) 
    { 
     lexer = (pANTLR3_LEXER) (recognizer->super); 
     ins = lexer->input; 
     is = ins->istream; 
    } 
    else if (recognizer->type == ANTLR3_TYPE_PARSER) 
    { 
     parser = (pANTLR3_PARSER) (recognizer->super); 
     cts = (pANTLR3_COMMON_TOKEN_STREAM)(parser->tstream->super); 
     is = parser->tstream->istream; 
    } 
    else if (recognizer->type == ANTLR3_TYPE_TREE_PARSER) 
    { 
     tparser = (pANTLR3_TREE_PARSER) (recognizer->super); 
     tns = tparser->ctnstream->tnstream; 
     is = tns->istream; 
    } 
    else 
    { 
     printf("UNKNOWN ERROR!\n"); 
     return; 
} 

    printf("INFO <%d> * <%d> * <%d> * <%d>\n", recognizer->state->exception->line, recognizer->state->exception->charPositionInLine, recognizer->state->exception->index, ((pANTLR3_COMMON_TOKEN) recognizer->state->exception->token)->getCharPositionInLine); 

}

私は間違った文字を持っているいくつかのテキストを解析するために、この文法を使用するたびに、機能「recognition_errorは、」文字のインデックスを印刷しません。エラーが見つかった場所(-1または0のようなガーベジだけが表示されます)。

正しいインデックスを印刷するために、この文法やC関数をどのように修正できますか?

答えて

0

利用可能なエラー情報は、例外の種類と登場したトークンの種類(ツリー再書き込みによって生成された仮想ノードなど)によって異なります。 MySQL Workbench私は報告するために良い情報を見つけるためにいくつかの長さに行くエラー処理コードを書いています。ここで重要なのはexception->typeの値を調べてそれに応じて行動することです。

+0

マイク! MySQL Workbenchプロジェクトのエラー処理コードは、自分のプロジェクトに実装する方法を明確にするのに役立ちました。 – user5793565

関連する問題