1 | /*=============================================================================
|
---|
2 | Copyright (c) 1998-2003 Joel de Guzman
|
---|
3 | Copyright (c) 2003 Vaclav Vesely
|
---|
4 | http://spirit.sourceforge.net/
|
---|
5 |
|
---|
6 | Use, modification and distribution is subject to the Boost Software
|
---|
7 | License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
---|
8 | http://www.boost.org/LICENSE_1_0.txt)
|
---|
9 | =============================================================================*/
|
---|
10 | #if !defined(BOOST_SPIRIT_NO_ACTIONS_HPP)
|
---|
11 | #define BOOST_SPIRIT_NO_ACTIONS_HPP
|
---|
12 |
|
---|
13 | #include <boost/spirit/core/parser.hpp>
|
---|
14 | #include <boost/spirit/core/composite/composite.hpp>
|
---|
15 | #include <boost/spirit/core/non_terminal/rule.hpp>
|
---|
16 |
|
---|
17 | namespace boost {
|
---|
18 | namespace spirit {
|
---|
19 | //-----------------------------------------------------------------------------
|
---|
20 | // no_actions_action_policy
|
---|
21 |
|
---|
22 | template<typename BaseT = action_policy>
|
---|
23 | struct no_actions_action_policy:
|
---|
24 | public BaseT
|
---|
25 | {
|
---|
26 | typedef BaseT base_t;
|
---|
27 |
|
---|
28 | no_actions_action_policy():
|
---|
29 | BaseT()
|
---|
30 | {}
|
---|
31 |
|
---|
32 | template<typename PolicyT>
|
---|
33 | no_actions_action_policy(PolicyT const& other):
|
---|
34 | BaseT(other)
|
---|
35 | {}
|
---|
36 |
|
---|
37 | template<typename ActorT, typename AttrT, typename IteratorT>
|
---|
38 | void
|
---|
39 | do_action(
|
---|
40 | ActorT const& actor,
|
---|
41 | AttrT& val,
|
---|
42 | IteratorT const& first,
|
---|
43 | IteratorT const& last) const
|
---|
44 | {}
|
---|
45 | };
|
---|
46 |
|
---|
47 | //-----------------------------------------------------------------------------
|
---|
48 | // no_actions_scanner
|
---|
49 |
|
---|
50 | template<typename ScannerT = scanner<> >
|
---|
51 | struct no_actions_scanner
|
---|
52 | {
|
---|
53 | typedef scanner_policies<
|
---|
54 | typename ScannerT::iteration_policy_t,
|
---|
55 | typename ScannerT::match_policy_t,
|
---|
56 | no_actions_action_policy<typename ScannerT::action_policy_t>
|
---|
57 | > policies_t;
|
---|
58 |
|
---|
59 | typedef typename
|
---|
60 | rebind_scanner_policies<ScannerT, policies_t>::type type;
|
---|
61 | };
|
---|
62 |
|
---|
63 | #if BOOST_SPIRIT_RULE_SCANNERTYPE_LIMIT > 1
|
---|
64 |
|
---|
65 | template<typename ScannerT = scanner<> >
|
---|
66 | struct no_actions_scanner_list
|
---|
67 | {
|
---|
68 | typedef
|
---|
69 | scanner_list<
|
---|
70 | ScannerT,
|
---|
71 | typename no_actions_scanner<ScannerT>::type
|
---|
72 | >
|
---|
73 | type;
|
---|
74 | };
|
---|
75 |
|
---|
76 | #endif // BOOST_SPIRIT_RULE_SCANNERTYPE_LIMIT > 1
|
---|
77 |
|
---|
78 | //-----------------------------------------------------------------------------
|
---|
79 | // no_actions_parser
|
---|
80 |
|
---|
81 | struct no_actions_parser_gen;
|
---|
82 |
|
---|
83 | template<typename ParserT>
|
---|
84 | struct no_actions_parser:
|
---|
85 | public unary<ParserT, parser<no_actions_parser<ParserT> > >
|
---|
86 | {
|
---|
87 | typedef no_actions_parser<ParserT> self_t;
|
---|
88 | typedef unary_parser_category parser_category_t;
|
---|
89 | typedef no_actions_parser_gen parser_generator_t;
|
---|
90 | typedef unary<ParserT, parser<self_t> > base_t;
|
---|
91 |
|
---|
92 | template<typename ScannerT>
|
---|
93 | struct result
|
---|
94 | {
|
---|
95 | typedef typename parser_result<ParserT, ScannerT>::type type;
|
---|
96 | };
|
---|
97 |
|
---|
98 | no_actions_parser(ParserT const& p)
|
---|
99 | : base_t(p)
|
---|
100 | {}
|
---|
101 |
|
---|
102 | template<typename ScannerT>
|
---|
103 | typename result<ScannerT>::type
|
---|
104 | parse(ScannerT const& scan) const
|
---|
105 | {
|
---|
106 | typedef typename no_actions_scanner<ScannerT>::policies_t policies_t;
|
---|
107 |
|
---|
108 | return this->subject().parse(scan.change_policies(policies_t(scan)));
|
---|
109 | }
|
---|
110 | };
|
---|
111 |
|
---|
112 | //-----------------------------------------------------------------------------
|
---|
113 | // no_actions_parser_gen
|
---|
114 |
|
---|
115 | struct no_actions_parser_gen
|
---|
116 | {
|
---|
117 | template<typename ParserT>
|
---|
118 | struct result
|
---|
119 | {
|
---|
120 | typedef no_actions_parser<ParserT> type;
|
---|
121 | };
|
---|
122 |
|
---|
123 | template<typename ParserT>
|
---|
124 | static no_actions_parser<ParserT>
|
---|
125 | generate(parser<ParserT> const& subject)
|
---|
126 | {
|
---|
127 | return no_actions_parser<ParserT>(subject.derived());
|
---|
128 | }
|
---|
129 |
|
---|
130 | template<typename ParserT>
|
---|
131 | no_actions_parser<ParserT>
|
---|
132 | operator[](parser<ParserT> const& subject) const
|
---|
133 | {
|
---|
134 | return no_actions_parser<ParserT>(subject.derived());
|
---|
135 | }
|
---|
136 | };
|
---|
137 |
|
---|
138 | //-----------------------------------------------------------------------------
|
---|
139 | // no_actions_d
|
---|
140 |
|
---|
141 | const no_actions_parser_gen no_actions_d = no_actions_parser_gen();
|
---|
142 |
|
---|
143 | //-----------------------------------------------------------------------------
|
---|
144 | } // namespace spirit
|
---|
145 | } // namespace boost
|
---|
146 |
|
---|
147 | #endif // !defined(BOOST_SPIRIT_NO_ACTIONS_HPP)
|
---|