• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1[#repeated1]
2[section repeated1]
3
4[h1 Synopsis]
5
6  template <class P>
7  struct repeated1;
8
9This is a [link parser_combinator parser combinator].
10
11[table Arguments
12  [[Name] [Type]]
13  [[`P`]  [[link parser parser]]]
14]
15
16[h1 Description]
17
18It applies `P` on the input string repeatedly as long as the parser accepts the
19input. The result of parsing is a sequence of the results of the individual
20applications of `P`.
21
22When `P` rejects the input for the first time, `repeated1` rejects it as well.
23At least one successful application of `P` is required for `repeated1` to accept
24the input.
25
26[h1 Header]
27
28  #include <boost/metaparse/repeated1.hpp>
29
30[h1 Expression semantics]
31
32For any `p` parser the following are equivalent:
33
34  repeated1<p>
35
36  last_of<look_ahead<p>, repeated<p>>
37
38[h1 Example]
39
40  #include <boost/metaparse/repeated1.hpp>
41  #include <boost/metaparse/digit_val.hpp>
42  #include <boost/metaparse/start.hpp>
43  #include <boost/metaparse/string.hpp>
44  #include <boost/metaparse/get_result.hpp>
45  #include <boost/metaparse/is_error.hpp>
46
47  #include <boost/mpl/equal.hpp>
48  #include <boost/mpl/vector.hpp>
49  #include <boost/mpl/int.hpp>
50
51  using namespace boost::metaparse;
52
53  using digits = repeated1<digit_val>;
54
55  static_assert(
56    boost::mpl::equal<
57      get_result<digits::apply<BOOST_METAPARSE_STRING("1234"), start>>::type,
58      boost::mpl::vector<
59        boost::mpl::int_<1>,
60        boost::mpl::int_<2>,
61        boost::mpl::int_<3>,
62        boost::mpl::int_<4>
63      >
64    >::type::value,
65    "the result of parsing should be the list of digit values"
66  );
67
68  static_assert(
69    is_error<digits::apply<BOOST_METAPARSE_STRING("x"), start>>::type::value,
70    "repeated1 should reject the input when it can't parse anything with digit_val"
71  );
72
73[endsect]
74
75