在antl4中遍历解析树



我使用的是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),这不是最优的。

ParseTreeTree之间的区别纯粹是人为的,实际上没有实际用途。树节点的子节点实际上是所有ParseTree实例。除了构建ParseTree的基类外,在运行时中从未使用过一些树类。因此,后来我已经删除了Tree, SyntaxTreeRuleNode,并把所有这些放在一起到ParseTree类。

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

相关内容

  • 没有找到相关文章

最新更新