修改特定位置的树

问题描述 投票:0回答:1

我正在尝试修改给定物理位置的树的特定部分。我的方法是使用

treeAt
提取子树,用
visit
语句修改它,然后更新原始树。但是,我不确定修改子树后如何正确更新初始树。

这是我到目前为止所做的尝试:

Tree update(Tree tree, loc location) {
    TreeSearchResult[FunctionDeclaration] searchResult = treeAt(#FunctionDeclaration, location, tree);
    Tree subtree;
    if (treeFound(FunctionDeclaration foundTree) := searchResult) {
        subtree = foundTree;
    } else {
        throw "The given position (loc) is not found in the tree";
    }
    subtree = visit(tree) { ... }; // applying transformation

    // How to update the initial tree with the modified subtree ?

    return tree;
}

有没有办法直接在特定位置执行

visit
操作,比如
visit(tree, loc)

rascal
1个回答
0
投票

A visit 也会遍历树。所以你可以写:

return visit(tree) {
    case FunctionDeclaration func => buildNewFunc(func)
       when func@\loc == location
};

when
条款就像替换者的守卫。

我们也可以这样写:

return visit(tree) {
    case FunctionDeclaration func: {
       if (func@\loc == location) {
           // calculate new tree
           // and then replace the original `func` with this tree
           insert newTree;
       }
};
© www.soinside.com 2019 - 2024. All rights reserved.