[#foldr_start_with_parser] [section foldr_start_with_parser] [h1 Synopsis] template struct foldr_start_with_parser; This is a [link parser_combinator parser combinator]. [table Arguments [[Name] [Type]] [[`P`] [[link parser parser]]] [[`StateP`] [[link parser parser]]] [[`BackwardOp`] [[link metafunction_class template metafunction class] taking two arguments]] ] [h1 Description] The same as [link foldr `foldr`], but after folding it applies a parser, `StateP` on the input. If `StateP` fails, `foldr_start_with_parser` fails. If it succeeds, the result of parsing is equivalent to `boost::reverse_fold`, where `Sequence` is the sequence of the results of the applications of `P` and `State` is the result `StateP` returned ['after] the repeated application of `P` on the input. Here is a diagram showing how `foldr_start_with_parser` works by example: using int_token = token; using plus_token = token>; using int_plus = first_of; using sum_op = mpl::lambda>::type; [$images/metaparse/foldr_start_with_parser_diag1.png [width 70%]] Further details can be found in the [link introducing-foldr_start_with_parser Introducing foldr_start_with_parser] section of the [link manual User Manual]. [h1 Header] #include [h1 Expression semantics] For any `p` parser, `pt` class, `f` metafunction class taking two arguments, `s` compile-time string and `pos` source position let `pos_` be the position where the repeated application of `p` on `s` fails for the first time. Let `s_` be the postfix of `s` starting at that position. foldr_start_with_parser::apply is equivalent to pt::apply when the above expression returns a parsing error. It is return_< foldr>::type, f>::apply >::apply< get_remaining>::type, get_position>::type > otherwise. [h1 Example] #include #include #include #include #include #include #include #include #include #include #include using namespace boost::metaparse; using int_token = token; using plus_token = token>; using int_plus = first_of; using sum_op = boost::mpl::lambda>::type; using ints = foldr_start_with_parser; static_assert( get_result< ints::apply >::type::value == 48, "ints should sum the numbers" ); static_assert( is_error>::type::value, "when no numbers are provided, it should be an error" ); [endsect]