什么是Antlr3 C运行时相当于抛出错误报告的异常

时间:2011-01-20 19:37:18

标签: c error-handling antlr3

我非常熟悉Antlr 2.X和Antlr 3.1.X CSharp和python目标。

但是我现在被迫使用Antlr 3 C目标进行项目。

我的问题是如何在语法或树语法中报告错误。

考虑匹配令牌的规则,然后将其放入地图中。我们希望确保令牌是唯一的。通常,如果令牌已经在地图中并且在hte解析器之外捕获异常以报告错误,我会抛出异常。

什么是Antlr C运行时等效于以下规则?

token_match: ID 
{
    if(mp.find($ID.Text))
        throw std::exception("Non unique token found");
}

1 个答案:

答案 0 :(得分:1)

我建议使用您自己的方法来显示语义错误。但是如果你需要留在ANTLR:

如果要创建自定义异常类型,首先必须创建自己的错误处理程序。查看antlr3baserecognizer.c:1000作为原始文件。

static void         
displayRecognitionErrorNew  (pANTLR3_BASE_RECOGNIZER recognizer,
                             pANTLR3_UINT8 * tokenNames)
{
...
    switch  (ex->type)
    {
    case    ANTLR3_UNWANTED_TOKEN_EXCEPTION:
...
    case    NUTF_EXCEPTION:
      printf("Non unique token found");
      break;

然后编写一些函数或规则代码来处理异常结构。查看antlr3baserecognizer.c:325来设置您的例外。

ex = antlr3ExceptionNew(ANTLR3_RECOGNITION_EXCEPTION,
                       (void *)ANTLR3_RECOGNITION_EX_NAME,
                       NULL,
                       ANTLR3_FALSE);

ex->type                = NUTF_EXCEPTION
ex->line                = ins->getLine (ins);
ex->charPositionInLine  = ins->getCharPositionInLine    (ins);  
ex->index               = is->index (is);
ex->streamName          = ins->fileName;
ex->message             = "That was totally unexpected";

接下来,您需要在检测到错误时实际抛出异常。我认为唯一的方法是覆盖不匹配()添加代码并从规则中调用它。

static  void
mismatchNew(pANTLR3_BASE_RECOGNIZER recognizer, ANTLR3_UINT32 ttype, pANTLR3_BITSET_LIST follow)
{
  ...
}

最后告诉ANTLR使用你的新功能。

@parser::apifuncs {
  RECOGNIZER->displayRecognitionError       = displayRecognitionErrorNew;
  RECOGNIZER->antlr3RecognitionExceptionNew = antlr3RecognitionExceptionNewNew;
  RECOGNIZER->mismatch                      = mismatchNew;
}