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
							 | 
						||
| 
								 | 
							
								
							 |