構文木を作る その8

えー、昨日のエントリはなしで、、、。
matchのvalueとnode_val_dataのvalueがごっちゃになってました。
結局、Boost.Spiritの構文木の枠組みに合わせて、独自の実装を作成しました。


parse_tree.hpp
parse_tree.hpp


まず、node_val_dataは反復子に依存するデータを持っていないので、反復子のvalue_typeを指定するように変更しました。
これで構文木ノードに依存する処理(構文木の評価など)を分割コンパイルできるようになります。
また、行番号のフィールドを追加して、line_counting_iteratorで初期化する場合に行番号を保存するようにしています。


もう一つの改良点はtree_match_policyでパーサーの戻り値が文字列の場合、スキャナの反復子ではなく、この文字列を使ってノードを初期化するようにしたことです。
これによりエスケープ処理を解釈した後の文字列がノードの値に使われるため、構文木の評価時に何度もパースし直す手間が省けます。
これはスキャナの反復子を保持するnode_iter_data_factoryを使用していては実現できないことです。


まとめると、

  • 構文木のノードの型が固定された
  • 構文木のノードに行番号が追加できた
  • パーサーが返す文字列をそのまま使えるようになった
  • ソースコードをメモリ上に保存しておかなくてもよくなった

といった改良ができたことになります。
今度こそインタプリタをライブラリ側に移動できるはずです。