比较 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
函数使用与您的代码中类似的访问者递归执行此操作。
为了计算重复,我正在将一个 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
函数使用与您的代码中类似的访问者递归执行此操作。