我正在使用antlr4 c++。我有一个ParseTree,我正在尝试重新创建树结构。为此,我使用了访问者my_Visitor和我自己的节点对象。
我的问题是visitChildren(tree::RuleNode*)调用所有子树的访问函数,所以当遍历一棵子树并访问下一棵子树时,我会丢失信息。
假设一棵树是这样的:
A
/ \
B C
Run Code Online (Sandbox Code Playgroud)
当我调用visitChildren(A)(visitExpression(ExpressionContext*)对B和C使用重载函数)时,我可以提取访问顺序为A,B,C的信息。
这个序列也可能是由于:
A
|
B
|
C
Run Code Online (Sandbox Code Playgroud)
要重新创建树,我想我需要类似的东西
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]);
}
}
Run Code Online (Sandbox Code Playgroud)
并调用my_visitChildren我的重载visitExpression函数。
这里的问题A->children[i]是 aTree并且visit(.)需要 a ParseTree。
我可以以某种方式创建一个ParseTreefromchildren[i]还是有更好的方法来做到这一点?
我也在考虑使用映射tree->parent到我的对象并将我的新节点附加到那里,但是如果我想省略一些节点(例如对于 AST),这不是最佳选择。
aParseTree和 a之间的区别Tree纯粹是人为的,实际上并没有实际用途。树节点的子节点实际上都是ParseTree实例。除了构建ParseTree. 所以后来我已删除Tree,SyntaxTree并RuleNode和把所有的连成分析树类。
回答您的问题:您可以安全地将子节点投射到ParseTree您的树行走中。
| 归档时间: |
|
| 查看次数: |
883 次 |
| 最近记录: |