Наследование Ecore EClass в 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 ссылались на его правило, однако это загромоздило бы метамодель.


person Kristóf Marussy    schedule 12.03.2015    source источник


Ответы (1)


вообще: нет. но если единственная разница - это первое ключевое слово:

FooBar:
 ({Foo} 'foo' | {Bar}'bar') '{' elements+=Element (',' elements+=Element)* '}';
Element: {Element} name=ID;
person Christian Dietrich    schedule 12.03.2015
comment
Итак, если есть контексты, в которых Bar имеет смысл, а Foo нет, мне в значительной степени необходимо использовать композицию вместо или в дополнение к наследованию? - person Kristóf Marussy; 12.03.2015
comment
Да. Для правил грамматики нет шаблонов/фрагментов. Не стесняйтесь подавать запрос на улучшение в Eclipse Bugzilla. - person Christian Dietrich; 12.03.2015