0

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

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

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

4

1 回答 1

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 不会抛出异常。查看异常来自哪里。您可能正在访问您认为存在但不存在的元素。

于 2013-07-05T07:32:39.720 回答