198 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			198 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | /*============================================================================= | ||
|  |     Copyright (c) 1998-2003 Joel de Guzman | ||
|  |     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_SKIPPER_HPP) | ||
|  | #define BOOST_SPIRIT_SKIPPER_HPP | ||
|  | 
 | ||
|  | /////////////////////////////////////////////////////////////////////////////// | ||
|  | #include <cctype> | ||
|  | 
 | ||
|  | #include <boost/spirit/home/classic/namespace.hpp> | ||
|  | #include <boost/spirit/home/classic/core/scanner/scanner.hpp> | ||
|  | #include <boost/spirit/home/classic/core/primitives/impl/primitives.ipp> | ||
|  | 
 | ||
|  | #include <boost/spirit/home/classic/core/scanner/skipper_fwd.hpp> | ||
|  | 
 | ||
|  | namespace boost { namespace spirit { | ||
|  | 
 | ||
|  | BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     // | ||
|  |     //  skipper_iteration_policy class | ||
|  |     // | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     template <typename BaseT> | ||
|  |     struct skipper_iteration_policy : public BaseT | ||
|  |     { | ||
|  |         typedef BaseT base_t; | ||
|  |      | ||
|  |         skipper_iteration_policy() | ||
|  |         : BaseT() {} | ||
|  |      | ||
|  |         template <typename PolicyT> | ||
|  |         skipper_iteration_policy(PolicyT const& other) | ||
|  |         : BaseT(other) {} | ||
|  |      | ||
|  |         template <typename ScannerT> | ||
|  |         void | ||
|  |         advance(ScannerT const& scan) const | ||
|  |         { | ||
|  |             BaseT::advance(scan); | ||
|  |             scan.skip(scan); | ||
|  |         } | ||
|  |      | ||
|  |         template <typename ScannerT> | ||
|  |         bool | ||
|  |         at_end(ScannerT const& scan) const | ||
|  |         { | ||
|  |             scan.skip(scan); | ||
|  |             return BaseT::at_end(scan); | ||
|  |         } | ||
|  |      | ||
|  |         template <typename ScannerT> | ||
|  |         void | ||
|  |         skip(ScannerT const& scan) const | ||
|  |         { | ||
|  |             while (!BaseT::at_end(scan) && impl::isspace_(BaseT::get(scan))) | ||
|  |                 BaseT::advance(scan); | ||
|  |         } | ||
|  |     }; | ||
|  |      | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     // | ||
|  |     //  no_skipper_iteration_policy class | ||
|  |     // | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     template <typename BaseT> | ||
|  |     struct no_skipper_iteration_policy : public BaseT | ||
|  |     { | ||
|  |         typedef BaseT base_t; | ||
|  | 
 | ||
|  |         no_skipper_iteration_policy() | ||
|  |         : BaseT() {} | ||
|  | 
 | ||
|  |         template <typename PolicyT> | ||
|  |         no_skipper_iteration_policy(PolicyT const& other) | ||
|  |         : BaseT(other) {} | ||
|  | 
 | ||
|  |         template <typename ScannerT> | ||
|  |         void | ||
|  |         skip(ScannerT const& /*scan*/) const {} | ||
|  |     }; | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     // | ||
|  |     //  skip_parser_iteration_policy class | ||
|  |     // | ||
|  |     /////////////////////////////////////////////////////////////////////////// | ||
|  |     namespace impl | ||
|  |     { | ||
|  |         template <typename ST, typename ScannerT, typename BaseT> | ||
|  |         void | ||
|  |         skipper_skip( | ||
|  |             ST const& s, | ||
|  |             ScannerT const& scan, | ||
|  |             skipper_iteration_policy<BaseT> const&); | ||
|  | 
 | ||
|  |         template <typename ST, typename ScannerT, typename BaseT> | ||
|  |         void | ||
|  |         skipper_skip( | ||
|  |             ST const& s, | ||
|  |             ScannerT const& scan, | ||
|  |             no_skipper_iteration_policy<BaseT> const&); | ||
|  | 
 | ||
|  |         template <typename ST, typename ScannerT> | ||
|  |         void | ||
|  |         skipper_skip( | ||
|  |             ST const& s, | ||
|  |             ScannerT const& scan, | ||
|  |             iteration_policy const&); | ||
|  |     } | ||
|  | 
 | ||
|  |     template <typename ParserT, typename BaseT> | ||
|  |     class skip_parser_iteration_policy : public skipper_iteration_policy<BaseT> | ||
|  |     { | ||
|  |     public: | ||
|  |      | ||
|  |         typedef skipper_iteration_policy<BaseT> base_t; | ||
|  |      | ||
|  |         skip_parser_iteration_policy( | ||
|  |             ParserT const& skip_parser, | ||
|  |             base_t const& base = base_t()) | ||
|  |         : base_t(base), subject(skip_parser) {} | ||
|  |      | ||
|  |         template <typename PolicyT> | ||
|  |         skip_parser_iteration_policy(PolicyT const& other) | ||
|  |         : base_t(other), subject(other.skipper()) {} | ||
|  |      | ||
|  |         template <typename ScannerT> | ||
|  |         void | ||
|  |         skip(ScannerT const& scan) const | ||
|  |         { | ||
|  |             impl::skipper_skip(subject, scan, scan); | ||
|  |         } | ||
|  |      | ||
|  |         ParserT const& | ||
|  |         skipper() const | ||
|  |         {  | ||
|  |             return subject;  | ||
|  |         } | ||
|  |      | ||
|  |     private: | ||
|  |      | ||
|  |         ParserT const& subject; | ||
|  |     }; | ||
|  |      | ||
|  |     /////////////////////////////////////////////////////////////////////////////// | ||
|  |     // | ||
|  |     //  Free parse functions using the skippers | ||
|  |     // | ||
|  |     /////////////////////////////////////////////////////////////////////////////// | ||
|  |     template <typename IteratorT, typename ParserT, typename SkipT> | ||
|  |     parse_info<IteratorT> | ||
|  |     parse( | ||
|  |         IteratorT const&        first, | ||
|  |         IteratorT const&        last, | ||
|  |         parser<ParserT> const&  p, | ||
|  |         parser<SkipT> const&    skip); | ||
|  |      | ||
|  |     /////////////////////////////////////////////////////////////////////////////// | ||
|  |     // | ||
|  |     //  Parse function for null terminated strings using the skippers | ||
|  |     // | ||
|  |     /////////////////////////////////////////////////////////////////////////////// | ||
|  |     template <typename CharT, typename ParserT, typename SkipT> | ||
|  |     parse_info<CharT const*> | ||
|  |     parse( | ||
|  |         CharT const*            str, | ||
|  |         parser<ParserT> const&  p, | ||
|  |         parser<SkipT> const&    skip); | ||
|  |      | ||
|  |     /////////////////////////////////////////////////////////////////////////////// | ||
|  |     // | ||
|  |     //  phrase_scanner_t and wide_phrase_scanner_t | ||
|  |     // | ||
|  |     //      The most common scanners. Use these typedefs when you need | ||
|  |     //      a scanner that skips white spaces. | ||
|  |     // | ||
|  |     /////////////////////////////////////////////////////////////////////////////// | ||
|  |     typedef skipper_iteration_policy<>                  iter_policy_t; | ||
|  |     typedef scanner_policies<iter_policy_t>             scanner_policies_t; | ||
|  |     typedef scanner<char const*, scanner_policies_t>    phrase_scanner_t; | ||
|  |     typedef scanner<wchar_t const*, scanner_policies_t> wide_phrase_scanner_t; | ||
|  |      | ||
|  |     /////////////////////////////////////////////////////////////////////////////// | ||
|  | 
 | ||
|  | BOOST_SPIRIT_CLASSIC_NAMESPACE_END | ||
|  | 
 | ||
|  | }} // namespace BOOST_SPIRIT_CLASSIC_NS | ||
|  | 
 | ||
|  | #include <boost/spirit/home/classic/core/scanner/impl/skipper.ipp> | ||
|  | #endif | ||
|  | 
 |