gpt4 book ai didi

adt - 在 Rascal 中使用 "parent"标签注释 ADT/节点树

转载 作者:行者123 更新时间:2023-12-01 22:52:15 28 4
gpt4 key购买 nike

我想创建一棵树(使用 NodeADT),其中每个节点都有一个指向其父节点的注释。下面是一个简单的链表数据结构的例子:

import util::Math;
import IO;
import Node;

anno LinkedList LinkedList@parent;
anno int LinkedList@something;

data LinkedList = item(int val, LinkedList next)
| last(int val)
;

public LinkedList linkedList = item(5,
item(4,
item(3,
item(2,
last(1)[@something=99]
)[@something=99]
)[@something=99]
)[@something=99]
)[@something=99];

public LinkedList addParentAnnotations(LinkedList n) {
return top-down visit (n) {
case LinkedList x: {
/* go through all children whose type is LinkedList */
for (LinkedList cx <- getChildren(x), LinkedList ll := cx) {
/* setting the annotation like this doesn't seem to work */
cx@parent = x;
// DOESN'T WORK EITHER: setAnnotation(cx, getAnnotations(cx) + ("parent": x));
}
}
}
}

执行 addParentAnnotations(linkedList) 会产生以下结果:

rascal>addParentAnnotations(linkedList);
LinkedList: item(
5,
item(
4,
item(
3,
item(
2,
last(1)[
@something=99
])[
@something=99
])[
@something=99
])[
@something=99
])[
@something=99
]

最佳答案

问题是 Rascal 数据是不可变的,因此您不能使用赋值更新任何内容。该赋值只会为您提供一个带有注释集的 cx 的新绑定(bind),但不会更改原始树。

要更改原始树,您可以对 case 语句使用 => 运算符,或者使用 insert 语句,如下所示:

 case LinkedList x => x[@parent=...] // replace x by a new x that is annotated

或:

 case LinkedList x : {
...
x@parent= ...;
insert x; // replace original x by new x in tree
}

一些其他提示,在 Traversal.rsc 库中,您可以找到一个名为 getTraversalContext() 的函数,如果调用它,它会生成当前访问节点的父节点列表案例正文:

import Traversal;

visit (...) {
case somePattern: {
parents = getTraversalContext();
parent = parents[1];
}
}

关于adt - 在 Rascal 中使用 "parent"标签注释 ADT/节点树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19028623/

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