【问题标题】:memory release and error handling in antlr3 c targetantlr3 c 目标中的内存释放和错误处理
【发布时间】:2013-07-04 16:36:01
【问题描述】:

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

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

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

【问题讨论】:

    标签: antlr antlr3


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

    【讨论】:

    • 谢谢迈克。我认为该行应该是“_parser->free(_parser)”,即不需要初始的“d->”。关于错误,我希望 Antlr 也能避免段错误,我在最上面的规则“numErrors = RECOGNIZER->getNumberOfSyntaxErrors(RECOGNIZER)”之后添加了一行,并使用它来退出任何进一步的分析。那
    • (contd).. 但是当 Antlr 返回到解析树的顶部时,看起来已经有一些内存损坏了。结果,除了“if(numErrors) exit(0)”之外,我无能为力。 (我自己处理语义错误并立即退出,所以这应该不是问题。)
    • 是的,你是对的,d-> 部分不需要(忘记删除了)。
    • 更正.. 错误不在 antlr 代码中,并且内存没有损坏。问题出在一个名为“err”的函数上,它链接到了另一个系统库函数,而不是我写的那个。
    • 哦,这是一个奇怪的错误。很难找到。感谢您仍然接受我的回答,因为它没有解决您的问题。
    猜你喜欢
    • 2015-05-04
    • 2012-07-20
    • 1970-01-01
    • 2017-03-20
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多