| [/============================================================================== |
| 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 Redux - list syntax] |
| |
| |
| So far, we've been using the syntax: |
| |
| double_ >> *(',' >> double_) |
| |
| to parse a comma-delimited list of numbers. Such lists are common in parsing and |
| Spirit provides a simpler shortcut for them. The expression above can be |
| simplified to: |
| |
| double_ % ',' |
| |
| read as: a list of doubles separated by `','`. |
| |
| This sample, again a variation of our previous example, demonstrates just that: |
| |
| 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; |
| |
| auto push_back = [&](auto& ctx){ v.push_back(_attr(ctx)); }; |
| |
| bool r = phrase_parse(first, last, |
| |
| // Begin grammar |
| ( |
| double_[push_back] % ',' |
| ) |
| , |
| // 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/num_list/num_list3.cpp num_list3.cpp] |
| |
| [endsect] |