我很想了解如何创建特定于领域的语言。目前,域是非常基本的,只要有一些变量并运行一些循环,if语句。
编辑:该语言将以非英语为基础,语法非常简单。
我正在考虑以Java虚拟机为目标(编译为Java字节码)。
目前,我知道如何使用ANTLR编写一些简单的语法。
我知道ANTLR创建了一个lexer和解析器,但是我如何从这里继续前进呢?
发布于 2011-08-24 15:04:01
您应该尝试一下Xtext,一个基于Eclipse的DSL工具包。版本2是相当强大和稳定的。从它的主页,你有足够的资源让你开始,包括一些视频教程。因为Eclipse生态系统围绕Java运行,所以它似乎是您的最佳选择。
您也可以尝试MPS,但这是一个投影编辑器,初学者可能会发现它更难。尽管如此,它的功能仍然不亚于Xtext。
发布于 2011-08-24 10:28:11
如果您的目标是尽可能多地了解编译器,那么您确实必须走一条艰难的道路--编写一个特殊的解析器(不是antlr和类似的),编写自己的语义传递和自己的代码生成。
否则,最好用DSL扩展现有的可扩展语言,重用其解析器、语义和代码生成功能。例如,您可以很容易地在Clojure宏之上实现一个几乎任意的复杂DSL (然后Clojure本身被转换为JVM,您将免费获得它)。
发布于 2011-10-30 04:25:39
具有简单语法的DSL可能意味着也可能不意味着简单的语义。
简单的语义可能意味着向目标语言的简单转换,也可能不意味着向目标语言的简单转换;只有当DSL和目标语言共享许多公共数据类型和执行模型时,这种转换才是“技术上容易的”。(约束系统有简单的语义,但是将它们转换到Fortran非常困难!)(你会想:如果翻译DSL很容易,为什么还要翻译呢?)
如果您想构建一个DSL (在您的例子中,您坚持使用easy,因为您正在学习),您需要DSL编译器基础结构,其中包含您需要的任何东西,包括对困难翻译的支持。要将所有DSL翻译成所有可能的目标语言,“需要什么”显然是一套不可能的大机器。
然而,有很多很明显的东西是有帮助的:
大多数用于“构建DSL生成器”的工具都提供了某种类型的解析,可能是树构建,然后让您来填充其余的部分。这使您处于拥有一个小的、干净的DSL的位置,但是需要花费很长的时间来实现它。这可不妙。你真的想要所有的基础设施。
我们的DMS软件重组工具包有上面描述的所有基础设施以及更多。(它显然没有,也不可能有月亮)。你可以看到一个完整的,全部一体的“页面”,简单的DSL示例,练习这台机器的一些惰性部件。。
https://stackoverflow.com/questions/7169802
复制相似问题