2

コンパイラではなく、ドメイン固有の言語にインタプリタを使用しています(パフォーマンスにもかかわらず)。でも、私はいくつかの概念を理解するのに苦労しています:インタプリタはどのようにしてDSLを使用しますか?

は、開発者が容易に建物オブジェクトを作ることができるように、私はゲームのために(XML形式で)DSLがあるとします。

<building> 
    <name> hotel </name> 
    <capacity> 10 </capacity> 
</building> 

DSLスクリプトが解析されます何が起こるのですか?

新しい建物を作成する既存の方法を実行していますか?私が理解しているように、DSLをより低レベルの言語に変換するだけではありません(コンパイルする必要があります)。

誰かが結果として得られた解析済みツリーでどのような解釈をするのか説明してください。

ありがとうございました。

+0

(+1)時にはインタプリタを使用するのが良いことがあり、時にはインタプリタを使用してコンパイラを作成するための中間ステップです。 – umlcat

+0

一部のデータを解析したらどうしますか?まあ、それは、コンパイラー/通訳の答えではなく、ゲーミングな答えよりも。あなたのゲームですでに存在するデータをどのように使いたいのですか? – umlcat

答えて

3

多くの特定のアプリケーションの詳細によって異なります。たとえば、namecapacityが必要ですか?私はかなり一般的な答えを出すつもりですが、それはちょっと残忍かもしれません。

仮定:

  1. すべてのネストされたプロパティは
  2. オプションであり、多くのネストされたプロパティがありますが、おそらく様々な深さ

のこれは2つのアイデアを誘う:再帰下降構文解析として、あなたのインタプリタを構築し、あなたのオブジェクトのためのビルダーのいくつかの並べ替えを使用します。あなたの具体的な例では、(Javaで)のようになりますBuildingBuilderを持っていると思います:あなたのパーサがbuilding要素に遭遇したとき

public class BuildingBuilder { 
    public BuildingBuilder() { ... } 
    public BuildingBuilder setName(String name) { ... return this; } 
    public BuildingBuilder setCapacity(int capacity) { ... return this; } 
    ... 
    public Building build() { ... } 
} 

は今、建物を構築するためにBuildingBuilderを使用しています。次に、そのオブジェクトをDSLが適用するコンテキスト(city.addBuilding(building))に追加します。

namecapacityが網羅的で、常に必要な場合は、2つのパラメータを直接渡して建物を作成することができます。また、ビルダーを使用する代わりにビルドを構築し、プロパティを直接設定することもできます(多くのプロパティがあり、そのプロパティは不変でオプションです)。

これはオブジェクト指向ではないコンテキストでは、ビルドエレメントの現在のコンテキストと内部のxmlを取る何らかの種類のbuildBuilding関数を実装することになります。効果的には、個々の要素の実際の解析を提供するxmlライブラリを手で再帰的な降下パーサを構築しています。

あなたはそれを実装しますが、あなたのDSLのxml要素とインタープリタのメソッド/オブジェクトの間に直接セマンティックなマッピングがあることをお勧めします。

+0

詳細で便利な答えを多くのありがとう:) – FBryant87

+0

これは、SOのためです。私はあなたに警告する必要があります:以前にスクリプト化されたオブジェクトへの参照を許可する場合(後で名前で建物 "ホテル"を参照できる)、便利な検索のためのハッシュテーブルインターフェイスを作成しますが、 。これを行うには、スタックを作成し、各レベルのスコープで新しいハッシュテーブルをスタックにプッシュすることができます。ルックアップに失敗した場合は、次のレベルに進み、もう一度試してください。 – ccoakley