以编程方式将eObject添加到解析树中

问题描述 投票:0回答:1

这里是我的语法的快照:

Sort:
 name=ID 
;
Variable
 name=ID ':' type=[Sort]

我的要求是要有一个预定义的Sort,我们称它为Loc。用户无需定义此排序,因此,当使用Loc类型定义Variable时,Xtext应该自动将其引用到我预定义的Sort。如何启动程序,以便在开始时生成Sort实例?我已经在validator类中使用了Factory方法'CreateSort',但是没有用。

factory xtext parse-tree
1个回答
1
投票

您的带有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

该引用将被解决。

© www.soinside.com 2019 - 2024. All rights reserved.