比较 AST 节点

Comparing AST Nodes

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

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

此更改是 < 1 年前引入的,其中删除了声明注释。

要否定这一点,我必须执行以下操作:

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

然后比较节点。

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

如果关键字参数不是模式的一部分,模式匹配将忽略它们。

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>

因此,如果您想测试是否相等,请使用模式匹配。如果您将它们放在地图或集合中,您确实需要 "unset" 它们。有一个 rascal 函数可以以最有效的方式执行此操作。 Node 中的函数 unset 为当前节点执行此操作,而 unsetRec 函数使用与您的代码中类似的访问者递归执行此操作。