/*============================================================================= Copyright (c) 2001-2010 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 #include #include #include #include #include #include #include "test.hpp" using spirit_test::test; using spirit_test::test_attr; using boost::spirit::ascii::space_type; using boost::spirit::ascii::space; using boost::spirit::int_; using boost::spirit::qi::grammar; using boost::spirit::qi::rule; using boost::spirit::_val; using boost::spirit::_r1; using boost::spirit::lit; struct num_list : grammar { num_list() : base_type(start) { using boost::spirit::int_; num = int_; start = num >> *(',' >> num); } rule start, num; }; struct inh_g : grammar { inh_g() : base_type(start) { start = lit("inherited")[_val = _r1]; } rule start, num; }; struct my_skipper : grammar { my_skipper() : base_type(start) { start = space; } rule start, num; }; struct num_list2 : grammar { num_list2() : base_type(start) { using boost::spirit::int_; num = int_; start = num >> *(',' >> num); } rule start, num; }; template struct num_list3 : grammar { template num_list3(Class&) : grammar(start) { using boost::spirit::int_; num = int_; start = num >> *(',' >> num); } rule start, num; }; int main() { { // simple grammar test num_list nlist; BOOST_TEST(test("123, 456, 789", nlist, space)); } { // simple grammar test with user-skipper num_list2 nlist; my_skipper skip; BOOST_TEST(test("123, 456, 789", nlist, skip)); } { // direct access to the rules num_list g; BOOST_TEST(test("123", g.num, space)); BOOST_TEST(test("123, 456, 789", g.start, space)); } { // grammar with inherited attributes inh_g g; int n = -1; BOOST_TEST(test_attr("inherited", g.start(123), n, space)); // direct to the rule BOOST_TEST(n == 123); BOOST_TEST(test_attr("inherited", g(123), n, space)); // using the grammar BOOST_TEST(n == 123); } return boost::report_errors(); }