2011-06-07 101 views
0

我使用分析器生成器,它生成表示编程语言的语法节点的Java类,以及用于向这些类添加语义的AspectJ方面。 我已经扩展/改变了语言的语法,我想重用旧语法的各个方面,并修改/扩展它们以适应节点类的变化。如何删除/重新定义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

你参数化的类或者T,V,U真正的类? – 2011-06-07 22:44:50

回答

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 
} 
+0

这将是一个很好很容易的解决方案,但正如我所提到的,这些类是由解析器生成器生成的......并且有很多它们,因此很多实例的问题以及需要更改的地方...... – 2011-06-07 21:43:48