sách gpt4 ai đã đi

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

In lại 作者:行者123 更新时间:2023-12-01 22:52:15 28 4
mua khóa gpt4 Nike

我想创建一棵树(使用 Nút hoặc 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));
}
}
}
}

thực hiện 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
]

1 Câu trả lời

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

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

 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
Bài viết được đề xuất: redirect - Jetty 将特定请求仅转发到单个路径
Bài viết được đề xuất: wpf - XAML 编辑选项
Bài viết được đề xuất: macos - 通过 Homebrew 软件安装 PortAudio 时出错。 (苹果)
Bài viết được đề xuất: php - 使用PHP API可恢复上传到Google Cloud Storage
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com