Antlr的错误恢复机制

Antlr的错误恢复机制很重要,有利于写出很健壮的Parser,比如一般的单行注释需要有回车符号,但是有时用户在程序的最后会输入没有回车符号的单行注释,我们的Parser也要考虑这种情况

可以使用状态维护方式来处理这类不完整的Token,在Lexer中添加下列方法。

int state;

int getState() {
return state;
}

void resetState() {
state = 0;
}

 

将单行注释的语法由原来的

SL_COMMENT :
SL_INCOMPLETE_COMMENT NEWLINE
;

改写为

SL_COMMENT :
SL_INCOMPLETE_COMMENT { state = SqliteLexTokenTypes::SL_INCOMPLETE_COMMENT; }
NEWLINE
exception
catch [ ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException& ex ]
{
if (state!=SqliteLexTokenTypes::SL_INCOMPLETE_COMMENT)
{
state=0;
throw ex;
}
else
{
$setType(SL_COMMENT);
state=0;
}
}
;
//}