2014-09-30 1 views
0

У меня есть пример 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.

Заранее благодарен!

ответ

0

Xtext DSL не является переводчиком; это парсер. Xtext DSL просто дает вам инструменты для анализа некоторого текста в модели. В вашем случае, модель, вероятно, следует список из RunMacroInteraction:

Model : scripts=RunMacroInteraction* ; 

В интерпретатора, сначала настроить среду XText. Теперь вы можете вызвать парсер, чтобы получить Model. После этого вы можете изучить модель. Например, вы можете вызвать метод для каждого RunMacroInteraction в Model.getScripts(). В этом методе вы можете получить имя макроса, посмотреть его в модели и затем вызвать другой метод, который выполняет команды макроса с найденными вами аргументами.

+0

, так что нет способа сказать Модели, что пользователь внутри логина «Макро» - это просто ссылка на «UserDefinition» «admin», определенную в другом месте? – tuxflo

+0

Вот что делает '[]' для вас. Так что у вас уже есть это. Просто посмотрите на код Java, который генерирует Xtext для вас. –

+0

Да, но мой основной вопрос: как назначить эту ссылку другой переменной (или имени), как в Java 'int a = 42; int b = a', где a и b - 42. Я думал, что нотация '{UserDefinition} будет создавать новый экземпляр, но я не знаю, как назначить ссылку на этот новый экземпляр. Большое спасибо за помощь! – tuxflo

 Смежные вопросы

  • Нет связанных вопросов^_^