ファイルイテレータ

Spirit はバックトラッキングパーサなので、少なくとも前方向イテレータを要求する。 とりわけ入力イテレータは十分ではない。 ファイルから構文解析器に入力を読み込むことはしばしば便利であるが、STLのファイルイテレータは入力イテレータである。 この制限を回避するため、 Spirit はユーティリティクラス file_iterator を持っている。 これはファイルに対する読み込み専用のランダムアクセスイテレータである。

Spirit ファイルイテレータを使うためには、単に構文解析したいファイルへのパスでファイルイテレータを作成し、 それからそのファイルに対する EOF イテレータを作成する:

    #include <boost/spirit/iterator/file_iterator.hpp> // the header file
    file_iterator<> first("input.dat");

    if (!first)
    {
       std::cout << "Unable to open file!\n";

       // Clean up, throw an exception, whatever
       return -1;
    }

    file_iterator<> last = first.make_end();

これで Spirit で使うイテレータの組を手に入れた。 あなたのパーサが完全にパラメータ化されているなら(<char const *>を直書きしていないなら)、 イテレータの型を file_iterator に再定義することは単純な問題である:

    typedef char                    char_t;
    typedef file_iterator <char_t>  iterator_t;
    typedef scanner<iterator_t>     scanner_t;
    typedef rule <scanner_t>        rule_t;

    rule_t my_rule;

    // Define your rule

    parse_info<iterator_t> info = parse(first, last, my_rule);

勿論、スキャナの仕事はまったく扱わなくてよい、 もし parse 関数への引数としてルールよりも文法を用いるのであれば。 単にイテレータの組を渡し、文法はちょうど次のようにする:

    my_grammar g;
    parse_info<iterator_t> info = parse(first, last, g);
ジェネリックイテレータ

Spirit ファイルイテレータは、デフォルト構築可能かつ代入可能であるどんな型にでもパラメータ化できる。 大きなファイル(2GB以上)も、適切なインタフェースを提供するシステムにおいては透過的にサポートする。 ファイルイテレータは Spirit の外でも同様に便利である。 例えば、 Boost.Tokenizer パッケージは双方向イテレータを要求するが、 file_iterator はこの要求に適う。



このドキュメントの対象: Boost Version 1.30.0
最新版ドキュメント(英語)