Error handling 有没有办法处理规则捕获[…]块中的所有antlr异常类型
我将ANTLR3与C运行时一起使用 我想做一些自定义错误处理。我真正想要的是,如果子规则中存在任何类型的antlr匹配异常,我希望告诉antlr不要尝试处理它,让它渗透到更全局的规则中 按照这个规则,我将记录它,然后尝试恢复 我将规则捕获方法设置为这样,这样所有规则都不会试图恢复Error handling 有没有办法处理规则捕获[…]块中的所有antlr异常类型,error-handling,antlr3,Error Handling,Antlr3,我将ANTLR3与C运行时一起使用 我想做一些自定义错误处理。我真正想要的是,如果子规则中存在任何类型的antlr匹配异常,我希望告诉antlr不要尝试处理它,让它渗透到更全局的规则中 按照这个规则,我将记录它,然后尝试恢复 我将规则捕获方法设置为这样,这样所有规则都不会试图恢复 @rulecatch { if (HASEXCEPTION()) { PREPORTERROR(); } } 这允许我在所需的规则上插入catch处理程序 根据我的兴趣规则,我可以使
@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;
这意味着我需要捕捉所有可能的异常
有什么想法吗???我最后尝试了两种解决方案 方法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();
}
....