Home | Libraries | People | FAQ | More |
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
Our parser now is further simplified to:
template <typename Iterator> bool parse_numbers(Iterator first, Iterator last, std::vector<double>& v) { using x3::double_; using x3::phrase_parse; using x3::_attr; 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: num_list4.cpp
Hey, no more actions!!! Now we're entering the realm of attribute grammars. Cool eh?