c++ - antlr4中的ParseTree遍历

标签 c++ antlr antlr4

我正在使用 antlr4 c++ . 我有一个 ParseTree,我正在尝试重新创建树结构。 为此,我使用了访问者 my_Visitor 和我自己的节点对象。

我的问题是 visitChildren(tree::RuleNode*) 调用了所有子节点的访问函数,所以当一个子树被遍历并访问下一个子树时,我丢失了信息。

假设一棵树是这样的:

  A
 / \
B   C

当我调用visitChildren(A)(对B和C使用重载的visitExpression(ExpressionContext*)函数)时,我可以提取访问顺序是A的信息,B,C.

这个序列也可能来自:

A
|
B
|
C

要重新创建树,我想我需要类似的东西

antlrcpp::Any my_Visitor::my_visitChildren(tree::RuleNode* A){
    for(int i=0;i<A->children.size();i++){
        //create a new node in my own tree representation as child of A
        visit(A->children[i]);
    }
}

并在我重载的 visitExpression 函数中调用 my_visitChildren

这里的问题是 A->children[i] 是一个 Treevisit(.) 需要一个 ParseTree

我能以某种方式从 children[i] 创建一个 ParseTree 还是有更好的方法来做到这一点?

我也在考虑使用从 tree->parent 到我的对象的映射,并将我的新节点附加到那里,但是如果我想省略一些节点(例如,对于AST)。

最佳答案

ParseTreeTree 之间的区别纯粹是人为的,实际上没有实际用途。树节点的子节点实际上都是 ParseTree 实例。除了构建 ParseTree 的基类之外,有一些树类在运行时从未使用过。因此,后来我删除了 TreeSyntaxTreeRuleNode,并将所有这些都放在了 ParseTree 类中。

回答您的问题:您可以安全地将子节点转换为 ParseTree 以进行树遍历。

关于c++ - antlr4中的ParseTree遍历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40223288/

相关文章:

c++ - 没有合适的用户定义的从 utility::string_t 到 std::string 的转换

java - 没有方法program()来构建解析树对象

intellij-idea - 使用gradle antlr插件在Intellij中的generate-src/antlr中复制dagger2

java - 如何使用antlr4访客

c++ - Antlr4 C++ 目标

c++ - 为什么我不应该使用 std::string.c_str() 作为缓冲区?

c++ - istream 提取运算符 : how to detect parse failure?

c++ - 开发基于扇区的分区复制程序?

antlr - 从 ANTLR 文法生成 AST

java - ANTLR4如何获取树结构