Xtext将参数传递给变量

时间:2014-09-30 11:35:29

标签: xtext

我有一个带有一些UserDefinition和一些“动作定义”的DSL示例,我正在尝试实现一些宏功能。这是迄今为止的语法:

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

但现在我想创建一个类似函数的宏来做类似的事情:

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调用中的用户(引用)作为参数传递,并将其分配给宏中定义的名称。

提前致谢!

1 个答案:

答案 0 :(得分:0)

Xtext DSL不是解释器;它是解析器。 Xtext DSL只为您提供了将一些文本解析为模型的工具。在您的情况下,模型应该列出RunMacroInteraction

Model : scripts=RunMacroInteraction* ;

在解释器中,首先设置Xtext环境。现在,您可以调用解析器来获取Model。之后,您可以检查模型。例如,您可以为RunMacroInteraction中的每个Model.getScripts()调用一个方法。在该方法中,您可以获取宏名称,在模型中查找,然后调用另一个方法,该方法使用您找到的参数执行宏中的命令。