antlr4 中的 ParseTree 遍历

Jon*_*nas 3 c++ antlr antlr4

我正在使用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),这不是最佳选择。

Mik*_*hke 5

aParseTree和 a之间的区别Tree纯粹是人为的,实际上并没有实际用途。树节点的子节点实际上都是ParseTree实例。除了构建ParseTree. 所以后来我已删除TreeSyntaxTreeRuleNode和把所有的连成分析树类。

回答您的问题:您可以安全地将子节点投射到ParseTree您的树行走中。