654 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			654 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | /*============================================================================= | ||
|  |     Copyright (c) 1998-2003 Joel de Guzman | ||
|  |     Copyright (c) 2003 Martin Wille | ||
|  |     http://spirit.sourceforge.net/ | ||
|  | 
 | ||
|  |   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) | ||
|  | =============================================================================*/ | ||
|  | #if !defined(BOOST_SPIRIT_PRIMITIVES_HPP) | ||
|  | #define BOOST_SPIRIT_PRIMITIVES_HPP | ||
|  | 
 | ||
|  | #include <boost/ref.hpp> | ||
|  | #include <boost/spirit/home/classic/namespace.hpp> | ||
|  | #include <boost/spirit/home/classic/core/assert.hpp> | ||
|  | #include <boost/spirit/home/classic/core/parser.hpp> | ||
|  | #include <boost/spirit/home/classic/core/composite/impl/directives.ipp> | ||
|  | #include <boost/spirit/home/classic/core/primitives/impl/primitives.ipp> | ||
|  | 
 | ||
|  | #ifdef BOOST_MSVC | ||
|  | #pragma warning (push) | ||
|  | #pragma warning(disable : 4512) | ||
|  | #endif | ||
|  | 
 | ||
|  | namespace boost { namespace spirit { | ||
|  | 
 | ||
|  | BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     // | ||
|  |     //  char_parser class | ||
|  |     // | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     template <typename DerivedT> | ||
|  |     struct char_parser : public parser<DerivedT> | ||
|  |     { | ||
|  |         typedef DerivedT self_t; | ||
|  |         template <typename ScannerT> | ||
|  |         struct result | ||
|  |         { | ||
|  |             typedef typename match_result< | ||
|  |                 ScannerT, | ||
|  |                 typename ScannerT::value_t | ||
|  |             >::type type; | ||
|  |         }; | ||
|  | 
 | ||
|  |         template <typename ScannerT> | ||
|  |         typename parser_result<self_t, ScannerT>::type | ||
|  |         parse(ScannerT const& scan) const | ||
|  |         { | ||
|  |             typedef typename ScannerT::value_t value_t; | ||
|  |             typedef typename ScannerT::iterator_t iterator_t; | ||
|  | 
 | ||
|  |             if (!scan.at_end()) | ||
|  |             { | ||
|  |                 value_t ch = *scan; | ||
|  |                 if (this->derived().test(ch)) | ||
|  |                 { | ||
|  |                     iterator_t save(scan.first); | ||
|  |                     ++scan.first; | ||
|  |                     return scan.create_match(1, ch, save, scan.first); | ||
|  |                 } | ||
|  |             } | ||
|  |             return scan.no_match(); | ||
|  |         } | ||
|  |     }; | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     // | ||
|  |     //  negation of char_parsers | ||
|  |     // | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     template <typename PositiveT> | ||
|  |     struct negated_char_parser | ||
|  |     : public char_parser<negated_char_parser<PositiveT> > | ||
|  |     { | ||
|  |         typedef negated_char_parser<PositiveT> self_t; | ||
|  |         typedef PositiveT positive_t; | ||
|  | 
 | ||
|  |         negated_char_parser(positive_t const& p) | ||
|  |         : positive(p.derived()) {} | ||
|  | 
 | ||
|  |         template <typename T> | ||
|  |         bool test(T ch) const | ||
|  |         { | ||
|  |             return !positive.test(ch); | ||
|  |         } | ||
|  | 
 | ||
|  |         positive_t const positive; | ||
|  |     }; | ||
|  | 
 | ||
|  |     template <typename ParserT> | ||
|  |     inline negated_char_parser<ParserT> | ||
|  |     operator~(char_parser<ParserT> const& p) | ||
|  |     { | ||
|  |         return negated_char_parser<ParserT>(p.derived()); | ||
|  |     } | ||
|  | 
 | ||
|  |     template <typename ParserT> | ||
|  |     inline ParserT | ||
|  |     operator~(negated_char_parser<ParserT> const& n) | ||
|  |     { | ||
|  |         return n.positive; | ||
|  |     } | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     // | ||
|  |     //  chlit class | ||
|  |     // | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     template <typename CharT = char> | ||
|  |     struct chlit : public char_parser<chlit<CharT> > | ||
|  |     { | ||
|  |         chlit(CharT ch_) | ||
|  |         : ch(ch_) {} | ||
|  | 
 | ||
|  |         template <typename T> | ||
|  |         bool test(T ch_) const | ||
|  |         { | ||
|  |             return ch_ == ch; | ||
|  |         } | ||
|  | 
 | ||
|  |         CharT   ch; | ||
|  |     }; | ||
|  | 
 | ||
|  |     template <typename CharT> | ||
|  |     inline chlit<CharT> | ||
|  |     ch_p(CharT ch) | ||
|  |     { | ||
|  |         return chlit<CharT>(ch); | ||
|  |     } | ||
|  | 
 | ||
|  |     // This should take care of ch_p("a") "bugs" | ||
|  |     template <typename CharT, std::size_t N> | ||
|  |     inline chlit<CharT> | ||
|  |     ch_p(CharT const (& str)[N]) | ||
|  |     { | ||
|  |         //  ch_p's argument should be a single character or a null-terminated | ||
|  |         //  string with a single character | ||
|  |         BOOST_STATIC_ASSERT(N < 3); | ||
|  |         return chlit<CharT>(str[0]); | ||
|  |     } | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     // | ||
|  |     //  range class | ||
|  |     // | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     template <typename CharT = char> | ||
|  |     struct range : public char_parser<range<CharT> > | ||
|  |     { | ||
|  |         range(CharT first_, CharT last_) | ||
|  |         : first(first_), last(last_) | ||
|  |         { | ||
|  |             BOOST_SPIRIT_ASSERT(!(last < first)); | ||
|  |         } | ||
|  | 
 | ||
|  |         template <typename T> | ||
|  |         bool test(T ch) const | ||
|  |         { | ||
|  |             return !(CharT(ch) < first) && !(last < CharT(ch)); | ||
|  |         } | ||
|  | 
 | ||
|  |         CharT   first; | ||
|  |         CharT   last; | ||
|  |     }; | ||
|  | 
 | ||
|  |     template <typename CharT> | ||
|  |     inline range<CharT> | ||
|  |     range_p(CharT first, CharT last) | ||
|  |     { | ||
|  |         return range<CharT>(first, last); | ||
|  |     } | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     // | ||
|  |     //  chseq class | ||
|  |     // | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     template <typename IteratorT = char const*> | ||
|  |     class chseq : public parser<chseq<IteratorT> > | ||
|  |     { | ||
|  |     public: | ||
|  | 
 | ||
|  |         typedef chseq<IteratorT> self_t; | ||
|  | 
 | ||
|  |         chseq(IteratorT first_, IteratorT last_) | ||
|  |         : first(first_), last(last_) {} | ||
|  | 
 | ||
|  |         chseq(IteratorT first_) | ||
|  |         : first(first_), last(impl::get_last(first_)) {} | ||
|  | 
 | ||
|  |         template <typename ScannerT> | ||
|  |         typename parser_result<self_t, ScannerT>::type | ||
|  |         parse(ScannerT const& scan) const | ||
|  |         { | ||
|  |             typedef typename boost::unwrap_reference<IteratorT>::type striter_t; | ||
|  |             typedef typename parser_result<self_t, ScannerT>::type result_t; | ||
|  |             return impl::string_parser_parse<result_t>( | ||
|  |                 striter_t(first), | ||
|  |                 striter_t(last), | ||
|  |                 scan); | ||
|  |         } | ||
|  | 
 | ||
|  |     private: | ||
|  | 
 | ||
|  |         IteratorT first; | ||
|  |         IteratorT last; | ||
|  |     }; | ||
|  | 
 | ||
|  |     template <typename CharT> | ||
|  |     inline chseq<CharT const*> | ||
|  |     chseq_p(CharT const* str) | ||
|  |     { | ||
|  |         return chseq<CharT const*>(str); | ||
|  |     } | ||
|  | 
 | ||
|  |     template <typename IteratorT> | ||
|  |     inline chseq<IteratorT> | ||
|  |     chseq_p(IteratorT first, IteratorT last) | ||
|  |     { | ||
|  |         return chseq<IteratorT>(first, last); | ||
|  |     } | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     // | ||
|  |     //  strlit class | ||
|  |     // | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     template <typename IteratorT = char const*> | ||
|  |     class strlit : public parser<strlit<IteratorT> > | ||
|  |     { | ||
|  |     public: | ||
|  | 
 | ||
|  |         typedef strlit<IteratorT> self_t; | ||
|  | 
 | ||
|  |         strlit(IteratorT first, IteratorT last) | ||
|  |         : seq(first, last) {} | ||
|  | 
 | ||
|  |         strlit(IteratorT first) | ||
|  |         : seq(first) {} | ||
|  | 
 | ||
|  |         template <typename ScannerT> | ||
|  |         typename parser_result<self_t, ScannerT>::type | ||
|  |         parse(ScannerT const& scan) const | ||
|  |         { | ||
|  |             typedef typename parser_result<self_t, ScannerT>::type result_t; | ||
|  |             return impl::contiguous_parser_parse<result_t> | ||
|  |                 (seq, scan, scan); | ||
|  |         } | ||
|  | 
 | ||
|  |     private: | ||
|  | 
 | ||
|  |         chseq<IteratorT> seq; | ||
|  |     }; | ||
|  | 
 | ||
|  |     template <typename CharT> | ||
|  |     inline strlit<CharT const*> | ||
|  |     str_p(CharT const* str) | ||
|  |     { | ||
|  |         return strlit<CharT const*>(str); | ||
|  |     } | ||
|  | 
 | ||
|  |     template <typename CharT> | ||
|  |     inline strlit<CharT *> | ||
|  |     str_p(CharT * str) | ||
|  |     { | ||
|  |         return strlit<CharT *>(str); | ||
|  |     } | ||
|  | 
 | ||
|  |     template <typename IteratorT> | ||
|  |     inline strlit<IteratorT> | ||
|  |     str_p(IteratorT first, IteratorT last) | ||
|  |     { | ||
|  |         return strlit<IteratorT>(first, last); | ||
|  |     } | ||
|  | 
 | ||
|  |     // This should take care of str_p('a') "bugs" | ||
|  |     template <typename CharT> | ||
|  |     inline chlit<CharT> | ||
|  |     str_p(CharT ch) | ||
|  |     { | ||
|  |         return chlit<CharT>(ch); | ||
|  |     } | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     // | ||
|  |     //  nothing_parser class | ||
|  |     // | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     struct nothing_parser : public parser<nothing_parser> | ||
|  |     { | ||
|  |         typedef nothing_parser self_t; | ||
|  | 
 | ||
|  |         nothing_parser() {} | ||
|  | 
 | ||
|  |         template <typename ScannerT> | ||
|  |         typename parser_result<self_t, ScannerT>::type | ||
|  |         parse(ScannerT const& scan) const | ||
|  |         { | ||
|  |             return scan.no_match(); | ||
|  |         } | ||
|  |     }; | ||
|  | 
 | ||
|  |     nothing_parser const nothing_p = nothing_parser(); | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     // | ||
|  |     //  anychar_parser class | ||
|  |     // | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     struct anychar_parser : public char_parser<anychar_parser> | ||
|  |     { | ||
|  |         typedef anychar_parser self_t; | ||
|  | 
 | ||
|  |         anychar_parser() {} | ||
|  | 
 | ||
|  |         template <typename CharT> | ||
|  |         bool test(CharT) const | ||
|  |         { | ||
|  |             return true; | ||
|  |         } | ||
|  |     }; | ||
|  | 
 | ||
|  |     anychar_parser const anychar_p = anychar_parser(); | ||
|  | 
 | ||
|  |     inline nothing_parser | ||
|  |     operator~(anychar_parser) | ||
|  |     { | ||
|  |         return nothing_p; | ||
|  |     } | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     // | ||
|  |     //  alnum_parser class | ||
|  |     // | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     struct alnum_parser : public char_parser<alnum_parser> | ||
|  |     { | ||
|  |         typedef alnum_parser self_t; | ||
|  | 
 | ||
|  |         alnum_parser() {} | ||
|  | 
 | ||
|  |         template <typename CharT> | ||
|  |         bool test(CharT ch) const | ||
|  |         { | ||
|  |             return impl::isalnum_(ch); | ||
|  |         } | ||
|  |     }; | ||
|  | 
 | ||
|  |     alnum_parser const alnum_p = alnum_parser(); | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     // | ||
|  |     //  alpha_parser class | ||
|  |     // | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     struct alpha_parser : public char_parser<alpha_parser> | ||
|  |     { | ||
|  |         typedef alpha_parser self_t; | ||
|  | 
 | ||
|  |         alpha_parser() {} | ||
|  | 
 | ||
|  |         template <typename CharT> | ||
|  |         bool test(CharT ch) const | ||
|  |         { | ||
|  |             return impl::isalpha_(ch); | ||
|  |         } | ||
|  |     }; | ||
|  | 
 | ||
|  |     alpha_parser const alpha_p = alpha_parser(); | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     // | ||
|  |     //  cntrl_parser class | ||
|  |     // | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     struct cntrl_parser : public char_parser<cntrl_parser> | ||
|  |     { | ||
|  |         typedef cntrl_parser self_t; | ||
|  | 
 | ||
|  |         cntrl_parser() {} | ||
|  | 
 | ||
|  |         template <typename CharT> | ||
|  |         bool test(CharT ch) const | ||
|  |         { | ||
|  |             return impl::iscntrl_(ch); | ||
|  |         } | ||
|  |     }; | ||
|  | 
 | ||
|  |     cntrl_parser const cntrl_p = cntrl_parser(); | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     // | ||
|  |     //  digit_parser class | ||
|  |     // | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     struct digit_parser : public char_parser<digit_parser> | ||
|  |     { | ||
|  |         typedef digit_parser self_t; | ||
|  | 
 | ||
|  |         digit_parser() {} | ||
|  | 
 | ||
|  |         template <typename CharT> | ||
|  |         bool test(CharT ch) const | ||
|  |         { | ||
|  |             return impl::isdigit_(ch); | ||
|  |         } | ||
|  |     }; | ||
|  | 
 | ||
|  |     digit_parser const digit_p = digit_parser(); | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     // | ||
|  |     //  graph_parser class | ||
|  |     // | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     struct graph_parser : public char_parser<graph_parser> | ||
|  |     { | ||
|  |         typedef graph_parser self_t; | ||
|  | 
 | ||
|  |         graph_parser() {} | ||
|  | 
 | ||
|  |         template <typename CharT> | ||
|  |         bool test(CharT ch) const | ||
|  |         { | ||
|  |             return impl::isgraph_(ch); | ||
|  |         } | ||
|  |     }; | ||
|  | 
 | ||
|  |     graph_parser const graph_p = graph_parser(); | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     // | ||
|  |     //  lower_parser class | ||
|  |     // | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     struct lower_parser : public char_parser<lower_parser> | ||
|  |     { | ||
|  |         typedef lower_parser self_t; | ||
|  | 
 | ||
|  |         lower_parser() {} | ||
|  | 
 | ||
|  |         template <typename CharT> | ||
|  |         bool test(CharT ch) const | ||
|  |         { | ||
|  |             return impl::islower_(ch); | ||
|  |         } | ||
|  |     }; | ||
|  | 
 | ||
|  |     lower_parser const lower_p = lower_parser(); | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     // | ||
|  |     //  print_parser class | ||
|  |     // | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     struct print_parser : public char_parser<print_parser> | ||
|  |     { | ||
|  |         typedef print_parser self_t; | ||
|  | 
 | ||
|  |         print_parser() {} | ||
|  | 
 | ||
|  |         template <typename CharT> | ||
|  |         bool test(CharT ch) const | ||
|  |         { | ||
|  |             return impl::isprint_(ch); | ||
|  |         } | ||
|  |     }; | ||
|  | 
 | ||
|  |     print_parser const print_p = print_parser(); | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     // | ||
|  |     //  punct_parser class | ||
|  |     // | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     struct punct_parser : public char_parser<punct_parser> | ||
|  |     { | ||
|  |         typedef punct_parser self_t; | ||
|  | 
 | ||
|  |         punct_parser() {} | ||
|  | 
 | ||
|  |         template <typename CharT> | ||
|  |         bool test(CharT ch) const | ||
|  |         { | ||
|  |             return impl::ispunct_(ch); | ||
|  |         } | ||
|  |     }; | ||
|  | 
 | ||
|  |     punct_parser const punct_p = punct_parser(); | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     // | ||
|  |     //  blank_parser class | ||
|  |     // | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     struct blank_parser : public char_parser<blank_parser> | ||
|  |     { | ||
|  |         typedef blank_parser self_t; | ||
|  | 
 | ||
|  |         blank_parser() {} | ||
|  | 
 | ||
|  |         template <typename CharT> | ||
|  |         bool test(CharT ch) const | ||
|  |         { | ||
|  |             return impl::isblank_(ch); | ||
|  |         } | ||
|  |     }; | ||
|  | 
 | ||
|  |     blank_parser const blank_p = blank_parser(); | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     // | ||
|  |     //  space_parser class | ||
|  |     // | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     struct space_parser : public char_parser<space_parser> | ||
|  |     { | ||
|  |         typedef space_parser self_t; | ||
|  | 
 | ||
|  |         space_parser() {} | ||
|  | 
 | ||
|  |         template <typename CharT> | ||
|  |         bool test(CharT ch) const | ||
|  |         { | ||
|  |             return impl::isspace_(ch); | ||
|  |         } | ||
|  |     }; | ||
|  | 
 | ||
|  |     space_parser const space_p = space_parser(); | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     // | ||
|  |     //  upper_parser class | ||
|  |     // | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     struct upper_parser : public char_parser<upper_parser> | ||
|  |     { | ||
|  |         typedef upper_parser self_t; | ||
|  | 
 | ||
|  |         upper_parser() {} | ||
|  | 
 | ||
|  |         template <typename CharT> | ||
|  |         bool test(CharT ch) const | ||
|  |         { | ||
|  |             return impl::isupper_(ch); | ||
|  |         } | ||
|  |     }; | ||
|  | 
 | ||
|  |     upper_parser const upper_p = upper_parser(); | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     // | ||
|  |     //  xdigit_parser class | ||
|  |     // | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     struct xdigit_parser : public char_parser<xdigit_parser> | ||
|  |     { | ||
|  |         typedef xdigit_parser self_t; | ||
|  | 
 | ||
|  |         xdigit_parser() {} | ||
|  | 
 | ||
|  |         template <typename CharT> | ||
|  |         bool test(CharT ch) const | ||
|  |         { | ||
|  |             return impl::isxdigit_(ch); | ||
|  |         } | ||
|  |     }; | ||
|  | 
 | ||
|  |     xdigit_parser const xdigit_p = xdigit_parser(); | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     // | ||
|  |     //  eol_parser class (contributed by Martin Wille) | ||
|  |     // | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     struct eol_parser : public parser<eol_parser> | ||
|  |     { | ||
|  |         typedef eol_parser self_t; | ||
|  | 
 | ||
|  |         eol_parser() {} | ||
|  | 
 | ||
|  |         template <typename ScannerT> | ||
|  |         typename parser_result<self_t, ScannerT>::type | ||
|  |         parse(ScannerT const& scan) const | ||
|  |         { | ||
|  |             typename ScannerT::iterator_t save = scan.first; | ||
|  |             std::size_t len = 0; | ||
|  | 
 | ||
|  |             if (!scan.at_end() && *scan == '\r')    // CR | ||
|  |             { | ||
|  |                 ++scan.first; | ||
|  |                 ++len; | ||
|  |             } | ||
|  | 
 | ||
|  |             // Don't call skipper here | ||
|  |             if (scan.first != scan.last && *scan == '\n')    // LF | ||
|  |             { | ||
|  |                 ++scan.first; | ||
|  |                 ++len; | ||
|  |             } | ||
|  | 
 | ||
|  |             if (len) | ||
|  |                 return scan.create_match(len, nil_t(), save, scan.first); | ||
|  |             return scan.no_match(); | ||
|  |         } | ||
|  |     }; | ||
|  | 
 | ||
|  |     eol_parser const eol_p = eol_parser(); | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     // | ||
|  |     //  end_parser class (suggested by Markus Schoepflin) | ||
|  |     // | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     struct end_parser : public parser<end_parser> | ||
|  |     { | ||
|  |         typedef end_parser self_t; | ||
|  | 
 | ||
|  |         end_parser() {} | ||
|  | 
 | ||
|  |         template <typename ScannerT> | ||
|  |         typename parser_result<self_t, ScannerT>::type | ||
|  |         parse(ScannerT const& scan) const | ||
|  |         { | ||
|  |             if (scan.at_end()) | ||
|  |                 return scan.empty_match(); | ||
|  |             return scan.no_match(); | ||
|  |         } | ||
|  |     }; | ||
|  | 
 | ||
|  |     end_parser const end_p = end_parser(); | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     // | ||
|  |     //  the pizza_p parser :-) | ||
|  |     // | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     inline strlit<char const*> const | ||
|  |     pizza_p(char const* your_favorite_pizza) | ||
|  |     { | ||
|  |         return your_favorite_pizza; | ||
|  |     } | ||
|  | 
 | ||
|  | BOOST_SPIRIT_CLASSIC_NAMESPACE_END | ||
|  | 
 | ||
|  | }} // namespace BOOST_SPIRIT_CLASSIC_NS | ||
|  | 
 | ||
|  | #ifdef BOOST_MSVC | ||
|  | #pragma warning (pop) | ||
|  | #endif | ||
|  | 
 | ||
|  | #endif |