123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- /*=============================================================================
- 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 <boost/detail/lightweight_test.hpp>
- #include <boost/spirit/home/x3.hpp>
- #include <boost/spirit/home/x3/support/utility/annotate_on_success.hpp>
- #include <string>
- #include <sstream>
- namespace x3 = boost::spirit::x3;
- struct error_handler_base
- {
- template <typename Iterator, typename Exception, typename Context>
- 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<x3::error_handler_tag>(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<test_rule_class> 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<std::string::const_iterator> error_handler{begin, end, stream};
- auto const parser = x3::with<x3::error_handler_tag>(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();
- }
|