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;
}
}
;
//}