【问题标题】:providing automization with Xtext and Java program使用 Xtext 和 Java 程序提供自动化
【发布时间】:2013-02-06 18:46:04
【问题描述】:

在我当前的项目中,我使用 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 文件并生成代码。

有什么方法可以使上述三个步骤自动化(单击即可执行)?如果您需要任何详细信息,请告诉我。

【问题讨论】:

    标签: java xtext


    【解决方案1】:

    您可以为您的 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 依赖项时才可取。

    【讨论】:

    • 感谢 A.H. 的回答。但是,我没有明确的想法。您能否举例说明您的答案并提供详细答案?
    猜你喜欢
    • 2016-07-13
    • 2018-04-23
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多