制作类似 sql 的语言转译器的好选择

Posted

技术标签:

【中文标题】制作类似 sql 的语言转译器的好选择【英文标题】:Good alternative to make a sql-like language transpiler 【发布时间】:2016-05-13 20:30:38 【问题描述】:

我需要制作一个输出类似 SQL 语言的 DSL。首先,我想使用递归下降解析器 + 一种简单的代码生成方法来推出我自己的转译器。但是由于 DSL 语言非常简单,输出语言也很简单,我意识到我会尝试找到一种时间和精力更少、消耗更少的方法,而不是重新发明***,比如更强大的 C 预处理器版本。首先想到的是m4,我以前只听说过,到目前为止从未使用过。我正在阅读一些教程/文档,但我仍然不确定是否可以使用此工具实现我的目标。 比如我想转:

display a,b,c if a.substring(0, 3) == b.substring(0, 3) and (c + 8 > 20 || c == 0)

会翻译成这样的:

SELECT A, B, C from tbl where substring(A, 0, 3) = substring(B, 0, 3) and (c + 8 > 20 or c = 0)

那么我有什么好的方法来完成这个?继续学习M4 还是我应该尝试另一种工具(如果是,那是哪一种)或者我最好自己实现编译器?

【问题讨论】:

如果你的 DSL 简单地翻译成其他语言,它并没有增加很多价值;为什么不直接用那种语言写下你要写的东西呢?如果翻译不是微不足道的,那么选择一个微不足道的“转译器”框架不会对实现翻译有太多帮助,因此构建你的转译器将很困难。我想你会发现你无法避免使用解析器(因此 M4 不是答案),而且仅仅一个解析器是不够的。见semdesigns.com/Products/DMS/LifeAfterParsing.html 【参考方案1】:

我需要制作一个 DSL

我将假设您需要创建 DSL。虽然很多问题看起来像 DSL 会有所帮助,但很好地理解另一种语言实际上会更有帮助。

就像一个更强大的 C 预处理器版本。

很多人都在考虑 C 预处理器,而我也是其中之一,developing something more powerful 至少对我来说是一件艺术品。

对于任何非平凡的输入,开发递归下降解析器也是不平凡的。这很容易理解,但处理所有案例/制作等变得相当麻烦。如果你使用 ANTLR 之类的东西来定义你的语法,然后用它来生成解析器,这会更容易,但仍然不是微不足道的。

DSL 并不意味着简单,它意味着更简单,C 比 C++ 更容易解析,Scheme 比 C 更容易解析,但是编写一个没有错误的好的方案解析器需要some effort,scheme 是其中之一最简单的。

【讨论】:

OP 建议使用 m4(他不需要构建它),它至少与 C 预处理器一样强大。但是宏处理器并不是 DSL 编译器的良好基础。构建解析器实际上在技术上很容易(“没有难以解决的问题”),但在构建翻译器时,OP 的麻烦最少。【参考方案2】:

我会去构建一个合适的外部 DSL。通过这种方式,您可以验证代码并拥有诸如类型系统规则之类的东西。

您的语言是独立的还是需要与其他语言(例如 Java 或 C)互操作?您需要编辑器支持吗?

使用 ANTLR 可以轻松编写解析器。正如 Ira Baxter 指出的那样,还有其他方面需要考虑,实施这些其他方面真正需要的努力取决于您在该领域的经验。

【讨论】:

以上是关于制作类似 sql 的语言转译器的好选择的主要内容,如果未能解决你的问题,请参考以下文章

用两个参数在主线程上执行选择器的好方法?

解释器和编译器,编译型原理和解释型原理

gcc编译流程

gcc编译流程

用于实现决策树的语言

编译打字稿而不转译异步函数