1 /*=============================================================================
2 Copyright (c) 1998-2003 Joel de Guzman
3 http://spirit.sourceforge.net/
5 Use, modification and distribution is subject to the Boost Software
6 License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
7 http://www.boost.org/LICENSE_1_0.txt)
8 ============================================================================*/
9 #if !defined(BOOST_SPIRIT_SKIPPER_IPP)
10 #define BOOST_SPIRIT_SKIPPER_IPP
12 ///////////////////////////////////////////////////////////////////////////////
13 namespace boost { namespace spirit {
15 BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
18 template <typename BaseT>
19 struct no_skipper_iteration_policy;
23 template <typename ST, typename ScannerT, typename BaseT>
28 skipper_iteration_policy<BaseT> const&)
30 typedef scanner_policies<
31 no_skipper_iteration_policy<
32 BOOST_DEDUCED_TYPENAME ScannerT::iteration_policy_t>,
33 BOOST_DEDUCED_TYPENAME ScannerT::match_policy_t,
34 BOOST_DEDUCED_TYPENAME ScannerT::action_policy_t
37 scanner<BOOST_DEDUCED_TYPENAME ScannerT::iterator_t, policies_t>
38 scan2(scan.first, scan.last, policies_t(scan));
39 typedef typename ScannerT::iterator_t iterator_t;
43 iterator_t save = scan.first;
52 template <typename ST, typename ScannerT, typename BaseT>
57 no_skipper_iteration_policy<BaseT> const&)
61 typedef typename ScannerT::iterator_t iterator_t;
62 iterator_t save = scan.first;
71 template <typename ST, typename ScannerT>
76 iteration_policy const&)
80 typedef typename ScannerT::iterator_t iterator_t;
81 iterator_t save = scan.first;
90 template <typename SkipT>
93 template <typename IteratorT, typename ParserT>
94 static parse_info<IteratorT>
96 IteratorT const& first_,
97 IteratorT const& last,
101 typedef skip_parser_iteration_policy<SkipT> iter_policy_t;
102 typedef scanner_policies<iter_policy_t> scanner_policies_t;
103 typedef scanner<IteratorT, scanner_policies_t> scanner_t;
105 iter_policy_t iter_policy(skip);
106 scanner_policies_t policies(iter_policy);
107 IteratorT first = first_;
108 scanner_t scan(first, last, policies);
109 match<nil_t> hit = p.parse(scan);
110 return parse_info<IteratorT>(
111 first, hit, hit && (first == last),
117 struct phrase_parser<space_parser>
119 template <typename IteratorT, typename ParserT>
120 static parse_info<IteratorT>
122 IteratorT const& first_,
123 IteratorT const& last,
127 typedef skipper_iteration_policy<> iter_policy_t;
128 typedef scanner_policies<iter_policy_t> scanner_policies_t;
129 typedef scanner<IteratorT, scanner_policies_t> scanner_t;
131 IteratorT first = first_;
132 scanner_t scan(first, last);
133 match<nil_t> hit = p.parse(scan);
134 return parse_info<IteratorT>(
135 first, hit, hit && (first == last),
141 ///////////////////////////////////////////////////////////////////////////
143 // Free parse functions using the skippers
145 ///////////////////////////////////////////////////////////////////////////
146 template <typename IteratorT, typename ParserT, typename SkipT>
147 inline parse_info<IteratorT>
149 IteratorT const& first,
150 IteratorT const& last,
151 parser<ParserT> const& p,
152 parser<SkipT> const& skip)
154 return impl::phrase_parser<SkipT>::
155 parse(first, last, p.derived(), skip.derived());
158 ///////////////////////////////////////////////////////////////////////////
160 // Parse function for null terminated strings using the skippers
162 ///////////////////////////////////////////////////////////////////////////
163 template <typename CharT, typename ParserT, typename SkipT>
164 inline parse_info<CharT const*>
167 parser<ParserT> const& p,
168 parser<SkipT> const& skip)
170 CharT const* last = str;
173 return parse(str, last, p, skip);
176 BOOST_SPIRIT_CLASSIC_NAMESPACE_END
178 }} // namespace boost::spirit