这是我的语法快照:
Sort:
name=ID
;
Variable
name=ID ':' type=[Sort]
我的要求是有一个预定义的排序,我们称之为Loc。用户不需要定义这种排序,因此当使用Loc类型定义变量时,Xtext 应该自动将其引用到我预定义的排序。如何启动程序以便在开始时生成一个 Sort 实例?我已经在我的验证器类中使用了工厂方法“CreateSort”,但没有用。
这是我的语法快照:
Sort:
name=ID
;
Variable
name=ID ':' type=[Sort]
我的要求是有一个预定义的排序,我们称之为Loc。用户不需要定义这种排序,因此当使用Loc类型定义变量时,Xtext 应该自动将其引用到我预定义的排序。如何启动程序以便在开始时生成一个 Sort 实例?我已经在我的验证器类中使用了工厂方法“CreateSort”,但没有用。
您对 createSort Factory 方法的直觉很好,但您必须在正确的时间调用它。必须在链接步骤之前创建Loc实例。为此,您必须绑定自定义链接器并覆盖它。
public class CustomLinker extends LazyLinker {
@Override
protected void beforeModelLinked(EObject model,
IDiagnosticConsumer diagnosticsConsumer) {
super.beforeModelLinked(model, diagnosticsConsumer);
if (model instanceof Root) {
Root root = (Root) model;
Sort locSort = MyDslFactory.eINSTANCE.createSort();
locSort.setName("Loc");
root.getContent().add(locSort);
}
}
}
然后,在运行时模块中绑定这个自定义链接器类:
public class MyDslRuntimeModule extends org.xtext.example.mydsl.AbstractMyDslRuntimeModule {
@Override
public Class<? extends ILinker> bindILinker() {
return CustomLinker.class;
}
}
现在您可以编写一个包含
变量:Loc
引用将被解析。