libcarla/include/system/boost/metaparse/v1/debug_parsing_error.hpp
2024-10-18 13:19:59 +08:00

106 lines
2.8 KiB
C++

#ifndef BOOST_METAPARSE_V1_DEBUG_PARSING_ERROR_HPP
#define BOOST_METAPARSE_V1_DEBUG_PARSING_ERROR_HPP
// Copyright Abel Sinkovics (abel@sinkovics.hu) 2011.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#include <boost/metaparse/v1/fwd/build_parser.hpp>
#include <boost/metaparse/v1/start.hpp>
#include <boost/metaparse/v1/is_error.hpp>
#include <boost/metaparse/v1/get_remaining.hpp>
#include <boost/mpl/if.hpp>
#include <boost/mpl/string.hpp>
#include <iostream>
#include <cstdlib>
namespace boost
{
namespace metaparse
{
namespace v1
{
template <class P, class S>
class debug_parsing_error
{
public:
debug_parsing_error()
{
using std::cout;
using std::endl;
using boost::mpl::c_str;
typedef display<typename P::template apply<S, start>::type> runner;
cout << "Compile-time parsing results" << endl;
cout << "----------------------------" << endl;
cout << "Input text:" << endl;
cout << c_str<S>::type::value << endl;
cout << endl;
runner::run();
std::exit(0);
}
typedef debug_parsing_error type;
private:
template <class Result>
struct display_error
{
static void run()
{
typedef typename Result::type R;
std::cout
<< "Parsing failed:" << std::endl
<< "line " << get_line<typename R::source_position>::type::value
<< ", col " << get_col<typename R::source_position>::type::value
<< ": "
<< R::message::type::get_value() << std::endl;
}
};
template <class Result>
struct display_no_error
{
static void run()
{
using std::cout;
using std::endl;
using boost::mpl::c_str;
typedef typename get_remaining<Result>::type remaining_string;
cout
<< "Parsing was successful. Remaining string is:" << endl
<< c_str<remaining_string>::type::value << endl;
}
};
template <class Result>
struct display :
boost::mpl::if_<
typename is_error<Result>::type,
display_error<Result>,
display_no_error<Result>
>::type
{};
};
// Special case to handle when DebugParsingError is used with build_parser
// (it shouldn't be)
template <class P, class S>
class debug_parsing_error<build_parser<P>, S> :
debug_parsing_error<P, S>
{};
}
}
}
#endif