微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Antlr4 在堆上分配 ParseTree

如何解决Antlr4 在堆上分配 ParseTree

我有一个这样的函数来从文件获取 AST。

antlr4::tree::ParseTree *get_ast(std::string &filename) {
    std::ifstream stream;
    stream.open(filename);
    antlr4::ANTLRInputStream input(stream);
    Lexer lexer(&input);
    antlr4::CommonTokenStream tokens(&lexer);
    Parser parser(&tokens);
    antlr4::tree::ParseTree *tree = parser.program();
    return tree;
}

但是在使用返回值的时候,好像已经清除了指向的树(在栈上),我需要知道如何在堆上分配树,所以我可以使用返回值(和手动释放)。

编辑:基于@sepp2k 评论,我尝试通过堆分配来保持解析器的活动状态。

Parser *get_parser(std::string filename) {
    std::ifstream stream;
    stream.open(filename);
    antlr4::ANTLRInputStream input(stream);
    Lexer lexer(&input);
    antlr4::CommonTokenStream tokens(&lexer);
    return new Parser(&tokens);

}

但是,当我从解析器调用规则时,这会在 Parser.cpp 生成文件中出现分段错误

解决方法

您不仅要让解析器保持活动状态,还要让标记流保持活动状态,因为解析树使用标记引用。

我建议创建一个包装类来保存所有与解析器相关的对象并使其保持活动状态。这样所有的引用都保持有效。您始终可以将对象重新用于新的解析运行。

对于为应用程序提供所有解析功能的 MySQL Workbench I created a parser context。将此用作您实施的模板。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。