Jvm 创建简单的领域特定语言

Jvm 创建简单的领域特定语言,jvm,code-generation,antlr,dsl,bytecode,Jvm,Code Generation,Antlr,Dsl,Bytecode,我很想了解如何创建一种特定于领域的语言。现在这个域非常基本,只要有一些变量并运行一些循环,if语句 编辑:该语言将以非英语为基础,语法非常简单 我正在考虑将目标对准Java虚拟机,即编译成Java字节码 目前我知道如何使用ANTLR编写一些简单的语法 我知道ANTLR创建了一个lexer和parser,但是我如何从这里开始呢 关于语义分析:它必须手动编写还是有一些工具来创建 如何将lexer和解析器的输出转换为Java字节码 我知道有像ASM或BCEL这样的库,但具体的过程是什么 有什么框架可

我很想了解如何创建一种特定于领域的语言。现在这个域非常基本,只要有一些变量并运行一些循环,if语句

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

我正在考虑将目标对准Java虚拟机,即编译成Java字节码

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

我知道ANTLR创建了一个lexer和parser,但是我如何从这里开始呢

  • 关于语义分析:它必须手动编写还是有一些工具来创建
  • 如何将lexer和解析器的输出转换为Java字节码
  • 我知道有像ASM或BCEL这样的库,但具体的过程是什么
  • 有什么框架可以实现这一点吗?如果有,最简单的是什么

如果你的目标是尽可能多地学习编译器,那么你确实必须付出艰苦的努力——编写一个特别的解析器(没有antlr之类的),编写自己的语义过程和代码生成

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

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


您也可以尝试,但这是一个投影编辑器,初学者可能会发现它更难。然而,它的功能不亚于Xtext。

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

简单的语义可能意味着也可能不意味着容易翻译成目标语言;只有在DSL和目标语言共享许多公共数据类型和执行模型的情况下,这种转换才是“技术上容易的”。(约束系统具有简单的语义,但将它们转换为Fortran真的很难!)。(你会想:如果翻译你的DSL很容易,为什么你会有它?)

如果您想要构建DSL(在您的情况下,您坚持使用easy,因为您正在学习),那么您需要DSL编译器基础设施,其中包含您需要的任何内容,包括对困难翻译的支持。处理将所有DSL翻译成所有可能的目标语言的“所需”显然是一套不可能的庞大机器

然而,有很多显然是有帮助的:

  • 强大的解析机器(谁想玩弄结构是强制的语法 由于解析机制的弱点?(如果您不知道这是什么,请阅读LL(1)Grammars作为示例)
  • 自动构造已解析DSL的表示(例如,抽象语法树)
  • 访问/修改/构建新AST的能力
  • 能够捕获有关符号及其含义的信息(符号表)
  • 能够为DSL构建AST分析,以支持需要的翻译 信息来自树中的“远处”,影响树中特定点的翻译
  • 能够轻松地重新授权AST以实现局部优化
  • 如果DSL有一些过程方面,则能够构造/分析控制和数据流信息,并且代码生成需要深入的推理或优化
大多数用于“构建DSL生成器”的工具都提供了某种解析,可能是树构建,然后让您填写所有其他内容。这使您处于一个小型、干净的DSL的位置,但需要花费很长时间来实现它。这不好。您真的需要所有的基础设施


我们有上面所画的所有基础设施和更多。(显然没有,也不可能有月球)。你可以看到一个完整的、一体化的“页面”,.

我不想深入,我只想创建一种简单的、基于非英语的、针对Java虚拟机的域特定语言。因此,该域实际上是非英语的、语法简单的。@Gautham5678,那么宏可能是您的最佳选择。您的简单语法可能是S表达式的子集。实际上,该项目是o等等,很抱歉我忘了这个问题,我将在2个月后查看xtext。我还觉得@IraBaxter的答案也很好,所以我现在就接受Rui的答案