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関数をどのように修正できますか?
マイク! MySQL Workbenchプロジェクトのエラー処理コードは、自分のプロジェクトに実装する方法を明確にするのに役立ちました。 – user5793565