Rascal - 使用访问者重写 AST

Rascal - Rewrite AST using a visitor

我正在尝试将 AST 中的所有不同类型重写为单一类型(例如 char())。到目前为止,我能够找到类型,但我似乎找不到重写它们的方法。

所以我的想法是做这样的事情(这个例子当然行不通):

visit (ast) {
    case \Type(_) => \Type(char())
}

有人可以帮我,告诉我怎么做吗?

要记住的一件事是,您不能使用副作用更改 Rascal 中的值:当您更改值时,您得到的是该数据类型的新实例以及更改,但旧实例仍然存在(如果有任何提及的话)。当你执行 visit 时,你会得到一个包含你所做的任何更改的数据类型的新实例,但你需要将其分配到某处,否则它将丢失。这是一个说明这一点的例子:

rascal>data A = a() | b();
ok

rascal>data A = c(A a);
ok

rascal>myA = c(a());
A: c(a())

rascal>visit(myA) { case a() => b() }
A: c(b())

rascal>myA;
A: c(a())

rascal>myA = visit(myA) { case a() => b() }
A: c(b())

rascal>myA;
A: c(b())

如你所见,第一个visitc(a())里面的a()改成了b(),但是myA还是原来的样子之前。一旦将 visit 的值分配给 myA,更改将被保留。