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