簡単な解決策はわかりませんが、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を持っているか、あなたがしているルール、あなたはに抵抗しません(あなたのものから継承したメタモデル内の)範囲のサブクラスを導入すると、これは少し簡単になります(オーバーライド作成のみ)