/*============================================================================= Copyright (c) 2001-2015 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) =============================================================================*/ #include #include #include #include #include namespace x3 = boost::spirit::x3; struct error_handler_base { template x3::error_handler_result on_error( Iterator&, Iterator const& , Exception const& x, Context const& context) const { std::string message = "Error! Expecting: " + x.which() + " here:"; auto& error_handler = x3::get(context).get(); error_handler(x.where(), message); return x3::error_handler_result::fail; } }; struct test_rule_class : x3::annotate_on_success, error_handler_base {}; x3::rule const test_rule; auto const test_rule_def = x3::lit("foo") > x3::lit("bar") > x3::lit("git"); BOOST_SPIRIT_DEFINE(test_rule) void test(std::string const& line_break) { std::string const input("foo" + line_break + " foo" + line_break + "git"); auto const begin = std::begin(input); auto const end = std::end(input); std::stringstream stream; x3::error_handler error_handler{begin, end, stream}; auto const parser = x3::with(std::ref(error_handler))[test_rule]; x3::phrase_parse(begin, end, parser, x3::space); BOOST_TEST_EQ(stream.str(), "In line 2:\nError! Expecting: \"bar\" here:\n foo\n__^_\n"); } int main() { test("\n"); test("\r"); test("\r\n"); return boost::report_errors(); }