c2d982481e
- Minimal example docs
76 lines
2.1 KiB
Plaintext
76 lines
2.1 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 Sum - adding numbers]
|
|
|
|
Here's a parser that sums a comma-separated list of numbers.
|
|
|
|
Ok we've glossed over some details in our previous examples. First, our
|
|
includes:
|
|
|
|
#include <boost/spirit/home/x3.hpp>
|
|
#include <iostream>
|
|
#include <string>
|
|
|
|
Then some using directives:
|
|
|
|
namespace x3 = boost::spirit::x3;
|
|
namespace ascii = boost::spirit::x3::ascii;
|
|
|
|
using x3::double_;
|
|
using ascii::space;
|
|
using x3::_attr;
|
|
|
|
Now the actual parser:
|
|
|
|
template <typename Iterator>
|
|
bool adder(Iterator first, Iterator last, double& n)
|
|
{
|
|
auto assign = [&](auto& ctx){ n = _attr(ctx); };
|
|
auto add = [&](auto& ctx){ n += _attr(ctx); };
|
|
|
|
bool r = x3::phrase_parse(first, last,
|
|
|
|
// Begin grammar
|
|
(
|
|
double_[assign] >> *(',' >> double_[add])
|
|
)
|
|
,
|
|
// End grammar
|
|
|
|
space);
|
|
|
|
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/sum.cpp sum.cpp]
|
|
|
|
This is almost like our original numbers list example. We're incrementally
|
|
building on top of our examples. This time though, like in the complex number
|
|
example, we'll be adding the smarts. There's an accumulator (`double& n`) that
|
|
adds the numbers parsed. On a successful parse, this number is the sum of all
|
|
the parsed numbers.
|
|
|
|
The first `double_` parser attaches this action:
|
|
|
|
[&](auto& ctx){ n = _attr(ctx); }
|
|
|
|
This assigns the parsed result (actually, the attribute of `double_`) to `n`.
|
|
The second `double_` parser attaches this action:
|
|
|
|
[&](auto& ctx){ n += _attr(ctx); }
|
|
|
|
So, subsequent numbers add into `n`.
|
|
|
|
That wasn't too bad, was it :-) ?
|
|
|
|
[endsect]
|