| ファンクタパーサ |
![]() |
![]() |
![]() |
手書きのパーサを他の 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);
![]() |
![]() |
![]() |
Copyright © 1998-2003 Joel de Guzman
Permission to copy, use, modify, sell and distribute this document
is granted provided this copyright notice appears in all copies. This document
is provided "as is" without express or implied warranty, and with
no claim as to its suitability for any purpose.
Japanese Translation Copyright © 2003 Kent.N
オリジナルの、及びこの著作権表示が全ての複製の中に現れる限り、この文書の複製、利用、変更、販売そして配布を認める。このドキュメントは「あるがまま」に提供されており、いかなる明示的、暗黙的保証も行わない。また、いかなる目的に対しても、その利用が適していることを関知しない。
このドキュメントの対象: Boost Version 1.30.0
最新版ドキュメント(英語)