Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

Click here to view the latest version of this page.
PrevUpHomeNext

Number List Attribute - one more, with style

You've seen that the double_ parser has a double attribute. All parsers have an attribute, even complex parsers. Those that are composed from primitives using operators, like the list parser, also have an attribute. It so happens that the attribute of a list parser:

p % d

is a std::vector of the attribute of p. So, for our parser:

double_ % ','

we'll have an attribute of:

std::vector<double>

So, what does this give us? Well, we can simply pass in a std::vector<double> to our number list parser and it will happily churn out our result in our vector. For that to happen, we'll use a variation of the phrase_parse with an additional argument: the parser's attribute. With the following arguments passed to phrase_parse

  1. An iterator pointing to the start of the input
  2. An iterator pointing to one past the end of the input
  3. The parser object
  4. Another parser called the skip parser
  5. The parser's attribute

our parser now is further simplified to:

template <typename Iterator>
bool parse_numbers(Iterator first, Iterator last, std::vector<double>& v)
{
    using qi::double_;
    using qi::phrase_parse;
    using qi::_1;
    using ascii::space;

    bool r = phrase_parse(first, last,

        //  Begin grammar
        (
            double_ % ','
        )
        ,
        //  End grammar

        space, v);

    if (first != last) // fail if we did not get a full match
        return false;
    return r;
}

The full cpp file for this example can be found here: ../../example/qi/num_list4.cpp

Hey, no more actions!!! Now we're entering the realm of attribute grammars. Cool eh?


PrevUpHomeNext