| ファンクタパーサ |
![]() |
![]() |
![]() |
あなたが手書きしたパーサを、残りの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はあなたのパーサにマッチしたマッチング文字の数である。 負の値は成功しなかったマッチを示す(flag)。
適合する(confirming)ファンクタパーサは、 functor_parser テンプレートの中にラッピングすることによって、 well formed な Spirit パーサに変換される(transform):
functor_parser<functor> functor_p;
次の例はfunctor_parserを動作させる(puts the f... into the action):
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
最新版ドキュメント(英語)