antlr3 c目标中的内存释放和错误处理

antlr3 c目标中的内存释放和错误处理,antlr,antlr3,Antlr,Antlr3,我有几个关于antlr的C目标的问题。(我正在使用libantlr3c-3.4) 由于没有垃圾收集,我必须自己清理内存,所以我想在填充数据结构并完成解析后扔掉所有解析器数据。有没有一种简单的方法来删除整个解析器内存,而不是遍历每个对象并显式删除它?(我注意到antlr3string.h中有一条评论说这是可能的,但我找不到一个代码示例来说明如何做到这一点。) 当输入语法正确时,我的解析器工作正常。但是当输入语法错误时,它会报告错误并给出分段错误。我想这是因为C语言中没有抛出异常的捕获(与java不

我有几个关于antlr的C目标的问题。(我正在使用libantlr3c-3.4)

  • 由于没有垃圾收集,我必须自己清理内存,所以我想在填充数据结构并完成解析后扔掉所有解析器数据。有没有一种简单的方法来删除整个解析器内存,而不是遍历每个对象并显式删除它?(我注意到antlr3string.h中有一条评论说这是可能的,但我找不到一个代码示例来说明如何做到这一点。)

  • 当输入语法正确时,我的解析器工作正常。但是当输入语法错误时,它会报告错误并给出分段错误。我想这是因为C语言中没有抛出异常的捕获(与java不同)。在这种情况下,如何使出口优雅?(我看到了关于这个主题的答案——4751699——但那是两年多前的事了,是antlr的旧版本。我只是想确认这个答案是否仍然有效,或者需要做一些其他事情。)


  • 完成后的清理很简单,除非手动创建自己的结构。所需要的是:

      pANTLR3_INPUT_STREAM _input;
      pMySQLLexer _lexer;
      pANTLR3_COMMON_TOKEN_STREAM _tokens;
      pMySQLParser _parser;
      MySQLParser_query_return _ast;
    
      _parser->free(_parser);
      _tokens ->free(_tokens);
      _lexer->free(_lexer);
      _input->close(_input);
    
    无需释放存储的ast中的树,因为节点来自一个池,当您释放解析器时,该池将被释放


    对于无效输入:错误处理程序中一定有错误。如果输入错误,ANTLR不会引发异常。查看异常来自何处。您可能正在访问您认为存在但不存在的元素。

    谢谢Mike。我认为行应该是“\u parser->free(\u parser)”,即不需要初始的“d->”。重新搜索错误时,我希望Antlr也会这样,为了避免SEGFULT,我在最上面的规则“numErrors=Recograzer->getNumberOfSyntaxErrors(Recograzer)”后面添加了一行,并使用它退出任何进一步的分析。那(续)。。但当Antlr返回到解析树的顶部时,看起来已经有一些内存被破坏了。因此,除了“如果(数字错误)退出(0)”之外,我无能为力。(我自己处理语义错误并立即退出,所以这应该不是问题。)是的,你是对的,不需要
    d->
    部分(忘记删除)。更正。。antlr代码中没有这个bug,mem也没有被破坏。问题在于一个名为“err”的函数,它被链接到另一个系统库函数,而不是我编写的函数。哦,这是一个奇怪的错误。很难找到。谢谢你仍然接受我的回答,因为它没有解决你的问题。