2017-04-14 15 views
2

私はあなたが1..10のような範囲を定義することが可能な、私はminmax整数値でクラスRangeを持っていると私はXTEXT DSLを定義するにはメタモデル、が、またのために立って?!のような標準的なデフォルト値を持っています0..1または1..1。私はドキュメントを見回しましたが、xText文法でこれを定義する方法が見つかりませんでした。これまでのところ、私は一般的なケースxtextルールの属性に定数値を割り当てることは可能ですか?

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

のルールを持っているしかし、私は

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

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

どのようにできたようなものを定義する方法を見つけることができませんでした私のDSLと同様の動作を実現しますか?

DSLモデルは既存のメタモデルを遵守する必要があるため、文法からメタモデルを生成することには興味がありません。

答えて

0

簡単な解決策はわかりませんが、Xtextsオブジェクトの作成をカスタマイズすることができます。この

class MyDslRuntimeModule extends AbstractMyDslRuntimeModule { 

    override bindIAstFactory() { 
     MyDslEcoreElementFactory 
    } 

} 

のようにバインドのような

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) 
    } 

} 

は、残念ながらorg.eclipse.xtext.parser.IAstFactory.create(EClassifier) は、ノードを指定する第2のparamを持っているか、あなたがしているルール、あなたはに抵抗しません(あなたのものから継承したメタモデル内の)範囲のサブクラスを導入すると、これは少し簡単になります(オーバーライド作成のみ)

関連する問題