Error handling 有没有办法处理规则捕获[…]块中的所有antlr异常类型

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

我将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;
这意味着我需要捕捉所有可能的异常


有什么想法吗???

我最后尝试了两种解决方案

方法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();
}
....