ファンクタパーサ

手書きのパーサを他の Spirit ライブラリと上手く動作するように書く最も簡単な方法は、 単にファンクタパーサを書くことである。

ファンクタパーサは以下のインタフェースを持つことを期待される:

    struct functor
    {
        typedef T result_t;

        template <typename ScannerT>
        int operator()(ScannerT const& scan, result_t& result) const;
    };

ここで typedef T result_t; はパーサの属性型で、これは一致判定の結果に渡し返される (詳細:パーサを参照)。 もしパーサが属性を返す必要がないのなら、 これは単に nil_t にすればよい。 int result はパーサに一致した文字数である。 負の値は一致判定が成功しなかったことを示す。

上記に適合するファンクタパーサを functor_parser テンプレートに包めば、 well formed な Spirit パーサに変換される:

    functor_parser<functor> functor_p;

次の例は functor_parser を動作させる:

    struct number_parser
    {
        typedef int result_t;
        template <typename ScannerT>
        int
        operator()(ScannerT const& scan, result_t& result) const
        {
            if (scan.at_end())
                return -1;

            char ch = *scan;
            if (ch < '0' || ch > '9')
                return -1;

            result = 0;
            int len = 0;

            do
            {
                result = result*10 + int(ch - '0');
                ++len;
                ++scan;
            } while (!scan.at_end() && (ch = *scan, ch >= '0' && ch <= '9'));

            return len;
        }
    };

    functor_parser<number_parser> number_parser_p;

実装についてさらに理解するには、 スキャナ API の詳細のために詳細:スキャナを参照すること。 さてこれで、他の Spirit パーサとちょうど同じように利用できる number_parser_p パーサが得られた。 例:

    r = number_parser_p >> *(',' >> number_parser_p);


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