2017-04-14 57 views
2

我有一个元模型中,我有一个类Rangemin一个max整数值,我想定义XTEXT DSL,在其中你可以这样定义1..10一个范围内,但也默认标准像?!,将代表0..11..1。我查看了文档,但找不到任何方法在xText语法中定义此文档。到目前为止,我对一般的情况下是否可以为xtext规则中的属性分配常量值?

Range: min=INT '..' max=INT;

但是一个规则,我没有找到任何方式来定义像

Range: '?' min=0 max=1;

Range: '!' min=1 max=1;

的东西我怎么能为我的DSL实现类似的行为?

请注意,我不想从语法中生成元模型,因为DSL模型应该遵循现有的元模型。

回答

0

我不知道一个简单的解决方案,但你可能能够自定义Xtexts对象的创建,例如像

Model: ranges+=AbstractRange*; 
AbstractRange returns Range: ExplicitRange | ZORange | OORange; 
ExplicitRange returns Range: min=INT ".." max=INT; 
ZORange returns Range: {Range} max=ZEROONE; 
ZEROONE returns ecore::EInt: "?"; 
OORange returns Range: {Range} max=ONEONE; 
ONEONE returns ecore::EInt: "!"; 

而且自定义下列

class MyDslEcoreElementFactory extends DefaultEcoreElementFactory { 

    @Inject extension MyDslGrammarAccess 

    override set(EObject object, String feature, Object value, String ruleName, INode node) throws ValueConverterException { 
     if (object instanceof Range) { 
      if (ruleName == grammar.name+"."+ZEROONERule.name) { 
       object.max = 1 
       object.min = 0 
       return; 
      } else if (ruleName == grammar.name+"."+ONEONERule.name) { 
       object.max = 1 
       object.min = 1 
       return; 
      } 

     } 
     super.set(object, feature, value, ruleName, node) 
    } 

} 

约束这样

class MyDslRuntimeModule extends AbstractMyDslRuntimeModule { 

    override bindIAstFactory() { 
     MyDslEcoreElementFactory 
    } 

} 

不幸org.eclipse.xtext.parser.IAstFactory.create(EClassifier) 没有指定节点的第二PARAM或规则,你是在和你抵抗引入范围的子类(在从您的范围继承的元模型),这将使这有点容易(只覆盖创建)

相关问题