Rascal - 使用访问者重写AST

时间:2015-12-12 12:02:44

标签: rascal

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

所以我的想法就是做这样的事情(这个例子并不适合做事):

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

有人可以帮助我,并告诉我该怎么做?

1 个答案:

答案 0 :(得分:3)

要记住的一件事是你不能使用副作用改变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())

正如您所看到的,第一个visit a()内的c(a())更改为b(),但myA仍然是之前的状态。将visit的值分配到myA后,将保留更改。