2

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

  • DSL 编译为 Java。
  • 导出 DSL 编译器并将其打包(即作为 JAR),这样我就可以从 Java 应用程序调用 DSL 编译器,将“用我的 DSL 编写的代码”编译为“Java 源代码”(我将使用其他库以编程方式编译Java 转换成字节码)。

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

4

4 回答 4

1

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

虽然您可以使用 ant 来调用“MPS 代码生成器”(它负责生成目标语言代码,例如 Java,代表输入 DSP 程序),但生成器期望作为您的 DSL 程序的输入“MPS 模型”(我猜它是某种 AST,比如 DSL 程序的 MPS 内部表示)。但是生成 DSL 程序的“MPS 模型”的唯一方法是使用 Jetbrains 的 MPS IDE(或它的剥离版本,或带有 DSL 插件的 intellij)。换句话说,在 DSL 中编写/编辑程序并能够编译它们的唯一方法是使用 Jetbrains MPS IDE(或其衍生产品之一)

链接到我在 MPS 支持论坛上发布的问题和答案。

于 2020-04-19T16:06:09.020 回答
0

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

于 2020-04-16T06:31:50.207 回答
0

也许您不能直接将其作为 jar 库执行,但是可以通过一些 ant 或 gradle 魔术从 ant 任务调用 DSL 编译器(或者,在 MPS 中称为生成器)。有关这方面的文档可以在https://www.jetbrains.com/help/mps/building-mps-language-plugins.html# 我知道它说构建插件但使用相同的机制。但是,我不知道为什么要这样做,因为 MPS 的优势在于 IDE 支持和非常先进的多语言集成,而不一定是代码生成。

于 2020-05-03T07:29:12.043 回答
0

调用导出的编译器 [...] 传递表示在我的 DSL 上编写的程序的文本输入

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

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

请参阅我的其他答案,我在此处评论了 MPS 中的一些可移植性(基本上是导入、导出。我已经(不仅)提到了我正在那里工作的一个项目。它允许将语言和程序导入 MPS。

如果您根本不想使用 MPS 的 IDE,而是要处理文本,那么它将失去 MPS 作为带有投影编辑器的语言工作台 (LWB) 的优势。也许您应该使用另一个文本 LWB (fe Xtext) 或解析器生成器 (fe ANTLR)。如果解析器生成器中的语法定义吓到你,你可以使用基于模型的解析器生成器,比如YAJCo(我已经贡献了)。

于 2020-08-13T19:17:43.427 回答