Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

transform_error

Synopsis

template <class P, class F>
struct transform_error;

This is a parser combinator.

Table 85. Arguments

Name

Type

P

parser

F

template metafunction class taking one argument


Description

It parses the input with P. When this succeeds, the result of parsing with transform_error will be the result of parsing with P. When it fails, F is evaluated with the error P returned as argument. Parsing with transform_error will fail and the error will be what F returns. Therefore, F is expected to accept and return a reject value.

Header

#include <boost/metaparse/transform_error.hpp>

Expression semantics

For any p parser and f metafunction class accepting one argument

transform_error<p, f>::apply<s, pos>

is equivalent to p::apply<s, pos> when p accepts the input. It is equivalent to f::apply<p::apply<s, pos>::type> otherwise.

Example

#include <boost/metaparse/transform_error.hpp>
#include <boost/metaparse/repeated1.hpp>
#include <boost/metaparse/letter.hpp>
#include <boost/metaparse/keyword.hpp>
#include <boost/metaparse/last_of.hpp>
#include <boost/metaparse/token.hpp>
#include <boost/metaparse/string.hpp>
#include <boost/metaparse/is_error.hpp>
#include <boost/metaparse/start.hpp>
#include <boost/metaparse/get_message.hpp>
#include <boost/metaparse/get_position.hpp>
#include <boost/metaparse/define_error.hpp>
#include <boost/metaparse/reject.hpp>

#include <boost/mpl/lambda.hpp>

#include <type_traits>

using namespace boost::metaparse;

BOOST_METAPARSE_DEFINE_ERROR(name_expected, "Name expected");

using keyword_name = token<keyword<BOOST_METAPARSE_STRING("name")>>;
using name_token = token<repeated1<letter>>;

using name_parser =
  last_of<
    keyword_name,
    transform_error<
      name_token,
      boost::mpl::lambda<
        reject<name_expected, get_position<boost::mpl::_1> >
      >::type
    >
  >;

static_assert(
  !is_error<
    name_parser::apply<BOOST_METAPARSE_STRING("name Bela"), start>
  >::type::value,
  "name_parser should accept \"name <a name>\""
);

static_assert(
  is_error<
    name_parser::apply<BOOST_METAPARSE_STRING("name ?"), start>
  >::type::value,
  "name_parser should reject input when name is a question mark"
);

static_assert(
  std::is_same<
    get_message<
      name_parser::apply<BOOST_METAPARSE_STRING("name ?"), start>
    >::type,
    name_expected
  >::type::value,
  "the error message should be the one specified by change_error_message"
);

PrevUpHomeNext