2012-07-17 411 views
5

我有一個可以轉換爲SQL的特定於域的語言。我必須編寫自己的詞法分析器,解析器和代碼生成器,還是有工具可以幫助我?將DSL轉換爲SQL的正確工具?

+0

您是否打算在SQL中解析您的域特定語言語法呢? – alexm 2012-07-17 20:50:37

+1

讓我們改述一下:做SQL生成的主機語言是什麼? – alexm 2012-07-17 20:54:57

+0

這實際上取決於你使用的語言和你的DSL有多複雜。 – 2012-07-17 20:56:12

回答

0

這聽起來像你正在尋找類似禮,其目的是從它接受的規範,並生成一個翻譯:

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

在另一方面,你可能會一樣開心用一個像ANTLR這樣不錯的生成工具編寫解析器,並自己編寫AST和代碼生成器。

假設從DSL的翻譯很簡單,編寫像SQL這樣的高級語言的代碼生成可能不是很難實現。

如果是我,我會使用ocamllex和ocamlyacc在OCaml中寫這個東西,但爲此你首先需要知道OCaml。

1

這很大程度上取決於您將使用的語言,但Groovy,Ruby,Scala,F#和Haskell是完成此操作的良好語言。

您使用哪種語言會影響您應該使用哪些工具。

例如,您可以在C中執行此操作,但這可能會有更多工作,並且可能對用戶來說看起來不太好。

有些語言需要使用工具來幫助解析器,其他語言如果沒有工具就更好。

您可能需要閱讀本書,以瞭解更多有關DSL的主題,DSLs in Action

http://manning.com/ghosh/

1

如果你的DSL是由DSL編碼器設計的可讀性,那麼,你需要一個詞法,語法分析器和代碼生成器。 (其他答案表明,如果你在你的'元語言'的語法中編碼DSL'「,你不需要這些機制;雖然這可能是事實,但它優化了DSL在元語言中的可嵌入性,而不是最終用戶的可讀性,我認爲這是一個糟糕的折衷)。

不,你不必從頭開始編寫它們。

野外有很多解析器生成器(YACC,Bison,ANTLR,JavaCC),它們將幫助您專注於編碼DSL的語法規則;他們提供了許多低級解析機制來處理/執行您的語法規則作爲解析引擎。儘管如此,你必須花費精力將概念語法彎曲到特定解析器生成器的限制(LALR(1),LL(k),...)ANTLR/Bison/Yacc將幫助您構建樹;你必須做明確的工作才能做到這一點。在那之後,你用傳統的解析器獨立完成。大多數人最終會被那種驚訝一旦到達那裏(如果他們走到這一步,真正的語言解析器往往比他們期望更多的工作

這是因爲有很多的Life After Parsing:符號表,代碼分析,代碼生成我們的DMS Software Reengineering Toolkit旨在幫助您在語法引擎的最小約束條件下構建分析規則;自動構建樹(look,ma,no hands!),並以各種方式爲代碼轉換提供大量支持。另外,DMS提供了一個透視圖和工具來支持使用源/目標模式對以結構化方式在DSL(「您的語言」)片段與目標之間進行轉換以指定映射。對於OP的特定目的,可以使用SQL2011語法獲得DMS,爲編寫目標模式提供了一個很好的基準。

要了解更多關於使用工具進行自動轉換的信息,請參閱我的SO discussion on translating between languages

0

如果您使用的是正確的元語言(如Lisp),則不需要詞法分析器,解析器和代碼生成器。所有內容都已包含在內 - 您可以在S表達式之上構建DSL,您可以在Lisp本身中生成代碼的主機部分。

即使您想爲您的DSL使用特殊語法,也很容易將解析器嵌入到元語言中。

2

您可能想要閱讀本書:Language Implementation Patterns作者:The Pragmatic Programmers系列的Terence Parr。它全面介紹瞭解析,翻譯和編譯。它很大程度上依賴於ANTLR by Terence Parr的示例,但通用性足以讓您使用其他語言和系統。

0

我有一個類似於你的項目。我認爲你應該檢查Xtext和Xtend,因爲它們可以直接在Eclipse中使用,你可以很容易地獲得智能感知,語法,詞法分析器。我試圖產生SQL代碼,直到現在它一直是一個成功的項目。