Как я могу пройти по дереву объектов EMF, сгенерированному Xtext? - PullRequest
4 голосов
/ 01 мая 2010

Я использую Xtext для определения моего DSL. Xtext генерирует синтаксический анализатор, который позволяет мне пройти модель EMF моего входного DSL. Я хотел бы перевести эту модель ЭДС в другое дерево. Чтобы сделать этот перевод, мне нужно пройти по дереву. Но я не смог найти класс посетителя для модели EMF, сгенерированной Xtext. Самым близким, что я нашел, является класс Switch, который посещает один узел. Я могу самостоятельно пройти модель EMF и вызвать класс Switch на каждом узле, который я посещаю. Но мне интересно, существует ли функциональность посетителя в Xtext, которая реализует обход модели.

Ответы [ 3 ]

3 голосов
/ 02 мая 2010

Я думаю, EcoreUtil.getAllProperContents (Resource, false) может быть тем, что вы ищете. Вы получите TreeIterator, который будет проходить через содержимое ресурса. Передайте результат iter.next () в Switch и выполните логику преобразования в зависимости от типа элемента.

3 голосов
/ 01 мая 2010

Если вы рассматриваете этот поток , Switch ( здесь используется, например, ) в значительной степени является официальным шаблоном посетителей для XText.
У вас также есть пользовательский процесс проверки :

Цель AbstractDeclarativeValidator состоит в том, чтобы позволить вам писать ограничения декларативным способом - как уже предлагает имя класса.
То есть вместо написания исчерпывающих конструкций if-else или расширения сгенерированного переключателя EMF вам просто нужно добавить аннотацию @Check к любому методу, и она будет вызываться автоматически при проверке.

Это может быть не совсем то, что вам нужно.

0 голосов
/ 01 мая 2010

Хм, разве недостаточно использовать EMF API? Если вы хотите преобразовать модель, использование некоторых языков преобразования, таких как Xtend, невозможно?

...