ParseTree在antlr4中遍历

时间:2016-10-24 16:32:45

标签: c++ antlr antlr4

我正在使用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]Treevisit(.)需要ParseTree。 我可以以某种方式从ParseTree创建children[i],还是有更好的方法来做到这一点?

我也在考虑使用从tree->parent到我的对象的地图,并在那里附加我的新节点,但如果我想省略一些节点(例如AST),这不是最佳的。

1 个答案:

答案 0 :(得分:4)

ParseTreeTree之间的区别纯粹是人为的,事实上并没有实际用途。树节点的子节点实际上都是ParseTree个实例。除了构建ParseTree的基类之外,还有一些从未在运行时中使用的树类。因此,稍后我删除了TreeSyntaxTreeRuleNode,并将所有内容放在ParseTree类中。

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