我使用的是antlr4c++。我有一个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]);
}
}
和调用my_visitChildren
在我的重载visitExpression
函数。
这里的问题是A->children[i]
是Tree
,而visit(.)
需要ParseTree
。
我可以以某种方式从children[i]
创建ParseTree
,或者有更好的方法来做到这一点吗?
我也在考虑使用从tree->parent
到我的对象的映射,只是在那里附加我的新节点,但如果我想省略一些节点(例如AST),这不是最优的。
ParseTree
和Tree
之间的区别纯粹是人为的,实际上没有实际用途。树节点的子节点实际上是所有ParseTree
实例。除了构建ParseTree
的基类外,在运行时中从未使用过一些树类。因此,后来我已经删除了Tree
, SyntaxTree
和RuleNode
,并把所有这些放在一起到ParseTree类。
回答您的问题:您可以安全地将子节点转换为ParseTree
进行树遍历。