C++ antlr4中的ParseTree遍历
我正在使用。 我有一个C++ antlr4中的ParseTree遍历,c++,antlr,antlr4,C++,Antlr,Antlr4,我正在使用。 我有一个ParseTree,我正在尝试重新创建树结构。 为此,我使用了一个访问者my_Visitor和我自己的节点对象 我的问题是visitChildren(tree::RuleNode*)调用所有子树的访问函数,因此当遍历一个子树并访问下一个子树时,我会丢失信息 假设这样一棵树: A / \ B C 当我调用visitChildren(A)(使用B和C的重载visitExpression(ExpressionContext*)函数)时,我可以提取访问顺序为A、B、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]);
}
}
antlrcpp::Any my_Visitor::my_visitChildren(树::规则节点*A){
对于(int i=0;ichildren.size();i++){
//在我自己的树表示中创建一个新节点作为
访问(A->儿童[i]);
}
}
并在我的重载visitExpression
函数中调用my_visitChildren
这里的问题是A->children[i]
是一个树
,visit(.)
需要一个ParseTree
我可以从children[I]
创建一个ParseTree
,还是有更好的方法来实现这一点
我也在考虑使用一个映射从
树->父对象-/code>到我的对象,并在那里附加我的新节点,但如果我想省略一些节点(例如AST),这不是最佳选择。解析树和树之间的区别纯粹是人为的,实际上没有实际用途。树节点的子节点实际上都是ParseTree
实例。除了构建ParseTree
的基类之外,有一些树类在运行时中从未使用过。因此,稍后我删除了Tree
、SyntaxTree
和RuleNode
,并将所有这些都放在ParseTree类中
回答您的问题:您可以安全地将子节点强制转换为ParseTree
进行树漫游。似乎需要使用侦听器而不是访问者。我是否使用exitEveryRule(.)
获取我留给子节点的信息?这就是你的建议吗?因为这似乎有道理。。(我只是想确认一下):)有一个叫做parsetreeanotator的类。它就像一堆。。查看《antlr4参考》一书中的示例