我有一个带有一些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
调用中的用户(引用)作为参数传递,并将其分配给宏中定义的名称。
提前致谢!
答案 0 :(得分:0)
Xtext DSL不是解释器;它是解析器。 Xtext DSL只为您提供了将一些文本解析为模型的工具。在您的情况下,模型应该列出RunMacroInteraction
:
Model : scripts=RunMacroInteraction* ;
在解释器中,首先设置Xtext环境。现在,您可以调用解析器来获取Model
。之后,您可以检查模型。例如,您可以为RunMacroInteraction
中的每个Model.getScripts()
调用一个方法。在该方法中,您可以获取宏名称,在模型中查找,然后调用另一个方法,该方法使用您找到的参数执行宏中的命令。