我不知道一个简单的解决方案,但您也许可以自定义 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)
没有第二个参数来指定您所在的节点或规则,并且您拒绝引入范围的子类(在从您的元模型继承的元模型中),这会使这有点容易(仅覆盖创建)