すべてのノードがその親を指す注釈を持つ(Node
またはを使用して) ツリーを作成したいと考えています。ADT
以下は、単純なリンク リスト データ構造の例です。
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
]