1// Copyright (c) 2001-2010 Hartmut Kaiser
2// Copyright (c) 2011 Laurent Gomila
3//
4// Distributed under the Boost Software License, Version 1.0. (See accompanying
5// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6
7#include <boost/spirit/include/qi.hpp>
8#include <boost/phoenix/operator.hpp>
9#include <boost/spirit/include/support_multi_pass.hpp>
10#include <boost/core/lightweight_test.hpp>
11#include <sstream>
12#include <iostream>
13#include <iterator>
14#include <string>
15
16using namespace boost::spirit;
17using namespace boost;
18
19int main()
20{
21 {
22 std::string input("5x");
23 std::istringstream iss(input);
24
25 typedef std::istreambuf_iterator<char> base_iterator_type;
26 typedef multi_pass<base_iterator_type> iterator_type;
27
28 iterator_type first = make_default_multi_pass(i: base_iterator_type(iss));
29 iterator_type last = make_default_multi_pass(i: base_iterator_type());
30
31 std::ostringstream oss;
32
33 qi::rule<iterator_type> r = qi::int_ > qi::int_;
34 qi::on_error<qi::fail>(r, f: phoenix::ref(t&: oss) << phoenix::val(t: "error"));
35
36 BOOST_TEST(!qi::parse(first, last, r));
37 BOOST_TEST(oss.str() == "error");
38 }
39
40 {
41 std::string input("5x");
42 std::istringstream iss(input);
43
44 typedef std::istreambuf_iterator<char> base_iterator_type;
45 typedef multi_pass<base_iterator_type> iterator_type;
46
47 iterator_type first = make_default_multi_pass(i: base_iterator_type(iss));
48 iterator_type last = make_default_multi_pass(i: base_iterator_type());
49
50 std::ostringstream oss;
51
52 qi::rule<iterator_type> r1 = qi::int_ > qi::int_;
53 qi::rule<iterator_type> r2 = qi::int_ > qi::char_;
54 qi::on_error<qi::fail>(r&: r1, f: phoenix::ref(t&: oss) << phoenix::val(t: "error in r1"));
55 qi::on_error<qi::fail>(r&: r2, f: phoenix::ref(t&: oss) << phoenix::val(t: "error in r2"));
56
57 BOOST_TEST(qi::parse(first, last, r1 | r2));
58 BOOST_TEST(oss.str() == "error in r1");
59 }
60
61 return boost::report_errors();
62}
63
64

source code of boost/libs/spirit/test/support/multi_pass_error_handler.cpp