【问题标题】:Creating a simple Domain Specific Language创建简单的领域特定语言
【发布时间】:2011-11-02 10:39:58
【问题描述】:

我很想了解如何创建特定领域的语言。现在这个域是很基础的,只有一些变量和运行一些循环,if 语句。

编辑:语言将基于非英语,语法非常简单。

我正在考虑以Java虚拟机为目标,即编译成Java字节码。

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

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

  • 关于语义分析:必须手动编写还是有一些工具可以创建?
  • 如何将词法分析器和解析器的输出转换为 Java 字节码?
  • 我知道有 ASM 或 BCEL 之类的库,但具体的程序是什么?
  • 是否有任何框架可以做到这一点?如果有,最简单的是什么?

【问题讨论】:

  • 其实这个项目是搁置的,很抱歉我忘记了这个问题,我会在2个月内看看xtext。我也觉得@IraBaxter 的回答也不错,所以我先去接受 Rui 的回答吧

标签: jvm code-generation antlr dsl bytecode


【解决方案1】:

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

你也可以试试MPS,不过这是投影编辑器,初学者可能会觉得比较难。然而,它的功能并不逊于 Xtext。

【讨论】:

    【解决方案2】:

    如果您的目标是尽可能多地了解编译器,那么您确实必须走艰难的路——编写一个临时解析器(没有 antlr 等),编写您自己的语义传递和您自己的代码生成。

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

    【讨论】:

    • 我不想深入,我只想创建一个针对 Java 虚拟机的简单的基于非英语的领域特定语言。所以该领域实际上是非英语和简单的语法。
    • @Gautham5678,那么宏可能是你最好的选择。您的简单语法很可能是 S 表达式的子集。
    【解决方案3】:

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

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

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

    但是,有很多明确的内容可能会有所帮助:

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

    大多数可用于“构建 DSL 生成器”的工具都提供了某种解析,也许是树构建,然后让您完成所有其余的工作。这使您处于拥有一个小而干净的 DSL 但要花很长时间才能实现它的位置。这不好。你真的想要所有的基础设施。

    我们的DMS Software Reengineering Toolkit 拥有上面概述的所有基础架构以及更多。 (它显然没有,也不能有月亮)。您可以看到一个完整的一体式“页面”,simple DSL example that exercises some ineresting parts of this machinery

    【讨论】:

      猜你喜欢
      • 2019-01-05
      • 1970-01-01
      • 2010-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多