1 /*=============================================================================
2 Copyright (c) 2001-2014 Joel de Guzman
4 Distributed under the Boost Software License, Version 1.0. (See accompanying
5 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 =============================================================================*/
7 #if !defined(BOOST_SPIRIT_X3_PARSE_APRIL_16_2006_0442PM)
8 #define BOOST_SPIRIT_X3_PARSE_APRIL_16_2006_0442PM
10 #include <boost/spirit/home/x3/support/context.hpp>
11 #include <boost/spirit/home/x3/core/parser.hpp>
12 #include <boost/spirit/home/x3/core/skip_over.hpp>
13 #include <boost/concept_check.hpp>
15 namespace boost { namespace spirit { namespace x3
17 ///////////////////////////////////////////////////////////////////////////
18 template <typename Iterator, typename Parser, typename Attribute>
26 // Make sure the iterator is at least a forward_iterator. If you got a
27 // compilation error here, then you are using an input_iterator while
28 // calling this function. You need to supply at least a forward_iterator
30 BOOST_CONCEPT_ASSERT((ForwardIterator<Iterator>));
32 // If you get an error no matching function for call to 'as_parser'
33 // here, then p is not a parser or there is no suitable conversion
34 // from p to a parser.
35 return as_parser(p).parse(first, last, unused, unused, attr);
38 ///////////////////////////////////////////////////////////////////////////
39 template <typename Iterator, typename Parser, typename Attribute>
47 return parse_main(first, last, p, attr);
50 ///////////////////////////////////////////////////////////////////////////
51 template <typename Iterator, typename Parser, typename Attribute>
54 Iterator const& first_
59 Iterator first = first_;
60 return parse_main(first, last, p, attr);
63 ///////////////////////////////////////////////////////////////////////////
64 template <typename Iterator, typename Parser>
71 return parse_main(first, last, p, unused);
74 ///////////////////////////////////////////////////////////////////////////
75 template <typename Iterator, typename Parser>
78 Iterator const& first_
82 Iterator first = first_;
83 return parse_main(first, last, p, unused);
86 ///////////////////////////////////////////////////////////////////////////
89 post_skip, // force post-skipping in phrase_parse()
90 dont_post_skip // inhibit post-skipping in phrase_parse()
93 ///////////////////////////////////////////////////////////////////////////
94 template <typename Iterator, typename Parser, typename Skipper, typename Attribute>
102 , skip_flag post_skip = skip_flag::post_skip)
104 // Make sure the iterator is at least a forward_iterator. If you got a
105 // compilation error here, then you are using an input_iterator while
106 // calling this function. You need to supply at least a forward_iterator
108 BOOST_CONCEPT_ASSERT((ForwardIterator<Iterator>));
110 static_assert(!std::is_same<Skipper, unused_type>::value,
111 "Error! Skipper cannot be unused_type.");
113 // If you get an error no matching function for call to 'as_parser'
114 // here, for either p or s, then p or s is not a parser or there is
115 // no suitable conversion from p to a parser.
116 auto skipper_ctx = make_context<skipper_tag>(as_parser(s));
117 bool r = as_parser(p).parse(first, last, skipper_ctx, unused, attr);
118 if (post_skip == skip_flag::post_skip)
119 x3::skip_over(first, last, skipper_ctx);
123 ///////////////////////////////////////////////////////////////////////////
124 template <typename Iterator, typename Parser, typename Skipper, typename Attribute>
132 , skip_flag post_skip = skip_flag::post_skip)
134 return phrase_parse_main(first, last, p, s, attr, post_skip);
137 ///////////////////////////////////////////////////////////////////////////
138 template <typename Iterator, typename Parser, typename Skipper, typename Attribute>
141 Iterator const& first_
146 , skip_flag post_skip = skip_flag::post_skip)
148 Iterator first = first_;
149 return phrase_parse_main(first, last, p, s, attr, post_skip);
152 ///////////////////////////////////////////////////////////////////////////
153 template <typename Iterator, typename Parser, typename Skipper>
160 , skip_flag post_skip = skip_flag::post_skip)
162 return phrase_parse_main(first, last, p, s, unused, post_skip);
165 ///////////////////////////////////////////////////////////////////////////
166 template <typename Iterator, typename Parser, typename Skipper>
169 Iterator const& first_
173 , skip_flag post_skip = skip_flag::post_skip)
175 Iterator first = first_;
176 return phrase_parse_main(first, last, p, s, unused, post_skip);
179 ///////////////////////////////////////////////////////////////////////////
180 template <typename Skipper>
181 struct phrase_parse_context
184 make_context<skipper_tag>(as_parser(std::declval<Skipper>())))