DSL
Parsing Data(データ解析) †
一言要約 †
- 解析実行時には、様々なデータを格納する必要があります。不可視なブランチ外の情報が必要なとき、シンボルテーブルはクロスリファレンスの重要なツールです。
要約 †
- 解析を実行する時には、解析に関する様々な細かなデータを格納する必要があります。
- ツリーを走査して構文解析しているときは何時でも、処理しているブランチに関する情報を持つ。しかし、ブランチの外の情報が必要となることもある。
commands
unlockDoor D1UL
end
state idle
actions {unlockDoor}
end
- idle状態のactionでcommand を参照しているが、commandが定義されているブランチとは異なるため、commandオブジェクトを記憶してアクションブランチから参照を解決可能にする必要がある。
- このためにシンボルテーブルを使用する(キーが" unlockDoor "で、値がコマンドを表すオブジェクト)。
- この値はコマンドのセマンティックモデルオブジェクトか、構文木にローカルな中間オブジェクトかもしれない。いずれにせよ、シンボルテーブルは、クロスリファレンスの際の重要なツールです。
- 解析を継続すると、解析結果を維持する必要がある。
- シンボルテーブルを使ったり、情報をコールスタックに保持したり、追加のデータ構造が必要になるときもあるが、全てに共通なのは、結果としてセマンティックモデルオブジェクトを作成すると言うこと。
- しかし、パースの後半までセマンティックモデルのオブジェクトを作成できないため、しばしばConstruction Buildersのような中間的なオブジェクトを作成する必要がある。
- 全てのDSLスクリプトを処理するまでセマンティックモデルオブジェクトの全ての作成を延期するかもしれない。この場合解析は以下の順を辿る。
- DSLスクリプトを読み、中間データを作成する。
- 中間データからセマンティックモデルを作成する。
- 式をパースするとき、式を処理する方法はしばしばコンテキストに依存する。
state idle
actions { unlockDoor }
end
state unlockedPanel
actions { lockDoor }
end
- actions {lockDoor}を処理するとき、これはunlockedPanel状態のコンテキストであり、idle状態のではない。
- パースツリーを調べることでコンテキストを見つけられなければ、これに対処する良い方法としてContext Variableにコンテキストを保持することがある 。
- このContext Variableは、シンボルテーブルのようにセマンティックモデルオブジェクトやいくつかの中間オブジェクトを保持することができます。
- Context Variableを簡単に使用するツールがあるが、一般的に私は可能な限りそれを避ける(使用しない方が理解し易いため)。
ファウラーへのフィードバック †
担当者のつぶやき †
- 勉強不足のため、Construction Builders、セマンティックモデル、Context Variableなどの用語がわからなかった(ぼんやりとこんなものだろうと想像していた。原文はまだ見ていない)。
みんなの突っ込み †
- パースが2つのフェーズに分かれる必要があるかどうかは、意味論モデルがどのように組み立てられる必要があるかに依存する、というのは重要っぽい気がした。 -- kentaro714?