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())
如你所见,第一个visit
把c(a())
里面的a()
改成了b()
,但是myA
还是原来的样子之前。一旦将 visit
的值分配给 myA
,更改将被保留。
我正在尝试将 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())
如你所见,第一个visit
把c(a())
里面的a()
改成了b()
,但是myA
还是原来的样子之前。一旦将 visit
的值分配给 myA
,更改将被保留。