C++ antlr4中的ParseTree遍历

C++ antlr4中的ParseTree遍历,c++,antlr,antlr4,C++,Antlr,Antlr4,我正在使用。 我有一个ParseTree,我正在尝试重新创建树结构。 为此,我使用了一个访问者my_Visitor和我自己的节点对象 我的问题是visitChildren(tree::RuleNode*)调用所有子树的访问函数,因此当遍历一个子树并访问下一个子树时,我会丢失信息 假设这样一棵树: A / \ B C 当我调用visitChildren(A)(使用B和C的重载visitExpression(ExpressionContext*)函数)时,我可以提取访问顺序为A、B、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]);
    }
}
antlrcpp::Any my_Visitor::my_visitChildren(树::规则节点*A){
对于(int i=0;ichildren.size();i++){
//在我自己的树表示中创建一个新节点作为
访问(A->儿童[i]);
}
}
并在我的重载
visitExpression
函数中调用
my_visitChildren

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

我可以从
children[I]
创建一个
ParseTree
,还是有更好的方法来实现这一点


我也在考虑使用一个映射从
树->父对象-/code>到我的对象,并在那里附加我的新节点,但如果我想省略一些节点(例如AST),这不是最佳选择。

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


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

似乎需要使用侦听器而不是访问者。我是否使用
exitEveryRule(.)
获取我留给子节点的信息?这就是你的建议吗?因为这似乎有道理。。(我只是想确认一下):)有一个叫做parsetreeanotator的类。它就像一堆。。查看《antlr4参考》一书中的示例