我有几个关于antlr的C目标的问题。 (我使用的是libantlr3c-3.4)
由于没有垃圾收集,我必须自己清理内存,因此我希望在填充数据结构并完成解析后丢弃所有解析器数据。是否有一种简单的方法可以删除整个解析器内存,而不是遍历每个对象并明确删除它? (我注意到antlr3string.h中的一条注释,这是可能的,但我找不到如何做的代码示例。)
当输入语法正确时,我的解析器工作正常。但是当输入语法错误时,它会报告错误并给出分段错误。我想这是因为C中没有异常的抛出(不像java)。在这种情况下如何让出口优雅? (我在这个主题上看到了一个答案 - 4751699 - 但这是2年多以前的版本和更早版本的版本..只是想确认答案是否仍然有效,或者其他一些事情必须要完成。)
答案 0 :(得分:1)
完成后的清理很简单,除非您手动创建自己的结构。所需要的只是:
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不会抛出异常。查看异常的来源。您可能正在访问您认为存在但不存在的元素。