2011-04-21 65 views
1

我使用ANTLR3与C运行时阻塞。有没有办法来处理规则捕获所有ANTLR异常类型[...]

我想要做一些自定义的错误处理。我真正追求的是,​​如果在子规则中存在任何类型的antlr匹配异常,我想告诉ANTLR跳过尝试处理它,让它渗透到更全局的规则。

在这条规则,我会记录它,然后尝试重新开始。

我设置像这样的规则捕获方法,使所有的规则将不会尝试恢复。

@rulecatch 
{ 
    if (HASEXCEPTION()) 
    { 
    PREPORTERROR(); 
    } 
} 

这使我可以在我想要的规则中插入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; 

,这意味着我需要捕获所有可能的异常。

任何想法??

回答

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(); 
} 
.... 
相关问题