我正在使用ANTLR3和C运行时。
我想做一些自定义错误处理。我真正追求的是,如果在子规则中存在任何类型的antlr匹配异常,我想告诉ANTLR跳过尝试处理它并让它渗透到更全局的规则。
根据该规则,我会记录它,然后尝试恢复。
我已经设置了规则捕获方法,因此所有规则都不会尝试恢复。
@rulecatch
{
if (HASEXCEPTION())
{
PREPORTERROR();
}
}
这允许我在我想要的规则上插入catch处理程序。
根据我的兴趣规则,我可以使用catch语法:
catch [ANTLR3_RECOGNITION_EXCEPTION]
{
PREPORTERROR();
RECOGNIZER->consumeUntil(RECOGNIZER,RCURLY);
CONSUME();
PSRSTATE->error = ANTLR3_FALSE;
PSRSTATE->failed = ANTLR3_FALSE;
}
问题是这种语法似乎只允许我捕获一种类型的异常。我希望能够捕获所有异常类型。
有办法做到这一点吗?
我认为我可以重载所有恢复功能,但是有些代码会产生如下异常:
CONSTRUCTEX();
EXCEPTION->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
EXCEPTION->message = (void *)"";
EXCEPTION->decisionNum = 23;
EXCEPTION->state = 0;
goto rulewhenEx;
这意味着我需要捕获所有可能的异常。
有什么想法吗?
答案 0 :(得分:2)
我最终为此尝试了两种解决方案。
方法1)
重载rulecatch设置以将异常类型设置为一种特定类型
@rulecatch
{
if (HASEXCEPTION())
{
// This is ugly. We set the exception type to ANTLR3_RECOGNITION_EXCEPTION so we can always
// catch them.
PREPORTERROR();
EXCEPTION->type = ANTLR3_RECOGNITION_EXCEPTION;
}
}
这允许我使用一个catch块,因为所有异常都属于该类型。
方法2)
我只使用多个catch块,它们都会调度到一个常用函数来处理错误
catch [ANTLR3_RECOGNITION_EXCEPTION]
{
handleException();
}
catch [ANTLR3_MISMATCHED_TOKEN_EXCEPTION]
{
handleException();
}
....