123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- [/==============================================================================
- 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]
|