У меня есть пример DSL с некоторыми UserDefinition
и некоторыми «определениями действий», и я пытаюсь реализовать некоторую макроскопическую функцию. Вот грамматика до сих пор:параметр Xtext pass для переменной
UserDefinition:
'User' name=ID
'{'
features+=Feature*
'}'
;
Feature:
name=ID '=' value=STRING
;
EnterTextAction:
'enter text' ref=[UserDefinition] 'into' targetElement=TargetElement
;
с этим (и дополнительно некоторые обзорное) я могу создавать пользователей и позволить им выполнить действие с:
User admin{
username="root"
password="passwd"
}
enter admin.username into Username
enter admin.password into Password
Но теперь я хочу, чтобы создать макрос, как fuction, чтобы сделать что-то вроде:
Macro login {
data = user
enter user.username into Username
enter user.password into Password
}
run login using admin
Что должно выполнять отдельные действия позже в сгенерированном коде. Для этого я создал правило:
Macro:
'macro' name=ID '{'
data=Data
actions+=EnterTextAction*
'}'
;
RunMacroInteraction:
'run' macro=[Macro] 'using' user=[Userdefinition]
;
Data:
name=ID '=' userdef=Userdefinition
;
Так что мой вопрос: Как я могу передать пользователь (ссылка) в RunMacroInteraction
вызове в качестве параметра и присвоить его имя, определенное в Macro.
Заранее благодарен!
, так что нет способа сказать Модели, что пользователь внутри логина «Макро» - это просто ссылка на «UserDefinition» «admin», определенную в другом месте? – tuxflo
Вот что делает '[]' для вас. Так что у вас уже есть это. Просто посмотрите на код Java, который генерирует Xtext для вас. –
Да, но мой основной вопрос: как назначить эту ссылку другой переменной (или имени), как в Java 'int a = 42; int b = a', где a и b - 42. Я думал, что нотация '{UserDefinition} будет создавать новый экземпляр, но я не знаю, как назначить ссылку на этот новый экземпляр. Большое спасибо за помощь! – tuxflo