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