2016-07-22 5 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