Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

transform_error_message

Synopsis

template <class P, class F>
struct transform_error_message;

This is a parser combinator.

Table 84. 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_message will be the result of parsing with P. When it fails, the error P returns is forwarded to the caller of transform_error_message, but the message of it is transformed with F.

Header

#include <boost/metaparse/transform_error_message.hpp>

Expression semantics

For any p parser and f metafunction class accepting one argument

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

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

Example

#include <boost/metaparse/transform_error_message.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/define_error.hpp>
#include <boost/metaparse/reject.hpp>

#include <type_traits>

using namespace boost::metaparse;

BOOST_METAPARSE_DEFINE_ERROR(name_expected, "Name expected");

struct return_name_expected
{
  typedef return_name_expected type;

  template <class>
  struct apply : 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_message<name_token, return_name_expected>
  >;

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