将DSL转换为SQL的正确工具?

时间:2012-07-17 20:39:05

标签: sql parsing code-generation dsl lexer

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

6 个答案:

答案 0 :(得分:2)

您可能希望阅读本书:来自The Pragmatic Programmers系列的Terence Parr撰写的Language Implementation Patterns。它是对解析,翻译和编译的全面介绍。它在很大程度上依赖于ANTLR by Terence Parr的例子,但它足以让你进入其他语言和系统。

答案 1 :(得分:1)

这在很大程度上取决于您将使用的语言,但Groovy,Ruby,Scala,F#和Haskell是这样做的好语言。

您使用哪种语言会影响您应该使用哪些工具。

例如,您可以在C中执行此操作,但这样做会更有效,并且对用户来说可能看起来不太好。

有些语言需要使用工具来帮助解析器,其他语言在没有工具的情况下会更好。

您可能需要仔细阅读本书,以了解有关DSL, DSLs in Action 主题的更多信息。

http://manning.com/ghosh/

答案 2 :(得分:1)

如果你的DSL是为DSL编码器的可读性而设计的,那么是的,你需要一个词法分析器,一个解析器和一个代码生成器。

(其他答案表明,如果您使用'元语言'的语法编写DSL“,则不需要这些机制;虽然这可能是真的,但它优化了DSL在元语言中的可嵌入性而不是最终用户的可读性,我认为这是一个很差的权衡。)

不,你不必从头开始写它们。

野外有很多解析器生成器(YACC,Bison,ANTLR,JavaCC),它们将帮助您专注于为DSL编写语法规则;它们提供了许多低级解析机制来处理/执行语法规则作为解析引擎。但是,您必须花费精力将概念语法弯曲到特定解析器生成器的限制(LALR(1),LL(k),...)ANTLR / Bison / Yacc将帮助您构建树;你必须做明确的工作才能做到这一点。之后,您可以使用传统解析器。一旦他们到达那里,大多数人最终会感到惊讶(如果他们达到这个目的;真正语言的解析器往往比他们期望的更多的工作。

那是因为有很多Life After Parsing:符号表,代码分析,代码生成。我们的DMS Software Reengineering Toolkit旨在帮助您使用语法引擎的最小约束来构建解析规则;自动构建树(看起来,马,没有手!)并以各种方式为代码转换提供了大量支持。此外,DMS提供了一个透视图和工具,支持使用源/目标模式对指定映射,以结构化方式在DSL(“您的语言”)片段和目标之间进行转换。对于OP的特定目的,可以使用SQL2011语法获得DMS,为编写目标模式提供了一个很好的基线。

要了解有关使用工具自动转换的详情,请参阅我的SO discussion on translating between languages

答案 3 :(得分:0)

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

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

另一方面,你可能会喜欢用一个很好的生成工具(如ANTLR)编写你的解析器,并自己编写AST和代码生成器。

编写像SQL这样的高级语言的代码生成可能并不是很难实现,假设您的DSL转换很简单。

如果是我,我会使用ocamllex和ocamlyacc在OCaml中写东西,但为此你首先需要知道OCaml。

答案 4 :(得分:0)

如果您正在使用适当的元语言(例如,Lisp),则不需要词法分析器,解析器和代码生成器。一切都已包含在内 - 您可以在S表达式之上构建DSL,您可以在Lisp本身中生成代码的主机部分。

即使您想要一种特殊的DSL语法,也很容易将解析器嵌入到元语言中。

答案 5 :(得分:0)

我有一个类似的项目给你。我认为你应该查看Xtext和Xtend,因为它们可以直接在Eclipse中使用,你可以轻松获得intellisense,grammer,lexer。我试图生成SQL代码,直到现在它仍然是一个成功的项目。