Compiler construction 制作类似sql语言的transpiler的好选择

Compiler construction 制作类似sql语言的transpiler的好选择,compiler-construction,dsl,transpiler,Compiler Construction,Dsl,Transpiler,我需要制作一个输出类似SQL语言的DSL。首先,我想在roll中使用递归下降解析器+简单的代码生成方法实现我自己的transpiler。但由于DSL语言非常简单,输出语言也非常简单,我意识到我会尝试找到一种省时省力的方法,在这种方法中我不会重新发明轮子,比如更强大的C预处理器版本。首先想到的是m4,我以前只听说过,到目前为止从未使用过。我正在阅读一些教程/文档,但我仍然不确定是否可以使用此工具实现我的目标。 例如,我想要转弯: display a,b,c if a.substring(0, 3)

我需要制作一个输出类似SQL语言的DSL。首先,我想在roll中使用递归下降解析器+简单的代码生成方法实现我自己的transpiler。但由于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)

那么,我想知道实现这一目标的好方法是什么?继续学习或者我应该尝试另一种工具(如果是的话,是哪种工具),或者我最好自己做编译器实现?

我会选择构建一个合适的外部DSL。通过这种方式,您可以验证代码,并拥有诸如typesystem规则之类的功能

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

使用ANTLR可以轻松编写解析器。正如Ira Baxter指出的,还有其他方面需要考虑,而真正需要实现的其他工作取决于你在这方面的经验。

我需要做一个DSL

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

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

C预处理器被很多人认为是一个非常重要的程序,而我就是其中之一,
开发一些更强大的
至少对我来说是一件艺术品

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


DSL并不意味着简单,它意味着简单,C比解析C++更简单,并且方案比C更简单,但是编写一个没有bug的好的方案分析器将是一个最简单的方案。为什么不直接用那种语言写你想写的东西呢?如果翻译不是琐碎的,那么选择一个琐碎的“transpiler”框架将不会对翻译的实现增加太多,因此构建transpiler将很困难。我认为您将发现,您无法避免使用解析器(因此M4不是答案),仅仅使用解析器是不够的。请参阅OP建议使用m4(他不需要构建它),它至少与C预处理器一样强大。但是宏处理器不是DSL编译器的基础。构建一个解析器实际上在技术上很容易(“没有难解决的问题”),但在构建一个翻译器时,OP的麻烦最少。