summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/spirit/test/x3/debug.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/spirit/test/x3/debug.cpp')
-rw-r--r--src/boost/libs/spirit/test/x3/debug.cpp144
1 files changed, 144 insertions, 0 deletions
diff --git a/src/boost/libs/spirit/test/x3/debug.cpp b/src/boost/libs/spirit/test/x3/debug.cpp
new file mode 100644
index 00000000..5d3508ac
--- /dev/null
+++ b/src/boost/libs/spirit/test/x3/debug.cpp
@@ -0,0 +1,144 @@
+/*=============================================================================
+ 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)
+=============================================================================*/
+#define BOOST_SPIRIT_X3_DEBUG
+
+#include <boost/detail/lightweight_test.hpp>
+#include <boost/spirit/home/x3.hpp>
+#include <boost/fusion/include/std_pair.hpp>
+#include <boost/fusion/include/vector.hpp>
+
+#include <vector>
+#include <string>
+#include <cstring>
+#include <iostream>
+#include "test.hpp"
+
+struct my_error_handler
+{
+ template <typename Iterator, typename Exception, typename Context>
+ boost::spirit::x3::error_handler_result
+ operator()(Iterator&, Iterator const& last, Exception const& x, Context const&) const
+ {
+ std::cout
+ << "Error! Expecting: "
+ << x.which()
+ << ", got: \""
+ << std::string(x.where(), last)
+ << "\""
+ << std::endl;
+ return boost::spirit::x3::error_handler_result::fail;
+ }
+};
+
+struct my_attribute
+{
+ bool alive = true;
+
+ void access() const
+ {
+ BOOST_TEST(alive);
+ }
+ ~my_attribute()
+ {
+ alive = false;
+ }
+
+ friend std::ostream & operator << (std::ostream & os, my_attribute const & attr)
+ {
+ attr.access();
+ return os << "my_attribute";
+ }
+};
+
+int
+main()
+{
+ using spirit_test::test_attr;
+ using spirit_test::test;
+
+ using namespace boost::spirit::x3::ascii;
+ using boost::spirit::x3::rule;
+ using boost::spirit::x3::symbols;
+ using boost::spirit::x3::int_;
+ using boost::spirit::x3::alpha;
+
+ { // basic tests
+
+ auto a = rule<class a>("a") = 'a';
+ auto b = rule<class b>("b") = 'b';
+ auto c = rule<class c>("c") = 'c';
+
+ {
+ auto start = *(a | b | c);
+ BOOST_TEST(test("abcabcacb", start));
+ }
+
+ {
+ rule<class start> start("start");
+ auto start_def =
+ start = (a | b) >> (start | b);
+
+ BOOST_TEST(test("aaaabababaaabbb", start_def));
+ BOOST_TEST(test("aaaabababaaabba", start_def, false));
+ }
+ }
+
+ { // basic tests w/ skipper
+
+ auto a = rule<class a>("a") = 'a';
+ auto b = rule<class b>("b") = 'b';
+ auto c = rule<class c>("c") = 'c';
+
+ {
+ auto start = *(a | b | c);
+ BOOST_TEST(test(" a b c a b c a c b ", start, space));
+ }
+
+ {
+ rule<class start> start("start");
+ auto start_def =
+ start = (a | b) >> (start | b);
+
+ BOOST_TEST(test(" a a a a b a b a b a a a b b b ", start_def, space));
+ BOOST_TEST(test(" a a a a b a b a b a a a b b a ", start_def, space, false));
+ }
+ }
+
+ { // std::container attributes
+
+ typedef boost::fusion::vector<int, char> fs;
+ rule<class start, std::vector<fs>> start("start");
+ auto start_def =
+ start = *(int_ >> alpha);
+
+ BOOST_TEST(test("1 a 2 b 3 c", start_def, space));
+ }
+
+ { // error handling
+
+ auto r_def = '(' > int_ > ',' > int_ > ')';
+ auto r = r_def.on_error(my_error_handler());
+
+ BOOST_TEST(test("(123,456)", r));
+ BOOST_TEST(!test("(abc,def)", r));
+ BOOST_TEST(!test("(123,456]", r));
+ BOOST_TEST(!test("(123;456)", r));
+ BOOST_TEST(!test("[123,456]", r));
+ }
+
+ {
+ symbols<my_attribute> a{{{ "a", my_attribute{} }}};
+
+ auto b = rule<struct b, my_attribute>("b") = a;
+
+ my_attribute attr;
+
+ BOOST_TEST(test_attr("a", b, attr));
+ }
+
+ return boost::report_errors();
+}