首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Antlr4在堆上分配ParseTree

Antlr4在堆上分配ParseTree
EN

Stack Overflow用户
提问于 2021-02-20 17:34:36
回答 1查看 98关注 0票数 2

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

代码语言:javascript
复制
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注释,我尝试通过堆分配来保持解析器的活力。

代码语言:javascript
复制
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生成的文件中产生分段错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-21 10:50:01

您不仅必须保持解析器活动,而且还必须保持令牌流,因为解析树使用令牌引用。

我建议创建一个包含所有解析器相关对象的包装类,并保持该类的活力。这样,所有的引用都保持有效。您始终可以在新的解析运行中重用该对象。

对于MySQL工作台我创建了一个解析器上下文,它为应用程序提供了所有解析功能。使用它作为您的实现的模板。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66294597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档