我使用解析器生成器,它生成表示编程语言语法节点的java类,以及AspectJ方面,用于向这些类添加语义。 我已经扩展/更改了语言的语法,我想重用旧语法的各个方面,并修改/扩展它们以应对节点类的更改。
例如,旧节点类及其方面:
class A {
public T a1;
public U a2;
...
}
aspect Accessors1 {
public T A.getT() {return a1;}
public U A.getU() {return a2;}
}
通过语法修改,A类随后会发生变化:
class A {
public T a1;
public V a2;
public U a3;
...
}
我想重用Accessors1方面并添加另一个方面:
aspect Accessors2 {
public V A.getV() {return a2;} // new accessor for new field
public U A.getU() {return a3;} // modification of old accessor
}
我试过了:
declare precedence: *2, *1;
但我仍然从第一个方面得到此错误:Type mismatch: cannot convert from V to U
。即使未使用Accessors1.getU(),它仍然是类型检查的,这会导致编译失败。
为什么会这样?如何用新的覆盖原始getU()
?有没有办法告诉AspectJ忽略/删除Accessors1.getU()?
答案 0 :(得分:0)
如果您尝试在第二课中使用以下更改,该怎么办:
class A {
public T a1;
public U a2;
public V a3;
...
}
第二个方面:
aspect Accessors2 {
public V A.getV() {return a3;} // new accessor for new field
public U A.getU() {return a2;} // modification of old accessor
}