Xtext 中的 Ecore EClass 继承
Ecore EClass inheritance in Xtext
考虑以下 Ecore 模型(采用 Xcore 表示法):
class Foo {
contains Element[] elements
}
class Bar extends Foo {
int n
}
class Element {
String name
}
和以下 Xtext 规则:
FooBar: Foo | Bar;
Foo: {Foo} 'foo' '{' elements+=Element (',' elements+=Element)* '}';
Foo: {Bar} 'bar' n=INT '{' elements+=Element (',' elements+=Element)* '}';
Element: {Element} name=ID;
这样的文本模型是这样的:
foo {one, two}
bar 2 {three, four}
有没有办法重构规则中的重复?我知道我可以引入一个新的 EClass ElementContain
并为 Foo
和 Bar
制定规则以引用其规则,但是,这会使元模型混乱。
一般:没有。但如果唯一的区别是第一个关键字:
FooBar:
({Foo} 'foo' | {Bar}'bar') '{' elements+=Element (',' elements+=Element)* '}';
Element: {Element} name=ID;
考虑以下 Ecore 模型(采用 Xcore 表示法):
class Foo {
contains Element[] elements
}
class Bar extends Foo {
int n
}
class Element {
String name
}
和以下 Xtext 规则:
FooBar: Foo | Bar;
Foo: {Foo} 'foo' '{' elements+=Element (',' elements+=Element)* '}';
Foo: {Bar} 'bar' n=INT '{' elements+=Element (',' elements+=Element)* '}';
Element: {Element} name=ID;
这样的文本模型是这样的:
foo {one, two}
bar 2 {three, four}
有没有办法重构规则中的重复?我知道我可以引入一个新的 EClass ElementContain
并为 Foo
和 Bar
制定规则以引用其规则,但是,这会使元模型混乱。
一般:没有。但如果唯一的区别是第一个关键字:
FooBar:
({Foo} 'foo' | {Bar}'bar') '{' elements+=Element (',' elements+=Element)* '}';
Element: {Element} name=ID;