1 /*============================================================================= 2 Copyright (c) 2001-2010 Joel de Guzman 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 #if !defined(BOOST_SPIRIT_TEST_FEBRUARY_01_2007_0605PM) 8 #define BOOST_SPIRIT_TEST_FEBRUARY_01_2007_0605PM 9 10 #include <boost/spirit/include/qi_parse.hpp> 11 #include <boost/spirit/include/qi_what.hpp> 12 #include <boost/variant/apply_visitor.hpp> 13 #include <iostream> 14 15 namespace spirit_test 16 { 17 template <typename Char, typename Parser> test(Char const * in,Parser const & p,bool full_match=true)18 inline bool test(Char const* in, Parser const& p, bool full_match = true) 19 { 20 // we don't care about the result of the "what" function. 21 // we only care that all parsers have it: 22 boost::spirit::qi::what(p); 23 24 Char const* last = in; 25 while (*last) 26 last++; 27 return boost::spirit::qi::parse(in, last, p) 28 && (!full_match || (in == last)); 29 } 30 31 template <typename Char, typename Parser, typename Skipper> test(Char const * in,Parser const & p,Skipper const & s,bool full_match=true)32 inline bool test(Char const* in, Parser const& p 33 , Skipper const& s, bool full_match = true) 34 { 35 // we don't care about the result of the "what" function. 36 // we only care that all parsers have it: 37 boost::spirit::qi::what(p); 38 39 Char const* last = in; 40 while (*last) 41 last++; 42 return boost::spirit::qi::phrase_parse(in, last, p, s) 43 && (!full_match || (in == last)); 44 } 45 46 template <typename Char, typename Parser, typename Attr> test_attr(Char const * in,Parser const & p,Attr & attr,bool full_match=true)47 inline bool test_attr(Char const* in, Parser const& p 48 , Attr& attr, bool full_match = true) 49 { 50 // we don't care about the result of the "what" function. 51 // we only care that all parsers have it: 52 boost::spirit::qi::what(p); 53 54 Char const* last = in; 55 while (*last) 56 last++; 57 return boost::spirit::qi::parse(in, last, p, attr) 58 && (!full_match || (in == last)); 59 } 60 61 template <typename Char, typename Parser, typename Attr, typename Skipper> test_attr(Char const * in,Parser const & p,Attr & attr,Skipper const & s,bool full_match=true)62 inline bool test_attr(Char const* in, Parser const& p 63 , Attr& attr, Skipper const& s, bool full_match = true) 64 { 65 // we don't care about the result of the "what" function. 66 // we only care that all parsers have it: 67 boost::spirit::qi::what(p); 68 69 Char const* last = in; 70 while (*last) 71 last++; 72 return boost::spirit::qi::phrase_parse(in, last, p, s, attr) 73 && (!full_match || (in == last)); 74 } 75 76 struct printer 77 { 78 typedef boost::spirit::utf8_string string; 79 elementspirit_test::printer80 void element(string const& tag, string const& value, int depth) const 81 { 82 for (int i = 0; i < (depth*4); ++i) // indent to depth 83 std::cout << ' '; 84 85 std::cout << "tag: " << tag; 86 if (value != "") 87 std::cout << ", value: " << value; 88 std::cout << std::endl; 89 } 90 }; 91 print_info(boost::spirit::info const & what)92 inline void print_info(boost::spirit::info const& what) 93 { 94 using boost::spirit::basic_info_walker; 95 96 printer pr; 97 basic_info_walker<printer> walker(pr, what.tag, 0); 98 boost::apply_visitor(walker, what.value); 99 } 100 } 101 102 #endif 103