在我当前的项目中,我正在使用xText编辑器编写我的dsl规范(即voc.mydsl,arch.mydsl和network.mydsl)。我喜欢xText编辑器,因为它具有代码补全和其他功能。

但是,我有一个单独的Java程序。此Java程序将文本文件(即voc.txt,arch.txt,network.txt)作为输入,使用ANTLR解析器解析这些文件,并使用StringTemplate文件生成代码。

现在,我的问题是目前,我必须手动执行以下步骤:
(1)我在XText编辑器(voc.mydsl,arch.mydsl和network.mydsl)中编写了DSL规范。
(2)我将这些规范复制粘贴到三个文本文件中(即voc.txt,arch.txt,network.txt)。
(3)最后,我运行Java程序来解析这些.txt文件并生成代码。

有什么方法可以自动完成上述三个步骤(一次单击即可完成)?让我知道您是否需要任何细节。

最佳答案

您可以为您的DSL编写一个“特殊”生成器。每当您编辑和保存* .mydsl文件时,XText都会调用此生成器。 Xtext对您在“生成器”中实际执行的操作没有任何意义。因此,您的MydslGenerator.xtend生成器可能如下所示:

// whereever Xtext generates your empty version of this file
package mydsl.xtext.generator

// add imports

@Singleton
class MydslGenerator implements IGenerator {

    override void doGenerate(Resource resource, IFileSystemAccess fsa) {

        // calculate new filename
        val newFilename= resource.URI.lastSegment.replaceAll(".mydsl", ".txt")

        // get text representation of parsed model
        val textContent = resource.contents.map[NodeModelUtils::getNode(it).text].join

        // write text content to new file
        fsa.generateFile(newFilename, textContent);

        // TODO: call ANTLR parser on new file here
    }
}

在最后一步中,您可以通过直接从Eclipse调用main方法或调用新的JVM来调用“其他”程序。仅当其他生成器能够快速工作时才建议使用后者,因为只要保存* .mydsl文件,就会调用该生成器。仅当其他程序没有内存泄漏并且没有太多jar依赖项时,才建议使用第一种方法。

09-11 20:48