033e52c039
Since X3 promotes x3::variant, we can actually make annotation.hpp generic, avoiding copy-pastism in all the projects that make use of basic error reporting.
45 lines
1.7 KiB
C++
45 lines
1.7 KiB
C++
/*=============================================================================
|
|
Copyright (c) 2001-2014 Joel de Guzman
|
|
|
|
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)
|
|
=============================================================================*/
|
|
#if !defined(BOOST_SPIRIT_X3_CALC9_ERROR_HANDLER_HPP)
|
|
#define BOOST_SPIRIT_X3_CALC9_ERROR_HANDLER_HPP
|
|
|
|
#include <boost/spirit/home/x3.hpp>
|
|
#include <boost/spirit/home/x3/support/utility/error_reporting.hpp>
|
|
#include <boost/spirit/home/x3/support/ast/position_tagged.hpp>
|
|
#include "expression.hpp"
|
|
#include "statement.hpp"
|
|
|
|
namespace client { namespace parser
|
|
{
|
|
namespace x3 = boost::spirit::x3;
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
// Our error handler
|
|
////////////////////////////////////////////////////////////////////////////
|
|
template <typename Iterator>
|
|
using error_handler = x3::error_handler<Iterator>;
|
|
|
|
// tag used to get our error handler from the context
|
|
using error_handler_tag = x3::error_handler_tag;
|
|
|
|
struct error_handler_base
|
|
{
|
|
template <typename Iterator, typename Exception, typename Context>
|
|
x3::error_handler_result on_error(
|
|
Iterator& first, Iterator const& last
|
|
, Exception const& x, Context const& context)
|
|
{
|
|
std::string message = "Error! Expecting: " + x.which() + " here:";
|
|
auto& error_handler = x3::get<error_handler_tag>(context).get();
|
|
error_handler(x.where(), message);
|
|
return x3::error_handler_result::fail;
|
|
}
|
|
};
|
|
}}
|
|
|
|
#endif
|