c2d982481e
- Minimal example docs
72 lines
2.2 KiB
Plaintext
72 lines
2.2 KiB
Plaintext
[/==============================================================================
|
|
Copyright (C) 2001-2015 Joel de Guzman
|
|
Copyright (C) 2001-2011 Hartmut Kaiser
|
|
|
|
Distributed under 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)
|
|
===============================================================================/]
|
|
|
|
[section 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`
|
|
|
|
# An iterator pointing to the start of the input
|
|
# An iterator pointing to one past the end of the input
|
|
# The parser object
|
|
# Another parser called the skip parser
|
|
# 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 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:
|
|
[@../../../example/x3/num_list/num_list4.cpp num_list4.cpp]
|
|
|
|
[*Hey, no more actions!!!] Now we're entering the realm of attribute grammars.
|
|
Cool eh?
|
|
|
|
[endsect]
|