这里是我的语法的快照:
Sort:
name=ID
;
Variable
name=ID ':' type=[Sort]
我的要求是要有一个预定义的Sort,我们称它为Loc。用户无需定义此排序,因此,当使用Loc类型定义Variable时,Xtext应该自动将其引用到我预定义的Sort。如何启动程序,以便在开始时生成Sort实例?我已经在validator类中使用了Factory方法'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
该引用将被解决。