2016-07-22 86 views
0

以我ANTLR語法,我有以下語句: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