我不知道一个简单的解决方案,但你可能能够自定义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或规则,你是在和你抵抗引入范围的子类(在从您的范围继承的元模型),这将使这有点容易(只覆盖创建)