23

私は、いくつかの高級言語にコンパイルしたい非常に複雑なDSLに取り組んでいます。全体のプロセスは学習体験でした。コンパイラはJavaで書かれています。

コードジェネレーター部分の設計のベストプラクティスを誰かが知っているかどうか疑問に思いました。私は現在、すべてを抽象構文木に解析しています。

テンプレートシステムを使うことを考えていましたが、スタックオーバーフローから最初にいくつかの知恵を聞きたいので、まだその方向性をあまり研究していません。

ありがとう!

4

3 に答える 3

11

プログラミング言語のクラスでこれを行っていたとき、ビジターパターンに従うことに基づいてエミッターを使用することになりました。それはかなりうまく機能しました-あなたのASTがあなたがかなりよく印刷しているものと一致する限り、それを新しい出力言語に再ターゲットすることを非常に簡単にします。

于 2010-02-04T18:06:57.553 に答える
7

本当に必要なのは、ある言語(DSL)の構文構造を他の言語の構文パターンにマップするプログラム変換システムです。このようなツールは、コード生成プロジェクト中に任意の変換を実行できます(ツリーの書き換えは、完全なTuring対応のポストシステムである文字列の書き換えを一般化します)。つまり、生成するものと生成プロセスの高度さは、野心によってのみ決定されます。 、「コードジェネレータフレームワーク」プロパティではありません。

洗練されたプログラム変換システムは、さまざまなタイプのスコーピング、フロー分析、および/またはカスタムアナライザーを組み合わせて変換を可能にします。これは理論的な力を追加しませんが、多くの実用的な力を追加します。ほとんどの実際の言語(DSLでさえ)には名前空間、制御とデータフローがあり、型推論などが必要です。

当社のDMSソフトウェアリエンジニアリングツールキットは、このタイプの変換システムです。これは、従来の言語とDSLの両方、単純な言語と複雑な言語、および小規模、大規模、さらには巨大なソフトウェアシステムの分析/変換に使用されてきました。

「ASTを他の言語に変換する」に関するOPのコメントに関連します。これは、DSLの表面構文(DSLのASTの舞台裏で実装)をターゲット言語の表面構文(ターゲットを使用して実装)にマップする変換を記述することによってDMSによって実現されます。言語AST)。結果として得られるターゲット言語ASTは、DMSによって自動的にきれいに印刷され、ターゲットASTに対応するターゲット言語の実際のソースコードを提供します。

于 2010-02-06T01:03:09.910 に答える
4

すでにANTLRを使用していて、ASTの準備ができている場合は、StringTemplateを確認することをお勧めします: http ://www.antlr.org/wiki/display/ST/StringTemplate+Documentation

また、決定的なANTLRリファレンスのセクション9.6 :ドメイン固有言語の構築はこれを説明しています:http: //www.pragprog.com/titles/tpantlr/the-definitive-antlr-reference

無料のコードサンプルは、http://media.pragprog.com/titles/tpantlr/code/tpantlr-code.tgzで入手できます。サブフォルダcode\templates \ generator \ 2pass \には、数式をJavaバイトコードに変換する例があります。

于 2010-05-28T10:16:49.450 に答える