是否可以导出由 JetBrains MPS 创建的 DSL 编译器并独立使用它(例如从另一个 Java 程序调用它)

Is it possible to export a DSL compiler created by JetBrains MPS and use it independently (e.g. invoke it from another Java program)

我想构建一个 DSL 并按如下方式使用它:

我可以使用 JetBrains MPS 构建 DSL 并按照说明导出其编译器吗?如果没有,其他建议表示赞赏?

在我看来,您的问题与此文档条目相距不远:https://confluence.jetbrains.com/display/MPSD32/Building+standalone+IDEs+for+your+languages

我在 MPS 支持论坛上提出了问题,我得到的答案是无法从 MPS IDE 为我的 DSL(例如 JAR)导出编译器,然后从中调用导出的编译器一些 Java 应用程序(想一想 Java 后端服务)传递代表在我的 DSL 上编写的程序的文本输入。

虽然可以用ant调用"MPS code generator"(负责生成目标语言代码,例如Java,代表输入的DSP程序),但是生成器期望作为输入"the MPS model" 你的 DSL 程序(我猜它是一些像 DSL 程序的 MPS 内部表示的 AST)。但是生成 DSL 程序的 "the MPS model" 的唯一方法是使用 Jetbrains 的 MPS IDE(或者它的剥离版本,或者带有 DSL 插件的 intellij)。 换句话说,在 DSL 中 write/edit 程序并能够编译它们的唯一方法是使用 Jetbrains MPS IDE(或其衍生物之一).

Link to the question I posted on MPS Support forum and the answer.

也许你不能直接把它作为一个 jar 库来做,但是有可能,用一些 ant 或 gradle 魔法,从蚂蚁任务。关于此的文档可以在 https://www.jetbrains.com/help/mps/building-mps-language-plugins.html# 找到 我知道它说构建插件,但使用了相同的机制。 但是,我不知道为什么要这样做,因为 MPS 的强项是 IDE 支持和非常先进的多语言集成,不一定是代码生成。

invoke the exported compiler [...] passing a text input representing a program written on my DSL

可悲的是,您的想法存在内在缺陷。没有以文本作为输入的 MPS“DSL 编译器”这样的东西。在 MPS 中,有 generators 将您的 DSL 转换为另一种 MPS 语言,在您的情况下,您的目标语言将是 BaseLanguage(Java 的 MPS 版本)。转换后,Java源代码生成为.java文件,并自动编译为.class文件。所以,是的,这可以通过在 BuildLanguage 中构建并从 cmd 调用的 Ant 脚本来完成。 但是,生成器不将输入文本而是 AST 作为输入。 AST 是您在 MPS 中“编码”的程序(正确的术语将被建模)。

所以你真正想要的是一个 parser(如果你的语言是文本的并且是可解析的),它将文本作为输入,AST 作为输出。一旦您拥有任何形式的 AST,您就可以以某种方式将其放入 MPS 模型中。

请参考我的其他回答,我评论了 MPS 中的一些可移植性(主要是导入、导出)here。我已经提到(不仅是)我在那里工作的一个项目。它允许将语言和程序导入 MPS。

如果您根本不想使用 MPS IDE,而是要处理文本,那么它就失去了 MPS 作为语言 workbench (LWB) 和投影编辑器的优势。也许您应该使用另一个文本 LWB (f.e.Xtext) 或解析器生成器 (f.e.ANTLR)。如果解析器生成器中的语法定义吓到你,你可以使用 model-based 解析器生成器,如 YAJCo(我已经贡献)。