我很想知道如何创建特定于域的语言。现在,域是非常基本的,只需要一些变量并运行一些循环,if语句。
编辑:该语言将采用非英语语言,语法非常简单。
我正在考虑定位Java虚拟机,即编译为Java字节代码。
目前我知道如何使用ANTLR编写一些简单的语法。
我知道ANTLR会创建一个词法分析器和解析器,但我该如何从这里开始呢?
答案 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转换为所有可能的目标语言的“需要什么”显然是一套不可思议的大型机器。
然而,有很多很明显可以提供帮助:
可用于“构建DSL生成器”的大多数工具提供某种解析,可能是树构建,然后让您填写所有其他工具。这使您处于一个小而干净的DSL的位置,但需要永远实现它。这不好。你真的想要所有的基础设施。
我们的DMS Software Reengineering Toolkit包含了上面列出的所有基础设施以及更多内容。 (它显然没有,也没有月亮)。您可以看到完整的一体化“页面”simple DSL example that exercises some ineresting parts of this machinery。