制作类似SQL的语言转换器

时间:2016-05-13 20:30:39

标签: compiler-construction dsl transpiler

我需要制作一个输出类似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或者我应该尝试其他工具(如果是这样,哪一个)或者我最好自己编译实现?

2 个答案:

答案 0 :(得分:1)

  

我需要制作DSL

我会假设你需要创建一个DSL。虽然很多问题看起来像DSL会经常帮助对另一种语言有一个很好的理解实际上会更有益。

  

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

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

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

DSL并不意味着简单它意味着更简单,C比C ++简单解析而且Scheme比C更简单解析但是编写一个没有bug的好方案解析器将采用some effort而scheme是一个最简单的。

答案 1 :(得分:0)

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

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

可以使用ANTLR轻松编写解析器。正如艾拉·巴克斯特指出的那样,还有其他方面需要考虑,真正需要付出的努力取决于你在该领域的经验。