创建一个简单的领域特定语言

时间:2011-08-24 02:26:16

标签: jvm code-generation antlr dsl bytecode

我很想知道如何创建特定于域的语言。现在,域是非常基本的,只需要一些变量并运行一些循环,if语句。

编辑:该语言将采用非英语语言,语法非常简单。

我正在考虑定位Java虚拟机,即编译为Java字节代码。

目前我知道如何使用ANTLR编写一些简单的语法。

我知道ANTLR会创建一个词法分析器和解析器,但我该如何从这里开始呢?

  • 关于语义分析:是否必须手动编写或是否有一些工具来创建它?
  • 如何将词法分析器和解析器的输出转换为Java字节码?
  • 我知道有像ASM或BCEL这样的库,但确切的程序是什么?
  • 有没有这样做的框架?如果有的话,最简单的是什么?

3 个答案:

答案 0 :(得分:5)

您应该尝试Xtext,这是一个基于Eclipse的DSL工具包。版本2非常强大且稳定。从它的主页,你有足够的资源来帮助你入门,包括一些视频教程。因为Eclipse生态系统是围绕Java运行的,所以它似乎是您的最佳选择。

你也可以尝试MPS,但这是一个投影编辑器,初学者可能会发现它更难。然而,它不比Xtext强大。

答案 1 :(得分:2)

如果您的目标是尽可能多地学习编译器,那么确实您必须采取艰难的方式 - 编写一个临时解析器(没有antlr等),编写您自己的语义传递和您自己的代码生成。 / p>

否则,您最好使用DSL扩展现有的可扩展语言,重用其解析器,语义和代码生成功能。例如,您可以在Clojure宏之上轻松实现几乎任意复杂的DSL(然后Clojure本身会被转换为JVM,您将免费获得它。)

答案 2 :(得分:1)

语法简单的DSL可能意味着也可能不意味着简单的语义。

简单的语义可能意味着也可能不意味着轻松翻译成目标语言;只有当DSL和目标语言共享许多常见的数据类型和执行模型时,这种翻译才“技术上容易”。 (约束系统具有简单的语义,但将它们转换为Fortran真的很难!)。 (你一定很想知道:如果你的DSL很容易翻译,你为什么要这么做?)

如果你想构建一个DSL(在你的情况下,你很容易坚持,因为你正在学习),你需要DSL编译器基础设施,其中包含你需要的任何东西,包括支持困难的翻译。处理将所有DSL转换为所有可能的目标语言的“需要什么”显然是一套不可思议的大型机器。

然而,有很多很明显可以提供帮助:

  • 强大的解析机制(谁想要处理结构被强制的语法 由于解析机制的弱点? (如果您不知道这是什么,请阅读LL(1)grammmars作为示例。)
  • 自动构造解析的DSL的表示(例如,抽象语法树)
  • 访问/修改/构建新AST的能力
  • 能够捕获有关符号及其含义的信息(符号表)
  • 能够为DSL构建AST分析,以支持需要的翻译 来自树中“远处”的信息,以影响树中特定点的翻译
  • 能够轻松地重新编程AST以实现本地优化
  • 如果DSL具有某些程序方面,并且代码生成需要深入推理或优化,则能够构建/分析控制和数据流信息

可用于“构建DSL生成器”的大多数工具提供某种解析,可能是树构建,然后让您填写所有其他工具。这使您处于一个小而干净的DSL的位置,但需要永远实现它。这不好。你真的想要所有的基础设施。

我们的DMS Software Reengineering Toolkit包含了上面列出的所有基础设施以及更多内容。 (它显然没有,也没有月亮)。您可以看到完整的一体化“页面”simple DSL example that exercises some ineresting parts of this machinery