比较AST节点

时间:2017-11-29 15:02:01

标签: rascal

为了计算重复,我正在将一个java项目解析为AST。

但是在尝试比较AST节点时,也会比较src等声明属性,这会导致比较失败。

引入了这种变化< 1年前取消了宣言注释。

要否定这一点,我必须做以下事情:

myAst = visit(myAst) {
    case node n : {
        n.src = |unknown:///|;
    }
}

然后比较节点。

还有其他方法可以更轻松地比较节点吗?

1 个答案:

答案 0 :(得分:2)

如果模式匹配不属于模式,则忽略关键字参数。

rascal>data  X = z(int y = 0);
ok
rascal>x1 = z(y=3);
X: z(y=3)
rascal>x2 = z(y=4);
X: z(y=4)
rascal>x1 == x2
bool: false
rascal>x1 := x2
bool: true
rascal>z() := x1
bool: true
rascal>z(y=5) := x1
bool: false
rascal>

因此,如果要测试相等性,请使用模式匹配。如果你把它们放在一张地图或一套中,你确实必须“未设置”#34;他们。有一个无赖的功能可以以最有效的方式完成这项工作。 unset中的函数Node为当前节点执行此操作,unsetRec函数使用与代码中类似的访问者递归执行。