2016-05-13 10 views
1

SQLライクな言語を出力するDSLを作成する必要があります。まず、再帰的な降下パーサー+単純なコード生成アプローチを使って私自身のトランスヒーラーをロールしてみた。しかし、DSL言語が本当にシンプルで、出力言語も単純なので、私はCプレプロセッサのより強力なバージョンのように、時間とエネルギーを消費するアプローチを見つけようとしました。最初に心に浮かんだのはm4だった、私は以前に聞いたことがあるだけで、今までそれを使ったことはなかった。私はいくつかのチュートリアル/ドキュメンテーションを読んでいますが、私はこのツールで私の目標を達成できるかどうかまだ分かりません。例えば Iターン希望:SQLライクな言語を作成する良い選択肢

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) 

だから私は、これを実現するための良い方法は何ですか?私は自分のコンパイラの実装をやっているほうがいいですか?

+0

あなたのDSLは自明いくつかの他の言語に翻訳した場合、それは価値の多くを追加していません。その言語で書こうと思っていたものを書いてみませんか?翻訳が些細なものでなければ、些細な "transpiler"フレームワークを選択しても翻訳を実装することはあまりありません。私はあなたがパーサーを避けることができない(したがって、M4は答えではない)ことが分かり、パーザだけでは不十分であることを発見すると思います。 http://www.semdesigns.com/Products/DMS/LifeAfterParsing.htmlを参照してください。 –

答えて

0

私は、適切な外部DSLを構築するために行くだろう。このようにして、コードを検証し、型システムルールのようなものを持つことができます。

はあなたの言語には依存しないだろうか、それは他の言語(例えば、JavaまたはC)と相互運用する必要があるでしょうか?エディターのサポートが必要ですか?

パーサは簡単にANTLRを書き込むことができます。 Ira Baxter氏は、考慮すべき他の側面があり、実際にこれらの他のものを実装するために必要な努力は、現場でのあなたの経験に依存していると指摘しています。

1

私は私はあなたがDSLを作成する必要が前提に動作しますDSL

を作成する必要があります。多くの問題はDSLのように見えますが、実際には別の言語をよく理解すればより効果的です。 Cプリプロセッサのより強力なバージョンのような

Cプリプロセッサは、多くの人に考えられて、私は多くの非自明なプログラムそれらの一人ですが、developing something more powerfulは、少なくとも私には、美術の作品を構成するであろう。再帰下降パーサを開発

はまた、任意の非自明な入力のための非自明です。理解するのは簡単ですが、すべてのケース/プロダクションなどを処理することはかなり手間がかかります。あなたの文法を定義するためにANTLRのようなものを使用し、それを使ってパーサを生成するのであれば、それは簡単ですが、それでもなお重要ではありません。

DSLはシンプルであることを意味するものではなく、Cは解析するのにC++よりも簡単であり、Schemeは解析するのがシンプルですが、バグのない良いスキーマパーサーを書くのはsome effortで、スキームは最も簡単です。

+0

少なくともCプリプロセッサほど強力なm4(彼はビルドする必要はありません)を使用するように提案されました。しかし、マクロプロセッサはDSLコンパイラにとって大きな基盤ではありません。パーサーを構築することは、技術的には簡単です(「解決するのは難しい問題はありません」)が、翻訳者の作成に関しては、OPのトラブルの中では最少です。 –

関連する問題