1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- [/==============================================================================
- 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 Attribute - one more, with style]
- You've seen that the `double_` parser has a `double` attribute. All parsers have
- an attribute, even complex parsers. Those that are composed from primitives
- using operators, like the list parser, also have an attribute. It so happens that
- the attribute of a list parser:
- p % d
- is a `std::vector` of the attribute of `p`. So, for our parser:
- double_ % ','
- we'll have an attribute of:
- std::vector<double>
- So, what does this give us? Well, we can simply pass in a `std::vector<double>`
- to our number list parser and it will happily churn out our result in our
- vector. For that to happen, we'll use a variation of the `phrase_parse` with
- an additional argument: the parser's attribute. With the following arguments
- passed to `phrase_parse`
- # An iterator pointing to the start of the input
- # An iterator pointing to one past the end of the input
- # The parser object
- # Another parser called the skip parser
- # The parser's attribute
- Our parser now is further simplified to:
- 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;
- bool r = phrase_parse(first, last,
- // Begin grammar
- (
- double_ % ','
- )
- ,
- // End grammar
- space, v);
- 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_list4.cpp num_list4.cpp]
- [*Hey, no more actions!!!] Now we're entering the realm of attribute grammars.
- Cool eh?
- [endsect]
|