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