将DSL翻译为SQL的正确工具是什么?

5

我有一种特定于领域的语言,可以转换为SQL。 我必须编写自己的词法分析器、解析器和代码生成器,还是有工具可以帮助我?


你是否计划在 SQL 中解析你的领域特定语言语法? - alexm
1
让我重新表述一下:哪种宿主语言会执行SQL生成? - alexm
这真的取决于您使用的编程语言以及您的DSL有多复杂。 - Sean McSomething
6个回答

2
如果你的DSL是为DSL编码者易读而设计的,那么是的,你需要一个词法分析器、一个语法分析器和一个代码生成器。
(其他答案表明,如果你在“元语言的语法”中编写DSL,就不需要这些机制;虽然这可能是真的,但它优化了DSL在元语言中的嵌入能力,而不是其对最终用户的可读性,我认为这是一个很差的权衡)。
不,你不必从头开始编写它们。
有很多解析器生成器在使用中(如YACC、Bison、ANTLR、JavaCC),它们将帮助你专注于为你的DSL编写语法规则;它们提供了许多低级解析机制来处理/执行你的语法规则作为解析引擎。不过,你必须花费精力将你的概念语法弯曲到特定解析器生成器的限制上(LALR(1)、LL(k)等)。ANTLR/Bison/Yacc将帮助你构建树形结构;你必须做显式的工作来完成这个过程。之后,你就得靠传统的解析器自己解决问题了。大多数人一旦到达这里,都会感到有些惊讶(如果他们能走到这一步的话;对于真实语言的解析器来说,它们往往比人们预期的更加困难)。
那是因为有很多解析后的生活:符号表、代码分析、代码生成。我们的DMS软件重构工具包旨在帮助您以最小的语法引擎约束构建解析规则;自动构建树(看,不用手!)并提供广泛的支持,以各种方式进行代码转换。此外,DMS提供了一种透视图和工具,以结构化方式支持DSL(“您的语言”)片段与目标之间的转换,使用源/目标模式对指定映射。对于OP的特定目的,可以使用SQL2011语法获得DMS,为编写目标模式提供良好的基线。
要了解更多关于使用工具进行自动转换的信息,请参阅我的SO关于语言转换的讨论

2
你可能想看一下这本书:《语言实现模式》(Language Implementation Patterns),作者是 Terence Parr,所属于 Pragmatic Programmers 系列。它是关于解析、翻译和编译的全面介绍。书中大量使用了 Terence Parr 的 ANTLR 作为例子,但也足够通用,可以帮助你在其他语言和系统中入门。

1

我有一个类似于你的项目。我认为你应该看看Xtext和Xtend,因为它们可以直接在Eclipse中使用,你可以轻松地获得智能感知、语法和词法分析器。我尝试生成SQL代码,到目前为止这是一个成功的项目。


1

这取决于您将使用的语言,但Groovy、Ruby、Scala、F#和Haskell是用于此目的的好语言。

您使用的语言将影响您应该使用哪些工具。

例如,您可以在C中完成此操作,但这需要更多的工作,并且可能不够美观。

有些语言需要使用工具来帮助解析器,而其他语言则不需要。

您可能想阅读这本书,以了解有关DSL的更多信息,《DSLs in Action》。

http://manning.com/ghosh/


0

听起来你正在寻找类似Eli的东西,它旨在接受规范并从中生成翻译器:

http://eli-project.sourceforge.net/

另一方面,使用像ANTLR这样的良好生成工具编写解析器并自己编码AST和代码生成器,您可能会感到非常高兴。
编写生成高级语言(如SQL)的代码生成器可能不太难实现,假设从DSL翻译很简单。
如果是我,我会使用ocamllex和ocamlyacc在OCaml中编写这个东西,但是首先需要了解OCaml。

0
如果您使用适当的元语言(例如Lisp),则不需要词法分析器、解析器和代码生成器。一切都已经包含在内 - 您可以在S表达式之上构建DSL,甚至可以在Lisp本身中生成主机部分的代码。
即使您想要为DSL使用特殊语法,将解析器嵌入到元语言中也非常容易。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接