| [/============================================================================== |
| 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 Complex - Our first complex parser] |
| |
| Well, not really a complex parser, but a parser that parses complex numbers. |
| This time, we're using __phoenix__ to do the semantic actions. |
| |
| Here's a simple parser expression for complex numbers: |
| |
| '(' >> double_ >> -(',' >> double_) >> ')' |
| | double_ |
| |
| What's new? Well, we have: |
| |
| # Alternates: e.g. `a | b`. Try `a` first. If it succeeds, good. If not, try the |
| next alternative, `b`. |
| # Optionals: e.g. -p. Match the parser p zero or one time. |
| |
| The complex parser presented above reads as: |
| |
| * One or two real numbers in parentheses, separated by comma (the second number is optional) |
| * *OR* a single real number. |
| |
| This parser can parse complex numbers of the form: |
| |
| (123.45, 987.65) |
| (123.45) |
| 123.45 |
| |
| [import ../../example/qi/complex_number.cpp] |
| |
| Here goes, this time with actions: |
| |
| [tutorial_complex_number] |
| |
| The full cpp file for this example can be found here: [@../../example/qi/complex_number.cpp] |
| |
| [note Those with experience using __phoenix__ might be confused with the |
| placeholders that we are using (i.e. `_1`, `_2`, etc.). Please be aware |
| that we are not using the same placeholders supplied by Phoenix. Take |
| note that we are pulling in the placeholders from namespace |
| `boost::spirit::qi`. These placeholders are specifically tailored for |
| Spirit.] |
| |
| The `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. |
| |
| [endsect] |