]> git.sesse.net Git - casparcg/blob - dependencies/boost/boost/spirit/home/qi/parse.hpp
Manually merged pull request #222
[casparcg] / dependencies / boost / boost / spirit / home / qi / parse.hpp
1 /*=============================================================================
2     Copyright (c) 2001-2011 Joel de Guzman
3     Copyright (c) 2001-2011 Hartmut Kaiser
4
5     Distributed under the Boost Software License, Version 1.0. (See accompanying
6     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 =============================================================================*/
8 #if !defined(BOOST_SPIRIT_PARSE_APRIL_16_2006_0442PM)
9 #define BOOST_SPIRIT_PARSE_APRIL_16_2006_0442PM
10
11 #if defined(_MSC_VER)
12 #pragma once
13 #endif
14
15 #include <boost/spirit/home/support/context.hpp>
16 #include <boost/spirit/home/support/nonterminal/locals.hpp>
17 #include <boost/spirit/home/qi/detail/parse.hpp>
18 #include <boost/concept_check.hpp>
19
20 namespace boost { namespace spirit { namespace qi
21 {
22     ///////////////////////////////////////////////////////////////////////////
23     template <typename Iterator, typename Expr>
24     inline bool
25     parse(
26         Iterator& first
27       , Iterator last
28       , Expr const& expr)
29     {
30         // Make sure the iterator is at least a forward_iterator. If you got a 
31         // compilation error here, then you are using an input_iterator while
32         // calling this function, you need to supply at least a 
33         // forward_iterator instead.
34         BOOST_CONCEPT_ASSERT((ForwardIterator<Iterator>));
35
36         return detail::parse_impl<Expr>::call(first, last, expr);
37     }
38
39     template <typename Iterator, typename Expr>
40     inline bool
41     parse(
42         Iterator const& first_
43       , Iterator last
44       , Expr const& expr)
45     {
46         Iterator first = first_;
47         return qi::parse(first, last, expr);
48     }
49
50     ///////////////////////////////////////////////////////////////////////////
51     namespace detail
52     {
53         template <typename T>
54         struct make_context
55         {
56             typedef context<fusion::cons<T&>, locals<> > type;
57         };
58
59         template <>
60         struct make_context<unused_type>
61         {
62             typedef unused_type type;
63         };
64     }
65
66     template <typename Iterator, typename Expr, typename Attr>
67     inline bool
68     parse(
69         Iterator& first
70       , Iterator last
71       , Expr const& expr
72       , Attr& attr)
73     {
74         // Make sure the iterator is at least a forward_iterator. If you got a 
75         // compilation error here, then you are using an input_iterator while
76         // calling this function, you need to supply at least a 
77         // forward_iterator instead.
78         BOOST_CONCEPT_ASSERT((ForwardIterator<Iterator>));
79
80         // Report invalid expression error as early as possible.
81         // If you got an error_invalid_expression error message here,
82         // then the expression (expr) is not a valid spirit qi expression.
83         BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Expr);
84
85         typename detail::make_context<Attr>::type context(attr);
86         return compile<qi::domain>(expr).parse(first, last, context, unused, attr);
87     }
88
89     template <typename Iterator, typename Expr, typename Attr>
90     inline bool
91     parse(
92         Iterator const& first_
93       , Iterator last
94       , Expr const& expr
95       , Attr& attr)
96     {
97         Iterator first = first_;
98         return qi::parse(first, last, expr, attr);
99     }
100
101     ///////////////////////////////////////////////////////////////////////////
102     template <typename Iterator, typename Expr, typename Skipper>
103     inline bool
104     phrase_parse(
105         Iterator& first
106       , Iterator last
107       , Expr const& expr
108       , Skipper const& skipper
109       , BOOST_SCOPED_ENUM(skip_flag) post_skip = skip_flag::postskip)
110     {
111         // Make sure the iterator is at least a forward_iterator. If you got a 
112         // compilation error here, then you are using an input_iterator while
113         // calling this function, you need to supply at least a 
114         // forward_iterator instead.
115         BOOST_CONCEPT_ASSERT((ForwardIterator<Iterator>));
116
117         return detail::phrase_parse_impl<Expr>::call(
118             first, last, expr, skipper, post_skip);
119     }
120
121     template <typename Iterator, typename Expr, typename Skipper>
122     inline bool
123     phrase_parse(
124         Iterator const& first_
125       , Iterator last
126       , Expr const& expr
127       , Skipper const& skipper
128       , BOOST_SCOPED_ENUM(skip_flag) post_skip = skip_flag::postskip)
129     {
130         Iterator first = first_;
131         return qi::phrase_parse(first, last, expr, skipper, post_skip);
132     }
133
134     ///////////////////////////////////////////////////////////////////////////
135     template <typename Iterator, typename Expr, typename Skipper, typename Attr>
136     inline bool
137     phrase_parse(
138         Iterator& first
139       , Iterator last
140       , Expr const& expr
141       , Skipper const& skipper
142       , BOOST_SCOPED_ENUM(skip_flag) post_skip
143       , Attr& attr)
144     {
145         // Make sure the iterator is at least a forward_iterator. If you got a 
146         // compilation error here, then you are using an input_iterator while
147         // calling this function, you need to supply at least a 
148         // forward_iterator instead.
149         BOOST_CONCEPT_ASSERT((ForwardIterator<Iterator>));
150
151         // Report invalid expression error as early as possible.
152         // If you got an error_invalid_expression error message here,
153         // then either the expression (expr) or skipper is not a valid
154         // spirit qi expression.
155         BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Expr);
156         BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Skipper);
157
158         typedef
159             typename result_of::compile<qi::domain, Skipper>::type
160         skipper_type;
161         skipper_type const skipper_ = compile<qi::domain>(skipper);
162
163         typename detail::make_context<Attr>::type context(attr);
164         if (!compile<qi::domain>(expr).parse(
165                 first, last, context, skipper_, attr))
166             return false;
167
168         if (post_skip == skip_flag::postskip)
169             qi::skip_over(first, last, skipper_);
170         return true;
171     }
172
173     template <typename Iterator, typename Expr, typename Skipper, typename Attr>
174     inline bool
175     phrase_parse(
176         Iterator const& first_
177       , Iterator last
178       , Expr const& expr
179       , Skipper const& skipper
180       , BOOST_SCOPED_ENUM(skip_flag) post_skip
181       , Attr& attr)
182     {
183         Iterator first = first_;
184         return qi::phrase_parse(first, last, expr, skipper, post_skip, attr);
185     }
186
187     ///////////////////////////////////////////////////////////////////////////
188     template <typename Iterator, typename Expr, typename Skipper, typename Attr>
189     inline bool
190     phrase_parse(
191         Iterator& first
192       , Iterator last
193       , Expr const& expr
194       , Skipper const& skipper
195       , Attr& attr)
196     {
197         return qi::phrase_parse(first, last, expr, skipper, skip_flag::postskip, attr);
198     }
199
200     template <typename Iterator, typename Expr, typename Skipper, typename Attr>
201     inline bool
202     phrase_parse(
203         Iterator const& first_
204       , Iterator last
205       , Expr const& expr
206       , Skipper const& skipper
207       , Attr& attr)
208     {
209         Iterator first = first_;
210         return qi::phrase_parse(first, last, expr, skipper, skip_flag::postskip, attr);
211     }
212 }}}
213
214 #endif
215