为了计算重复,我正在将一个java项目解析为AST。
但是在尝试比较AST节点时,也会比较src
等声明属性,这会导致比较失败。
引入了这种变化< 1年前取消了宣言注释。
要否定这一点,我必须做以下事情:
myAst = visit(myAst) {
case node n : {
n.src = |unknown:///|;
}
}
然后比较节点。
还有其他方法可以更轻松地比较节点吗?
答案 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
函数使用与代码中类似的访问者递归执行。