3

我需要制作一个输出类似 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还是我应该尝试另一种工具(如果是的话,哪个)或者我最好自己做编译器实现?

4

2 回答 2

2

我需要制作 DSL

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

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

许多人都认为 C 预处理器是其中之一,而我是其中一个不平凡的程序,developing something more powerful至少对我而言,它构成了一件艺术品。

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

DSL 并不意味着简单,它意味着更简单,C 比 C++ 更易于解析,Scheme 比 C 更易于解析,但是编写一个没有错误的好的方案解析器需要一些努力,而方案是最简单的方案之一。

于 2016-05-17T06:44:01.830 回答
1

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

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

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

于 2016-05-15T15:21:25.263 回答