生成用于在Xtext中评估Xbase表达式的类?

时间:2012-06-28 13:21:19

标签: xtext

我正在尝试设计一个用于检查变量约束的DSL。我的语法目前看起来像这样:

Start:
    varDeclarations += XVariableDeclaration*
    rules+=Constraint*;

Constraint:
    {Constraint}
    'FOR' 'PAYLOAD' payload=PAYLOAD 'ELEMENT' element=ID 'CONSTRAINED BY' constraint=XExpression;



PAYLOAD:
    "SimulationSessionEvents"
    |"stacons"
    |"any"
;

我想生成一个类的实例,它只包含一个方法,该方法将值作为输入,将其映射到约束中包含的唯一变量(也是唯一声明的变量),并检查是否满足约束。

这些实例将由另一个类使用,该类通过每个实例传递一个值,检查它是否满足约束。

在我看来,我有两个选择:

  1. 显式生成约束类的代码,在这种情况下,我可以使用XBaseCompiler生成表达式评估代码。但是,如果有一种方法可以直接在内存对象中创建,那么我必须以某种方式加载这些类,这似乎是不优雅的。

  2. 使用ModelInferrer直接在内存中生成可以传递给其他类的对象,因此不需要加载类。在这种情况下,我不确定如何生成xbase表达式评估代码。

  3. 在阅读完所有xtext文档/教程并使用这些示例后,我留下了以下问题:

    就scalabilty而言,哪种方法是“最好的”(我后来可能想扩展语法,和/或他生成的类的功能)? 如果我遵循ModelInferrer方法,我究竟会怎么做? 还有其他方法吗?

    非常感谢任何帮助

1 个答案:

答案 0 :(得分:2)

最好的方法是使用模型推理器来创建DSL元素的Java表示。表达式通常通过JvmTypeBuilder#setBody赋值。看看域模型示例,您将在其中找到对操作体的分配:

members += f.toMethod(f.name, f.type) [
    for (p : f.params) {
        parameters += p.toParameter(p.name, p.parameterType)
    }
    body = f.body
]

另一种选择是手动创建代码:

body = [
    append(varName).append(' = new ').append(typeName).append('();')
]

inferer方法允许强大的Eclipse集成,因为类型层次结构,调用层次结构或go-to-declaration都将遵循派生的Java事物。