首页 文章

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

提问于
浏览
6

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

编辑:语言将以非英语为基础,语法非常简单 .

我正在考虑将Java虚拟机作为目标,即编译为Java字节代码 .

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

我知道ANTLR会创建一个词法分析器和解析器但是我该如何从这里前进?

  • 关于语义分析:它是必须手动编写还是有一些工具来创建它?

  • 如何将词法分析器和解析器的输出转换为Java字节码?

  • 我知道有像ASM或BCEL这样的库,但确切的程序是什么?

  • 有没有这样做的框架?如果有的话,最简单的是什么?

3 回答

  • 1

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

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

  • 5

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

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

  • 2

    具有简单语法的DSL可能或可能不意味着简单的语义 .

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

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

    但是,有很多很明显可以提供帮助:

    • 强大的解析机制(谁想要解析语法结构被解析机制的弱点所强迫?(如果你不知道这是什么,请阅读关于LL(1)grammmars的例子) .

    • 自动构造解析的DSL的表示(例如,抽象语法树)

    • 能够访问/修改/构建新的AST

    • 能够捕获有关符号及其含义的信息(符号表)

    • 能够为DSL构建AST分析,支持需要从树中"far away"获取信息的翻译,以影响树中特定点的翻译

    • 能够轻松地重新编程AST以实现本地优化

    • 如果DSL具有某些程序方面,则能够构建/分析控制和数据流信息,并且代码生成需要深入推理或优化

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

    我们的DMS Software Reengineering Toolkit具有以上概述的所有基础设施以及更多 . (显然没有月亮) . 你可以看到一个完整的,一体化的"page",simple DSL example that exercises some ineresting parts of this machinery .

相关问题