Java Xtext,导入我自己的mydsl文件

Java Xtext,导入我自己的mydsl文件,java,xtext,xtend,Java,Xtext,Xtend,在我的语法中,我有一个包含规则如下: Script: includes+=(Include)* assignments+=(Assignment)* clock=Clock? tests+=Test* ; Include: 'INCLUDE' importURI=STRING ; 我要做的是包含与“主”文件相同的文件 我正在使用一个解释器,它处理.mydsl文件 /* Main exec methode */ def dispatch void exec(Script s

在我的语法中,我有一个包含规则如下:

Script:
    includes+=(Include)* assignments+=(Assignment)* clock=Clock? tests+=Test*
;

Include:
    'INCLUDE' importURI=STRING
;
我要做的是包含与“主”文件相同的文件

我正在使用一个
解释器
,它处理.mydsl文件

/* Main exec methode  */

def dispatch void exec(Script s) {

    s.includes.forEach[ i | i.exec]  
    s.assignments.forEach[a | a.exec]
    s.clock.exec
    s.tests.forEach[t|t.exec]
}

/* include methode */
def dispatch void exec(Include i) {

    System.out.println( i.importURI + " included")

}

Xtext导入不包括在内。Xtext根本不支持include。Xtext支持的所有内容都是交叉引用。您可以使用基于命名空间或基于导入uri的全局作用域来确定如何找到其他文件中的元素。假设您真的想要遵循解释器中的includes文件

Script:
    includes+=(Include)*
;

Include:
    'INCLUDE' includedScript=[Script|STRING]
;
class MyDslRuntimeModule extends AbstractMyDslRuntimeModule {

    override bindIQualifiedNameProvider() {
        MyDslQNP
    }

}
和名称提供程序

public class MyDslQNP extends DefaultDeclarativeQualifiedNameProvider {

    QualifiedName qualifiedName(Script script) {
        return QualifiedName.create(script.eResource().getURI().trimFileExtension().lastSegment(), script.eResource().getURI().fileExtension());
    }

}
然后你可以在你的解释器中跟随参考

Script:
    includes+=(Include)*
;

Include:
    'INCLUDE' includedScript=[Script|STRING]
;
class MyDslRuntimeModule extends AbstractMyDslRuntimeModule {

    override bindIQualifiedNameProvider() {
        MyDslQNP
    }

}

看起来更像一个
Include:'Include'includedScript=[Script | STRING]+从脚本资源uri计算名称的名称提供程序。我不认为我理解并忽略了我,但我如何“遵循”解释器中的引用。我在我有解释器的包中创建了MyDslQnp类,对吗。您只需在运行时模块中绑定nameprovider,并在其周围的某个位置创建它。在您的intepreter中,只需调用myInclude.getIncludedScript()`我将执行类似于此类的操作MyDslRuntimeModule扩展AbstractMyDslRuntimeModule{覆盖bindIValueConverterService(){返回MyDslValueConverters}@Override public Classi假设您在java和xtend之间切换并进行绑定不会有问题。我更新了答案。我仍然有一个问题。要包含的脚本有一些声明。但是我注意到我可以访问它们