SQL に変換できるドメイン固有の言語があります。独自のレクサー、パーサー、およびコード ジェネレーターを作成する必要がありますか、それとも役立つツールはありますか?
6 に答える
あなたの DSL が DSL コーダーによる可読性を考慮して設計されている場合、そうです、レクサー、パーサー、およびコード ジェネレーターが必要です。
(他の回答は、「「メタ言語」の構文で」DSL をコーディングする場合、これらのメカニズムは必要ないことを示唆しています。エンドユーザーにとっての読みやすさは、トレードオフが悪いと思います)。
いいえ、ゼロから作成する必要はありません。
世の中にはたくさんのパーサージェネレーター (YACC、Bison、ANTLR、JavaCC) があり、DSL の文法規則だけをコーディングすることに集中するのに役立ちます。文法規則を解析エンジンとして処理/実行するための低レベルの解析機構を多数提供します。それでも、概念文法を特定のパーサー ジェネレーター (LALR(1)、LL(k)、...) の制限に合わせて曲げる努力をしなければなりません。ANTLR/Bison/Yacc は、ツリーの構築に役立ちます。これを行うには、明示的な作業を行う必要があります。その後は、従来のパーサーを使用してください。ほとんどの人は、そこにたどり着くと、ちょっと驚いてしまいます (ここまで来ると、実際の言語のパーサーは、予想よりも多くの作業を行う傾向があります。
これは、 Life After Parsingがたくさんあるためです: シンボル テーブル、コード分析、コード生成。当社のDMS ソフトウェア リエンジニアリング ツールキットは、文法エンジンからの制約を最小限に抑えて解析ルールを構築できるように設計されています。は自動的にツリーを構築し (ほら、マ、手を使わないでください!)、さまざまな方法でコード変換の多くのサポートを提供します。さらに、DMS は、マッピングを指定するソース/ターゲット パターンのペアを使用して、構造化された方法で DSL (「言語」) フラグメントとターゲット間の変換をサポートするためのパースペクティブとツールを提供します。OP の特定の目的のために、DMS は SQL2011 文法で取得でき、ターゲット パターンを記述するための優れたベースラインを提供します。
ツールを使用した自動変換の詳細については、言語間の翻訳に関する SO のディスカッションを参照してください。
私はあなたと同じようなプロジェクトを持っています。XtextとXtendをチェックする必要があると思います。これらはEclipseで直接使用できるため、インテリセンス、文法、レクサーを簡単に取得できます。私はSQLコードを作成しようとしましたが、これまで成功したプロジェクトでした。
これは使用する言語に大きく依存しますが、Groovy、Ruby、Scala、F#、および Haskell はこれを行うのに適した言語です。
どの言語を使用するかは、どのツールを使用する必要があるかに影響します。
たとえば、C でこれを行うことができますが、より多くの作業が必要になり、ユーザーにとって見栄えがよくない場合があります。
パーサーを支援するためにツールを使用する必要がある言語もあれば、ツールを使用しないほうがよい言語もあります。
この本を読んで、 DSL の主題である DSLs in Actionについてさらに学びたいと思うかもしれません。
仕様を受け入れ、それからトランスレータを生成することを目的としたEliのようなものを探しているようです。
http://eli-project.sourceforge.net/
一方、ANTLRのような優れた生成ツールを使用してパーサーを作成し、ASTとコードジェネレーターを自分でコーディングするのも同じくらい幸せかもしれません。
SQLのような高級言語を書くコード生成は、DSLからの変換が簡単であると仮定すると、おそらく実装するのはそれほど難しくありません。
もし私なら、ocamllexとocamlyaccを使ってOCamlで書くでしょうが、そのためにはまずOCamlを知る必要があります。
適切なメタ言語 (Lisp など) を使用している場合は、レクサー、パーサー、およびコード ジェネレーターは必要ありません。すべてがすでに含まれています - S 式の上に DSL を構築でき、Lisp 自体でコードのホスト部分を生成できます。
DSL に特別な構文が必要な場合でも、パーサーをメタ言語に埋め込むのは非常に簡単です。