/*============================================================================= Copyright (c) 2001-2003 Joel de Guzman Copyright (c) 2003 Hartmut Kaiser http://spirit.sourceforge.net/ Use, modification and distribution is subject to 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 //#define BOOST_SPIRIT_DEBUG #define BOOST_SPIRIT_SINGLE_GRAMMAR_INSTANCE #include #include using namespace BOOST_SPIRIT_CLASSIC_NS; /////////////////////////////////////////////////////////////////////////////// // This feature is disabled on non compliant compilers (e.g. Borland 5.5.1 // VC6 and VC7) #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && \ !BOOST_WORKAROUND(__BORLANDC__, <= 0x551) && \ !BOOST_WORKAROUND(__GNUC__, < 3) # define BOOST_SPIRIT_USE_GRAMMARDEF #endif ////////////////////////////////////////////////////////////////////////////// // // Grammar tests // /////////////////////////////////////////////////////////////////////////////// struct num_list : public grammar { enum { default_rule = 0, num_rule = 1 }; template struct definition #if defined(BOOST_SPIRIT_USE_GRAMMARDEF) : public grammar_def, same> #endif { definition(num_list const& /*self*/) { num = int_p; r = num >> *(',' >> num); #if defined(BOOST_SPIRIT_USE_GRAMMARDEF) this->start_parsers(r, num); #endif BOOST_SPIRIT_DEBUG_RULE(num); BOOST_SPIRIT_DEBUG_RULE(r); } rule r, num; #if !defined(BOOST_SPIRIT_USE_GRAMMARDEF) rule const& start() const { return r; } #endif }; }; struct num_list_ex : public grammar { enum { default_rule = 0, num_rule = 1, integer_rule = 2 }; template struct definition #if defined(BOOST_SPIRIT_USE_GRAMMARDEF) : public grammar_def, same, int_parser > #endif { definition(num_list_ex const& /*self*/) { num = integer; r = num >> *(',' >> num); #if defined(BOOST_SPIRIT_USE_GRAMMARDEF) this->start_parsers(r, num, integer); #endif BOOST_SPIRIT_DEBUG_RULE(num); BOOST_SPIRIT_DEBUG_RULE(r); } rule r, num; int_parser integer; #if !defined(BOOST_SPIRIT_USE_GRAMMARDEF) rule const& start() const { return r; } #endif }; }; void grammar_tests() { num_list nlist; BOOST_SPIRIT_DEBUG_GRAMMAR(nlist); parse_info pi; pi = parse("123, 456, 789", nlist, space_p); BOOST_TEST(pi.hit); BOOST_TEST(pi.full); #if defined(BOOST_SPIRIT_USE_GRAMMARDEF) num_list_ex nlistex; BOOST_SPIRIT_DEBUG_GRAMMAR(nlistex); pi = parse("123, 456, 789", nlist.use_parser(), space_p); BOOST_TEST(pi.hit); BOOST_TEST(pi.full); pi = parse("123", nlist.use_parser(), space_p); BOOST_TEST(pi.hit); BOOST_TEST(pi.full); pi = parse("123, 456, 789", nlistex, space_p); BOOST_TEST(pi.hit); BOOST_TEST(pi.full); pi = parse("123, 456, 789", nlistex.use_parser(), space_p); BOOST_TEST(pi.hit); BOOST_TEST(pi.full); pi = parse("123", nlistex.use_parser(), space_p); BOOST_TEST(pi.hit); BOOST_TEST(pi.full); pi = parse("123", nlistex.use_parser(), space_p); BOOST_TEST(pi.hit); BOOST_TEST(pi.full); #endif // defined(BOOST_SPIRIT_USE_GRAMMARDEF) } /////////////////////////////////////////////////////////////////////////////// // // Main // /////////////////////////////////////////////////////////////////////////////// int main() { grammar_tests(); return boost::report_errors(); }