在我目前的项目中,我使用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文件并生成代码。
有什么方法可以自动化(只需单击一下)以上三个步骤?如果您需要任何细节,请告诉我。
答案 0 :(得分:3)
您可以为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依赖项时才建议。