Boost logo

Boost Users :

Subject: Re: [Boost-users] [spirit] first steps
From: Hartmut Kaiser (hartmut.kaiser_at_[hidden])
Date: 2010-02-18 14:30:20


> > Spirit has a built-in construct for lists:
> >
> > ~*char( ':' ) % ':'
> >
> > If you use attribute parsing you can simply perform the following:
> >
> > std::vector< std::string > list_of_strings;
> >
> > parse( begin, end,
> > ~*char( ':' ) % ':',
> > list_of_strings
> > );
> >
> > Nice huh?
>
> Nice, but IUUC, it won't take into account the type of the elements,
> right?
> I tried to do the following (but it doesn't match the input string):

> template <typename Iterator>
> struct sensor_parser : qi::grammar<Iterator, details::sensor(),
> ascii::space_type>
> {
> sensor_parser() : sensor_parser::base_type(start)
> {
> using qi::int_;
> using qi::lit;
> using qi::double_;
> using qi::lexeme;
> using qi::eol;
> using ascii::char_;
>
> text %= lexeme[+(char_ - ':')];
>
> start %=
> int_ >> ':'
> >> text >> ':'
> >> int_ >> ':'
> >> int_ >> ':'
> >> text >>
> -(':' >> int_) >>
> -(':' >> text) >>
> eol
> ;
> }

Your last 'text' parser eats your '\r\n' characters. As a result the eol parser fails.

Regards Hartmut

---------------
Meet me at BoostCon
www.boostcon.com


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