Инициализация (временного) атрибута EAttribute при анализе ресурса Xtext

Допустим, у меня есть простое правило Xtext

Hello: "Hello" name=STRING "!";

но в дополнение к EAttribute name мой (ранее существовавший) EClass Hello также имеет EAttribute source типа EString (или типа enum, но пока давайте предположим EString).

Это поле не должно быть представлено в самом DSL (поэтому оно в некотором роде переходное). Вместо этого я хочу, чтобы это поле было установлено в "Xtext", когда объект был прочитан и создан синтаксическим анализатором Xtext. (У меня есть другие способы создания экземпляров Hello, для которых я устанавливаю другие значения).

Можно ли добавить что-то в мое правило Hello:, которое автоматически устанавливает значение source? Или я должен где-то перехватывать парсер?

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

Hello: { current.source = "Xtext" } "Hello" name=STRING "!";

помогло бы, но вроде такие действия не допускаются...


person Stefan Winkler    schedule 20.02.2015    source источник


Ответы (1)


Я нашел способ, создав подкласс org.eclipse.xtext.parser.DefaultEcoreElementFactory и внедрив его как org.eclipse.xtext.parser.IAstFactory для моего языка.

Я переопределяю create() и делаю

EObject obj = super.create(...);
if(obj instanceof Hello) 
  ((Hello)obj).setSource("Xtext");
return obj;

Я не знаю, правильный ли это способ, но он работает.

person Stefan Winkler    schedule 20.02.2015
comment
Другим местом может быть IDerivedStateComputer. Взгляните на xtextcasts.org/episodes/18-model-optimization. - person Christian Dietrich; 21.02.2015
comment
Спасибо, Кристиан. IDerivedStateComputer в зависимости от ситуации тоже кажется хорошим местом, но, насколько я понимаю, нужно модифицировать рабочий процесс генерации MWE. В моем случае IAstFactory можно было напрямую заменить, добавив его в модуль Guice, и я был готов к работе, поэтому пока я буду придерживаться этого решения. - person Stefan Winkler; 13.03.2015
comment
Неа. IDerivedStateComputer также может быть выполнен с помощью привязок guice. - person Christian Dietrich; 13.03.2015