| [/============================================================================== |
| Copyright (C) 2001-2010 Joel de Guzman |
| Copyright (C) 2001-2010 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. |
| |
| [import ../../example/qi/sum.cpp] |
| |
| Ok we've glossed over some details in our previous examples. First, our |
| includes: |
| |
| [tutorial_adder_includes] |
| |
| Then some using directives: |
| |
| [tutorial_adder_using] |
| |
| [table |
| [[Namespace] [Description]] |
| [[boost::phoenix] [All of phoenix]] |
| [[boost::spirit] [All of spirit]] |
| [[boost::spirit::qi] [All of spirit.qi]] |
| [[boost::spirit::ascii] [ASCII version of `char_` and all char related parsers. Other |
| encodings are also provided (e.g. also an ISO8859.1)]] |
| [[boost::spirit::arg_names] [Special phoenix placeholders for spirit]] |
| ] |
| |
| [note If you feel uneasy with using whole namespaces, feel free to qualify your |
| code, use namespace aliases, etc. For the purpose of this tutorial, we will be |
| presenting unqualified names for both Spirit and __phoenix__. No worries, we |
| will always present the full working code, so you won't get lost. In fact, all |
| examples in this tutorial have a corresponding cpp file that QuickBook (the |
| documentation tool we are using) imports in here as code snippets.] |
| |
| Now the actual parser: |
| |
| [tutorial_adder] |
| |
| The full cpp file for this example can be found here: [@../../example/qi/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: |
| |
| ref(n) = _1 |
| |
| This assigns the parsed result (actually, the attribute of `double_`) to `n`. |
| `ref(n)` tells __phoenix__ that `n` is a mutable reference. `_1` is a |
| __phoenix__ placeholder for the parsed result attribute. |
| |
| The second `double_` parser attaches this action: |
| |
| ref(n) += _1 |
| |
| So, subsequent numbers add into `n`. |
| |
| That wasn't too bad, was it :-) ? |
| |
| [endsect] |