File: mix_and_match_trees.cpp

package info (click to toggle)
boost1.74 1.74.0-9
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 464,084 kB
  • sloc: cpp: 3,338,324; xml: 131,293; python: 33,088; ansic: 14,336; asm: 4,034; sh: 3,351; makefile: 1,193; perl: 1,036; yacc: 478; php: 212; ruby: 102; lisp: 24; sql: 13; csh: 6
file content (82 lines) | stat: -rw-r--r-- 2,487 bytes parent folder | download | duplicates (12)
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
72
73
74
75
76
77
78
79
80
81
82
//
//  Copyright (c) 2006 Joao Abecasis
//
//  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)
//

////////////////////////////////////////////////////////////////////////////////
//
//  As reported by Jascha Wetzel, in
//  http://article.gmane.org/gmane.comp.parsers.spirit.general/9013, the
//  directives gen_ast_node_d and gen_pt_node_d were not working for lack of
//  appropriate conversion constructors in the underlying tree match policies.
//
////////////////////////////////////////////////////////////////////////////////

#include <boost/spirit/include/classic_core.hpp>
#include <boost/spirit/include/classic_ast.hpp>
#include <boost/spirit/include/classic_parse_tree.hpp>

using namespace BOOST_SPIRIT_CLASSIC_NS;

struct my_grammar : grammar<my_grammar>
{
    template <class Scanner>
    struct definition
    {
        typedef
            scanner<
                typename Scanner::iterator_t,
                scanner_policies<
                    typename Scanner::iteration_policy_t,
                    ast_match_policy<
                        typename Scanner::match_policy_t::iterator_t,
                        typename Scanner::match_policy_t::factory_t
                    >,
                    typename Scanner::action_policy_t
                >
            > ast_scanner;

        typedef
            scanner<
                typename Scanner::iterator_t,
                scanner_policies<
                    typename Scanner::iteration_policy_t,
                    pt_match_policy<
                        typename Scanner::match_policy_t::iterator_t,
                        typename Scanner::match_policy_t::factory_t
                    >,
                    typename Scanner::action_policy_t
                >
            > pt_scanner;

        typedef rule<ast_scanner> ast_rule;
        typedef rule<pt_scanner> pt_rule;
        typedef rule<Scanner> rule_;

        definition(my_grammar const & /* self */)
        {
            start_ = gen_ast_node_d[ ast_rule_ ];
            start_ = gen_pt_node_d[ pt_rule_ ];
        }

        rule_ const & start() const
        {
            return start_;
        }

        rule_ start_;
        ast_rule ast_rule_;
        pt_rule pt_rule_;
    };
};

int main()
{
    const char * begin = NULL, * end = NULL;

    pt_parse(begin, end, my_grammar());
    ast_parse(begin, end, my_grammar());
}