antlr3 c目标中的内存释放和错误处理
我有几个关于antlr的C目标的问题。(我正在使用libantlr3c-3.4)antlr3 c目标中的内存释放和错误处理,antlr,antlr3,Antlr,Antlr3,我有几个关于antlr的C目标的问题。(我正在使用libantlr3c-3.4) 由于没有垃圾收集,我必须自己清理内存,所以我想在填充数据结构并完成解析后扔掉所有解析器数据。有没有一种简单的方法来删除整个解析器内存,而不是遍历每个对象并显式删除它?(我注意到antlr3string.h中有一条评论说这是可能的,但我找不到一个代码示例来说明如何做到这一点。) 当输入语法正确时,我的解析器工作正常。但是当输入语法错误时,它会报告错误并给出分段错误。我想这是因为C语言中没有抛出异常的捕获(与java不
完成后的清理很简单,除非手动创建自己的结构。所需要的是:
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”的函数,它被链接到另一个系统库函数,而不是我编写的函数。哦,这是一个奇怪的错误。很难找到。谢谢你仍然接受我的回答,因为它没有解决你的问题。