有没有办法处理规则catch [...]块中的所有antlr异常类型

时间:2011-04-21 21:22:13

标签: error-handling antlr3

我正在使用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 个答案:

答案 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();
}
....