Boost logo

Boost Users :

From: Pedro Lamarão (pedro.lamarao_at_[hidden])
Date: 2006-01-25 12:30:04


Here follows a simple pattern to use Boost.Spirit to create a
"parseable" object, with a bonus formatted input operator, allowing you
quick access to formatter input for your type.

(Yeah, this stuff needs tweaking for better error handling, etc.)

class foo_thing {
public:

    /* Other methods and stuff. */

    template <typename ForwardIterator>
    boost::spirit::parse_info<IteratorT>
    parse (ForwardIterator begin, ForwardIterator end);

private:

    class grammar;

    /* Data members, etc. */
};

template <typename CharT, typename TraitsT>
std::basic_istream<CharT, TraitsT>&
operator>> (std::basic_istream<CharT, TraitsT>& i, foo_thing& thing) {
    using namespace std;
    using namespace boost::spirit;

    typedef multi_pass<istreambuf_iterator<CharT> > iterator_t;
    iterator_t begin(i);
    iterator_t end = make_multi_pass(istreambuf_iterator<CharT>());

    /* What if thing.parse() throws? */
    parse_info<iterator_t> info = thing.parse(begin, end);
    if (!info.hit)
        i.setstate(ios_base::failbit);

    return i;
}

class foo_thing::grammar : public
boost::spirit::grammar<foo_thing::grammar> {
public:

    grammar (foo_thing& thing) : _M_thing(thing) {}

    template <typename ScannerT>
    class definition;

private:
    foo_thing mutable& _M_thing;
};

template <typename ScannerT>
class foo_thing::grammar::definition {
public:

    /* Define this one; your parser ultimately writes to self._M_thing. */
    definition (foo_thing::grammar const& self);

    boost::spirit::rule<ScannerT> const& start () const;

private:
    /* Populate with rules. */
};

template <typename IteratorT>
boost::spirit::parse_info<IteratorT>
foo_thing::parse (IteratorT begin, IteratorT end) {
    namespace s = boost::spirit;
    grammar g(*this);
    s::parse_info<IteratorT> r = s::parse(begin, end, g);
    return r;
}

-- 
Pedro Lamarão
Desenvolvimento
Intersix Technologies S.A.
SP: (55 11 3803-9300)
RJ: (55 21 3852-3240)
www.intersix.com.br
Your Security is our Business

Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net