boost::spirit ただの覚え書き

  • pt_parse
    • 構文木に対する処理を文法の実装に対してベタ書きすれば)高速化が望める?
    • 構文木が肥大化する傾向アリ
    • 構文木に対する処理が文法の実装にベタ付くので)文法の変化・拡張に弱い(->idによるruntime dispatchで回避可能.これだとastと一緒か?)
  • ast_parse
    • 文法の変化・拡張に強い
    • 構文木が(pt_parseのそれに比べて)非常にコンパクト
    • ruleのidが取れないのでgrammarとの相性が悪い?(と思ったらそのためのparser_id(parser_tag)なのねん.っていうか,template引数でid指定するということはcompile時dispatchも可能?->さすがにcompile時dispatchは無理ぽだった.考えてみれば当たり前か.でも,id取れることは確認したのでgrammarとも共用でき(゜д゜)ウマーなことには変わりなし)

つくづく良く考えられて,練りこまれていることを思い知らされる・・・
参考までに,上の実験のために使ったdumperのコードを晒しておきます.

template
void dump_tree_node(typename TreeIterator const &ti,
                    std::size_t indent,
                    std::ostream &os)
{
  typedef typename
    std::iterator_traits::value_type
    tree_node;

  std::fill_n(std::ostream_iterator(os), indent, ' ');
  os << ti->value.id().to_long() << "->";
  std::copy(ti->value.begin(),
            ti->value.end(),
            std::ostream_iterator(os));
  os << std::endl;

  for(typename tree_node::const_tree_iterator i = ti->children.begin();
      i != ti->children.end();
      ++i)
  {
    dump_tree_node(i, indent + 2, os);
  }
}

template
void dump_parse_tree(boost::spirit::tree_parse_info const &info,
                     std::ostream &os = std::cout)
{
  dump_tree_node(info.trees.begin(), 0, os);
}

っていうか適当過ぎた.dumpとはいえ,もっと木らしく表示しろってか・・・