2016-07-22 27 views
0

In meiner ANTLR Grammatik, habe ich die folgenden Aussagen:ANTLR Druckindex (in der Linie) von nicht erkannten Zeichen

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

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

Die C-Funktion „recognition_error“ (Erkennungsfehler von ANTLR geworfen zu verarbeiten) ist definiert als die folgenden:

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); 

}

Jedes Mal, wenn ich diese Grammatik verwenden einen Text zu analysieren, die ein falsches Zeichen hat, die Funktion „recognition_error“ druckt nicht den Index des char wo der Fehler gefunden wurde (es druckt nur Müll wie -1 oder 0).

Wie kann diese Grammatik und/oder C-Funktion fixiert werden, um den richtigen Index zu drucken?

Antwort

0

Die verfügbaren Fehlerinformationen hängen vom Typ der Ausnahme und vom Typ des Tokens ab, für das sie aufgetreten ist (z. B. virtuelle Knoten, die durch Neuschreiben von Bäumen generiert wurden). In MySQL Workbench habe ich Fehlerbehandlungscode geschrieben, der einige Längen nimmt, um gute Informationen zu finden, um zu berichten. Wichtig ist hier, den exception->type Wert zu prüfen und entsprechend zu handeln.

+0

Danke Mike! Der Fehlerbehandlungscode im MySQL Workbench-Projekt half zu verdeutlichen, wie er für mein Projekt implementiert werden kann. – user5793565