Xtext неупорядоченный список необязательных элементов

Я пытаюсь изменить пример модели домена Xtext, чтобы свойства объекта могли иметь еще два атрибута (в дополнение к «многим», которые уже включены в пример). Все атрибуты должны быть необязательными, а их порядок не имеет значения. Кажется, что бы я ни делал, первым атрибутом должен быть тот, который указан первым. Так, например, если у меня есть это в xtext:

(many ?= 'many')? & (aBool ?= 'isBool')? & (anEnum = EnumType)?

Если я использую «многие», то это должен быть первый атрибут, иначе я получу ошибку. Если я полностью оставлю это, я не получаю никаких ошибок.

Итак, как мне сообщить xtext, что мне нужны три необязательных атрибута в неупорядоченной группе?


person Viet Norm    schedule 26.07.2013    source источник


Ответы (2)


Видимо, все, что мне нужно было сделать, это заключить группу в круглые скобки :/

((many ?= 'many')? & (aBool ?= 'isBool')? & (anEnum = EnumType)?)

Это помогло.

person Viet Norm    schedule 26.07.2013

Оператор & очень проблематичен в Xtext! Потому что парсер должен реализовать все возможные перестановки. Было бы лучше реализовать абстрактное правило синтаксического анализатора «OptionalElement», которое может бесконечно часто встречаться в списке. Это правило синтаксического анализатора затем указывается как «Многие», «Bool» или «Enum». Тогда грамматика будет выглядеть так:

AnyRule: /* some stuff */ optElement+=OptionalElement*;
OptionalElement: Many | Bool | Enum;
Many: {Many} 'many';
Bool: {Bool} 'isBool';
Enum: anEnum=EnumType;

Затем вам нужно только реализовать метод проверки в классе валидатора (...mydsl.validation.MyDslValidator), который проверяет, встречается ли максимальное число Many, Bool или Enum. один раз в списке «optElement».

Модификатор класса/метода/поля определяется таким же образом в грамматике Java.

person Joko    schedule 07.11.2014
comment
Это хорошая идея, но вам нужно написать валидатор и подавить помощь по содержимому, если объект должен быть уникальным. Что все же лучше, чем использование багги и оператора - person bline; 28.06.2021