]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/metaparse/example/regexp/main.cpp
1 // Copyright Abel Sinkovics (abel@sinkovics.hu) 2011.
2 // Distributed under the Boost Software License, Version 1.0.
3 // (See accompanying file LICENSE_1_0.txt or copy at
4 // http://www.boost.org/LICENSE_1_0.txt)
6 #include <boost/metaparse/foldl_reject_incomplete.hpp>
7 #include <boost/metaparse/foldl_reject_incomplete1.hpp>
8 #include <boost/metaparse/lit_c.hpp>
9 #include <boost/metaparse/transform.hpp>
10 #include <boost/metaparse/one_char_except_c.hpp>
11 #include <boost/metaparse/one_of.hpp>
12 #include <boost/metaparse/always_c.hpp>
13 #include <boost/metaparse/build_parser.hpp>
14 #include <boost/metaparse/middle_of.hpp>
15 #include <boost/metaparse/entire_input.hpp>
16 #include <boost/metaparse/string.hpp>
18 #include <boost/detail/iterator.hpp>
19 #include <boost/xpressive/xpressive.hpp>
21 #include <boost/mpl/bool.hpp>
22 #include <boost/mpl/string.hpp>
24 using boost::metaparse::foldl_reject_incomplete
;
25 using boost::metaparse::foldl_reject_incomplete1
;
26 using boost::metaparse::lit_c
;
27 using boost::metaparse::transform
;
28 using boost::metaparse::build_parser
;
29 using boost::metaparse::one_of
;
30 using boost::metaparse::always_c
;
31 using boost::metaparse::middle_of
;
32 using boost::metaparse::one_char_except_c
;
33 using boost::metaparse::entire_input
;
35 using boost::mpl::c_str
;
36 using boost::mpl::true_
;
37 using boost::mpl::false_
;
39 using boost::xpressive::sregex
;
40 using boost::xpressive::as_xpr
;
50 static const sregex value
;
54 const sregex has_value
<T
>::value
= T::run();
56 struct r_epsilon
: has_value
<r_epsilon
>
64 struct r_any_char
: has_value
<r_any_char
>
68 return boost::xpressive::_
;
75 struct apply
: has_value
<apply
<C
> >
79 return as_xpr(C::type::value
);
86 template <class A
, class B
>
87 struct apply
: has_value
<apply
<B
, A
> >
91 return A::type::run() >> B::type::run();
99 * regexp ::= (bracket_expr | non_bracket_expr)*
100 * non_bracket_expr ::= '.' | char_lit
101 * bracket_expr ::= '(' regexp ')'
102 * char_lit ::= any character except: . ( )
106 foldl_reject_incomplete1
<
108 always_c
<'.', r_any_char
>,
109 transform
<one_char_except_c
<'.', '(', ')'>, r_char_lit
>
116 typedef middle_of
<lit_c
<'('>, non_bracket_expr
, lit_c
<')'> > bracket_expr
;
119 foldl_reject_incomplete
<
120 one_of
<bracket_expr
, non_bracket_expr
>,
126 typedef build_parser
<entire_input
<regexp
> > regexp_parser
;
128 void test_string(const std::string
& s
)
130 using boost::xpressive::regex_match
;
131 using boost::xpressive::smatch
;
132 using boost::mpl::apply_wrap1
;
137 #if BOOST_METAPARSE_STD < 2011
138 typedef boost::metaparse::string
<'.','(','b','c',')'> regexp
;
140 typedef BOOST_METAPARSE_STRING(".(bc)") regexp
;
143 const sregex re
= apply_wrap1
<regexp_parser
, regexp
>::type::value
;
147 << s
<< (regex_match(s
, w
, re
) ? " matches " : " doesn't match ")
148 << c_str
<regexp
>::type::value