Сделать ссылку или терминал доступным через то же имя элемента в Xtext / Xpand? - PullRequest
3 голосов
/ 18 января 2011

У меня есть грамматика Xtext, которая описывает машины состояний, и я использую ссылки на ранее объявленные события и состояния для описания переходов:

Event:
 'event' name=ID
 ;

State:
 'state' name=ID
 ;

Transition:
 event=[Event] '=>' state=[State]
    ;

Когда я использую MWE для создания редактора, он будет проверятьналичие ссылочных позиций.Например, для написания

init => idle

потребуется следующее:

event init
state idle

должно присутствовать где-то еще в коде (кстати, я использую один файл для каждой машины состояний, поэтому он должен бытьв том же файле).В моих шаблонах кода Xpand я могу получить доступ к событию и состоянию как к элементам перехода:

«FOREACH statemachine.transitions.event AS event-» // you get the idea

Это работает очень хорошо, и я уже довольно давно его использую.

Но так какряд событий является общим для всех моих машин состояний (init, show, hide, finish и некоторые другие), я хочу иметь возможность ссылаться на событие так, как я это делал, или введите одно из указанных выше имен событий без необходимости объявлять событие в каждом файле.

Но я не могу этого сделать:

Transition:
 event=( [Event] | ('init'|'show'|'hide'|'finish') ) '=>' state=[State]
    ;

Поэтому я решилопределить терминал EventID, который является одним из указанных ключевых слов:

terminal EventID:
     'init'|'show'|'hide'|'finish'
     ;

Но я также не могу сделать это:

Transition:
 event=( [Event] | EventID ) '=>' state=[State]
    ;

Затем я попытался сделать Event комбинированным правилом:

CustomEvent:
    'event' name=ID
    ;

BaseEvent:
    name=EventID
    ;

Event:
    CustomEvent | BaseEvent
    ;

Transition:
    event=[Event] '=>' state=[State]
    ;

, который тоже не работал.

На данный момент я решил согласиться с обходным решением:

Transition:
    ( event=[Event] | baseevent=EventID ) '=>' state=[State]
    ;

Это работает, но мне придется изменить все мои шаблоны, чтобы искать как события, так и базовые события.

Я понимаю, это довольно много текста ... Итак, наконец, вот мой вопрос:

Можно ли вообще использовать одно и то же имя элемента для либо ссылка или EventID?

1 Ответ

1 голос
/ 24 января 2011

Ваша оригинальная проблема была: вы не хотите повторяться в нескольких файлах. Я предлагаю другой подход для решения этой проблемы: Мы не создаем стандартный файл, в котором вы определяете свои общие состояния и импортируете эти состояния с помощью инструкции import, описанной здесь: http://www.eclipse.org/Xtext/documentation/1_0_1/xtext.html#syntax

...