gpt4 book ai didi

tree - ANTLR 复制一棵树

转载 作者:行者123 更新时间:2023-12-02 11:18:27 24 4
gpt4 key购买 nike

我使用ANTLR构建一棵树(CommonTree),如下所示(语言:JAVA):

  Parser.prog_return r = parser.prog();
CommonTree t = (CommonTree) r.getTree();

现在,我需要传递“t”作为参数,并在不影响原始树的情况下进行一些更改。然而,使用Java的指针,这是无法做到的,所以我需要复制树。

网上查了一下,最近能找到的就是ASTFactory类的dupTree()方法。

任何有关如何实现这一目标的建议或建议将不胜感激!

编辑

@Bart Kiers,感谢您的回答,它绝对有效!

我看到您正在对树进行深度优先遍历,并为访问的每个节点创建一个 CommonTree 对象。

现在我的问题是,CommonToken 和 CommonTree 之间的关系是什么,这些属性的作用是什么:

cTok.setCharPositionInLine(oTok.getCharPositionInLine());
cTok.setChannel(oTok.getChannel());
cTok.setStartIndex(oTok.getStartIndex());
cTok.setStopIndex(oTok.getStopIndex());
cTok.setTokenIndex(oTok.getTokenIndex());

最佳答案

尝试这样的事情:

public static CommonTree copyTree(CommonTree original) {
CommonTree copy = new CommonTree(original.getToken());
copyTreeRecursive(copy, original);
return copy;
}

private static void copyTreeRecursive(CommonTree copy, CommonTree original) {
if(original.getChildren() != null) {
for(Object o : original.getChildren()) {

CommonTree originalChild = (CommonTree)o;

// get the token from the original child node
CommonToken oTok = (CommonToken)originalChild.getToken();

// create a new token with the same type & text as 'oTok'
CommonToken cTok = new CommonToken(oTok.getType(), oTok.getText());

// copy all attributes from 'oTok' to 'cTok'
cTok.setLine(oTok.getLine());
cTok.setCharPositionInLine(oTok.getCharPositionInLine());
cTok.setChannel(oTok.getChannel());
cTok.setStartIndex(oTok.getStartIndex());
cTok.setStopIndex(oTok.getStopIndex());
cTok.setTokenIndex(oTok.getTokenIndex());

// create a new tree node with the 'cTok' as token
CommonTree copyChild = new CommonTree(cTok);

// set the parent node of the child node
copyChild.setParent(copy);

// add the child to the parent node
copy.addChild(copyChild);

// make a recursive call to copy deeper
copyTreeRecursive(copyChild, originalChild);
}
}
}

...

// get the original tree
CommonTree tree = (CommonTree)parser.parse().getTree();

// create a copy of the tree
CommonTree copy = copyTree(tree);

// change the contents of the right node of the right node of the root
((CommonTree)tree.getChild(1).getChild(1)).getToken().setText("X");

System.out.println(tree.toStringTree());
System.out.println(copy.toStringTree());

这会产生:

(&& a (|| b X))(&& a (|| b c))

输入“a && (b || c)”。即,具有X,但副本将具有原始内容:c

请注意,我选择了 CommonTreeCommonToken 对象,因为它们是默认的 TokenTree 实现。如果您选择创建自己的 Token 和/或 Tree,您很可能会继承 CommonTreeCommonToken 类,在这种情况下我的建议不会中断。

CommonTree只不过是CommonToken的包装器,包含一些额外信息:父节点和子节点。这就是为什么我还从 CommonToken 对象复制所有信息。

关于tree - ANTLR 复制一棵树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6781019/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com