2012-06-28 51 views
0

我想设计一个小的DSL检查变量的约束。我此刻的语法如下:生成用于评估Xtext中Xbase表达式的类?

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

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



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

我要生成一个只包含一个方法,需要输入一个数值,它映射到包含在约束中的唯一变量(这也是一个类的实例只声明变量),并检查约束是否满足。

这些实例将被另一个类使用,它将一个值传递给每个实例,检查它是否满足约束条件。

正如我看到它,我有2种选择:

  1. 显式生成用于约束类代码,在这种情况下,我可以只使用XBaseCompiler以产生表达式求值的代码。然而,如果有直接在内存对象中创建的方法,我将不得不以某种方式加载这些类,这看起来很不雅观。

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

阅读完所有的XTEXT文档/教程,并用实例玩弄后,我留下了以下问题:

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

任何帮助,将不胜感激

回答

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集成自从类型层次结构,调用层次结构或去声明都将兑现派生的Java事物。

+0

好吧,听起来不错,但是如何访问生成的类?例如,如果我希望在将解析DSL模型文件时创建的所有实例添加到矢量中,那么我该如何以及在哪里执行此操作?这是我在xtext教程中找不到的东西,因为一旦创建了这些类型可以访问的类型,就不会澄清它。 –

+0

我已经提出了上面的评论一个问题,以便它更清楚我的意思:http://stackoverflow.com/questions/11260216/how-to-use-xtext-inferred-jvm-model-outside-of-xtext-项目 –