DSL / The workings of a parser


The workings of a parser(パーサーの働き)

一言要約

内部DSLと外部DSLを比較すると、パースの方法に違いがあるが、パースは階層的な操作であり、内部DSLは構文木に変換されるため、階層構造という点で類似している。

要約

  • 内部DSLと外部DSLとの違いは、パースにあるが、パースが強力な階層的な操作であることは類似点でもある。
  • テキストをパースするとき、チャンクをツリー構造に整える。
  • 外部DSLの構文:
 events
   doorClosed D1CL
   drawOpened D2OP
 end
  • この複合構造:イベントのリストを含んでいるイベントリストで、各イベントは名前とコードを持つ。
  • 内部DSLの構文:
 event :doorClosed "D1CL"
 event :drawOpened "D2OP"
  • 全体のリストという概念は明白ではないが、階層はあることが読み取れる。
  • このような階層は構文木と呼ばれ、どんなスクリプトも構文木に変換可能。
  • 構文木は、言葉よりも、スクリプトの表現として、はるかに有用。
  • 構文木を使ってセマンティックモデルに変換。実際、構文木をセマンティックモデルとして使用することができる。
  • 多くの場合、構文木はコールスタック上に形成されるため、木をたどる際に処理される枝しか見えず木全体を見ることはないが、コールスタックの影に隠れている構文木を考えてみるのはよい。
  • 内部DSLの場合、この木は、関数(ネストされた関数)の引数および、ネストされたオブジェクト( メソッドチェーン )で 構成される。強く階層表示されない場合、シミュレートが必要。
  • 外部のDSLの使用は、完全な構文木のデータ構造を作成可能。

ファウラーへのフィードバック

担当者のつぶやき

階層構造である点は、一目瞭然だと思いますが、パースや構文木という点で階層構造を捉えるという視点が面白いなと思いました。 前後を読んでいないので、so what?という感想です。


みんなの突っ込み

  • 内部DSLを使う際にも、シンタックスツリーを意識するのは有用だ、というのは確かにその通りだと思いました。内部DSLは明確にはツリー構造が見えづらいので、概念的にはツリー状のものを扱っている、ということを忘れてしまうと、わけがわからなくなってしまいそうです。 -- kentaro714? 2009-10-31 (土) 03:40:58