182 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			182 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | /*============================================================================= | ||
|  |     Copyright (c) 1998-2003 Joel de Guzman | ||
|  |     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) | ||
|  | ============================================================================*/ | ||
|  | #if !defined(BOOST_SPIRIT_SKIPPER_IPP) | ||
|  | #define BOOST_SPIRIT_SKIPPER_IPP | ||
|  | 
 | ||
|  | /////////////////////////////////////////////////////////////////////////////// | ||
|  | namespace boost { namespace spirit { | ||
|  | 
 | ||
|  | BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN | ||
|  | 
 | ||
|  |     struct space_parser; | ||
|  |     template <typename BaseT> | ||
|  |     struct no_skipper_iteration_policy; | ||
|  | 
 | ||
|  |     namespace impl | ||
|  |     { | ||
|  |         template <typename ST, typename ScannerT, typename BaseT> | ||
|  |         inline void | ||
|  |         skipper_skip( | ||
|  |             ST const& s, | ||
|  |             ScannerT const& scan, | ||
|  |             skipper_iteration_policy<BaseT> const&) | ||
|  |         { | ||
|  |             typedef scanner_policies< | ||
|  |                 no_skipper_iteration_policy< | ||
|  |                     BOOST_DEDUCED_TYPENAME ScannerT::iteration_policy_t>, | ||
|  |                 BOOST_DEDUCED_TYPENAME ScannerT::match_policy_t, | ||
|  |                 BOOST_DEDUCED_TYPENAME ScannerT::action_policy_t | ||
|  |             > policies_t; | ||
|  | 
 | ||
|  |             scanner<BOOST_DEDUCED_TYPENAME ScannerT::iterator_t, policies_t> | ||
|  |                 scan2(scan.first, scan.last, policies_t(scan)); | ||
|  |             typedef typename ScannerT::iterator_t iterator_t; | ||
|  | 
 | ||
|  |             for (;;) | ||
|  |             { | ||
|  |                 iterator_t save = scan.first; | ||
|  |                 if (!s.parse(scan2)) | ||
|  |                 { | ||
|  |                     scan.first = save; | ||
|  |                     break; | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         template <typename ST, typename ScannerT, typename BaseT> | ||
|  |         inline void | ||
|  |         skipper_skip( | ||
|  |             ST const& s, | ||
|  |             ScannerT const& scan, | ||
|  |             no_skipper_iteration_policy<BaseT> const&) | ||
|  |         { | ||
|  |             for (;;) | ||
|  |             { | ||
|  |                 typedef typename ScannerT::iterator_t iterator_t; | ||
|  |                 iterator_t save = scan.first; | ||
|  |                 if (!s.parse(scan)) | ||
|  |                 { | ||
|  |                     scan.first = save; | ||
|  |                     break; | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         template <typename ST, typename ScannerT> | ||
|  |         inline void | ||
|  |         skipper_skip( | ||
|  |             ST const& s, | ||
|  |             ScannerT const& scan, | ||
|  |             iteration_policy const&) | ||
|  |         { | ||
|  |             for (;;) | ||
|  |             { | ||
|  |                 typedef typename ScannerT::iterator_t iterator_t; | ||
|  |                 iterator_t save = scan.first; | ||
|  |                 if (!s.parse(scan)) | ||
|  |                 { | ||
|  |                     scan.first = save; | ||
|  |                     break; | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         template <typename SkipT> | ||
|  |         struct phrase_parser | ||
|  |         { | ||
|  |             template <typename IteratorT, typename ParserT> | ||
|  |             static parse_info<IteratorT> | ||
|  |             parse( | ||
|  |                 IteratorT const&    first_, | ||
|  |                 IteratorT const&    last, | ||
|  |                 ParserT const&      p, | ||
|  |                 SkipT const&        skip) | ||
|  |             { | ||
|  |                 typedef skip_parser_iteration_policy<SkipT> iter_policy_t; | ||
|  |                 typedef scanner_policies<iter_policy_t> scanner_policies_t; | ||
|  |                 typedef scanner<IteratorT, scanner_policies_t> scanner_t; | ||
|  | 
 | ||
|  |                 iter_policy_t iter_policy(skip); | ||
|  |                 scanner_policies_t policies(iter_policy); | ||
|  |                 IteratorT first = first_; | ||
|  |                 scanner_t scan(first, last, policies); | ||
|  |                 match<nil_t> hit = p.parse(scan); | ||
|  |                 return parse_info<IteratorT>( | ||
|  |                     first, hit, hit && (first == last), | ||
|  |                     hit.length()); | ||
|  |             } | ||
|  |         }; | ||
|  | 
 | ||
|  |         template <> | ||
|  |         struct phrase_parser<space_parser> | ||
|  |         { | ||
|  |             template <typename IteratorT, typename ParserT> | ||
|  |             static parse_info<IteratorT> | ||
|  |             parse( | ||
|  |                 IteratorT const&    first_, | ||
|  |                 IteratorT const&    last, | ||
|  |                 ParserT const&      p, | ||
|  |                 space_parser const&) | ||
|  |             { | ||
|  |                 typedef skipper_iteration_policy<> iter_policy_t; | ||
|  |                 typedef scanner_policies<iter_policy_t> scanner_policies_t; | ||
|  |                 typedef scanner<IteratorT, scanner_policies_t> scanner_t; | ||
|  | 
 | ||
|  |                 IteratorT first = first_; | ||
|  |                 scanner_t scan(first, last); | ||
|  |                 match<nil_t> hit = p.parse(scan); | ||
|  |                 return parse_info<IteratorT>( | ||
|  |                     first, hit, hit && (first == last), | ||
|  |                     hit.length()); | ||
|  |             } | ||
|  |         }; | ||
|  |     } | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     // | ||
|  |     //  Free parse functions using the skippers | ||
|  |     // | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     template <typename IteratorT, typename ParserT, typename SkipT> | ||
|  |     inline parse_info<IteratorT> | ||
|  |     parse( | ||
|  |         IteratorT const&        first, | ||
|  |         IteratorT const&        last, | ||
|  |         parser<ParserT> const&  p, | ||
|  |         parser<SkipT> const&    skip) | ||
|  |     { | ||
|  |         return impl::phrase_parser<SkipT>:: | ||
|  |             parse(first, last, p.derived(), skip.derived()); | ||
|  |     } | ||
|  |      | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     // | ||
|  |     //  Parse function for null terminated strings using the skippers | ||
|  |     // | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     template <typename CharT, typename ParserT, typename SkipT> | ||
|  |     inline parse_info<CharT const*> | ||
|  |     parse( | ||
|  |         CharT const*            str, | ||
|  |         parser<ParserT> const&  p, | ||
|  |         parser<SkipT> const&    skip) | ||
|  |     { | ||
|  |         CharT const* last = str; | ||
|  |         while (*last) | ||
|  |             last++; | ||
|  |         return parse(str, last, p, skip); | ||
|  |     } | ||
|  | 
 | ||
|  | BOOST_SPIRIT_CLASSIC_NAMESPACE_END | ||
|  | 
 | ||
|  | }} // namespace boost::spirit | ||
|  | 
 | ||
|  | #endif | ||
|  | 
 |