File Iterator

| File Iterator |

Since Spirit is a back-tracking parser, it requires at least a forward iterator. In particular, an input iterator is not sufficient. Many times it is convenient to read the input to a parser from a file, but the STL file iterators are input iterators. To get around this limitation, Spirit has a utility class `file_iterator`, which is a read-only random-access iterator for files.

To use the Spirit file iterator, simple create a file iterator with the path to the file you wish to parse, and then create an EOF iterator for the file:

        #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();

You now have a pair of iterators to use with Spirit . If your parser is fully parametrized (no hard-coded `<char const *>`), it is a simple matter of redefining the iterator type to `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);

Of course, you don't have to deal with the scanner-business at all if you use grammars rather than rules as arguments to the parse functions. You simply pass the iterator pairs and the grammar as is:

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

Generic iterator The Spirit file iterator can be parameterized with any type that is default constructible and assignable. It transparently supports large files (greater than 2GB) on systems that provide an appropriate interface. The file iterator can be useful outside of Spirit as well. For instance, the Boost.Tokenizer package requires a bidirectional iterator, which is provided by file_iterator.

See file_parser.cpp for a compilable example. This is part of the Spirit distribution.

Copyright © 2002 Jeff Westfahl

Use, modification and distribution is subject to the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)