首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >创建一个简单的领域特定语言

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

Stack Overflow用户
提问于 2011-08-24 02:26:15
回答 3查看 2.3K关注 0票数 6

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

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

我正在考虑以Java虚拟机为目标(编译为Java字节码)。

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

我知道ANTLR创建了一个lexer和解析器,但是我如何从这里继续前进呢?

  • 关于语义分析:它需要手动编写还是有一些工具来创建它?
  • 如何将lexer和解析器的输出转换为Java字节码?
  • 我知道有像ASM或BCEL这样的库,但是确切的过程是什么呢?
  • 是否有这样做的框架?如果有的话,最简单的是什么?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-24 15:04:01

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

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

票数 6
EN

Stack Overflow用户

发布于 2011-08-24 10:28:11

如果您的目标是尽可能多地了解编译器,那么您确实必须走一条艰难的道路--编写一个特殊的解析器(不是antlr和类似的),编写自己的语义传递和自己的代码生成。

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

票数 2
EN

Stack Overflow用户

发布于 2011-10-30 04:25:39

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

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

如果您想构建一个DSL (在您的例子中,您坚持使用easy,因为您正在学习),您需要DSL编译器基础结构,其中包含您需要的任何东西,包括对困难翻译的支持。要将所有DSL翻译成所有可能的目标语言,“需要什么”显然是一套不可能的大机器。

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

  • 强大的解析机制(谁想要欺骗语法,其结构是被迫的,因为分析机器的弱点?(如果你不知道这是什么,那就以LL(1)语法为例)。
  • 自动构造解析DSL的表示形式(例如抽象语法树)
  • 能够访问/修改/构建新的AST
  • 能够捕获有关符号及其含义的信息(符号表)
  • 能够为DSL构建AST分析,支持需要从树中的“远距离”进行信息的翻译,影响树中某个特定点的翻译。
  • 能够轻松地重新划分AST以实现局部优化
  • 如果DSL有一些过程方面,并且代码生成需要深入的推理或优化,则能够构建/分析控制和数据流信息。

大多数用于“构建DSL生成器”的工具都提供了某种类型的解析,可能是树构建,然后让您来填充其余的部分。这使您处于拥有一个小的、干净的DSL的位置,但是需要花费很长的时间来实现它。这可不妙。你真的想要所有的基础设施。

我们的DMS软件重组工具包有上面描述的所有基础设施以及更多。(它显然没有,也不可能有月亮)。你可以看到一个完整的,全部一体的“页面”,简单的DSL示例,练习这台机器的一些惰性部件。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7169802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档