File: num_list4.qbk

package info (click to toggle)
boost1.88 1.88.0-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 576,932 kB
  • sloc: cpp: 4,149,234; xml: 136,789; ansic: 35,092; python: 33,910; asm: 5,698; sh: 4,604; ada: 1,681; makefile: 1,633; pascal: 1,139; perl: 1,124; sql: 640; yacc: 478; ruby: 271; java: 77; lisp: 24; csh: 6
file content (71 lines) | stat: -rw-r--r-- 2,211 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
[/==============================================================================
    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]