| ファイルイテレータ |
![]() |
![]() |
![]() |
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 はこの要求に適う。 |
![]() |
![]() |
![]() |
Copyright © 2002 Jeff Westfahl
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
最新版ドキュメント(英語)