0

我正在尝试设计一个小 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 表达式评估代码。

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

就可扩展性而言,哪个是“最佳”方法(我以后可能想扩展语法和/或他生成的类的功能)?如果我遵循 ModelInferrer 方法,我将如何处理事情?有没有其他方法可以做到这一点?

任何帮助将非常感激

4

1 回答 1

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('();')
]

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

于 2012-06-28T18:06:23.490 回答