我有一个特定于域的语言,可以翻译成SQL。我必须编写自己的词法分析器,解析器和代码生成器,还是有可以帮助我的工具?
答案 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 主题的更多信息。
答案 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代码,直到现在它仍然是一个成功的项目。