/*============================================================================= 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 struct no_skipper_iteration_policy; namespace impl { template inline void skipper_skip( ST const& s, ScannerT const& scan, skipper_iteration_policy 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 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 inline void skipper_skip( ST const& s, ScannerT const& scan, no_skipper_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 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 struct phrase_parser { template static parse_info parse( IteratorT const& first_, IteratorT const& last, ParserT const& p, SkipT const& skip) { typedef skip_parser_iteration_policy iter_policy_t; typedef scanner_policies scanner_policies_t; typedef scanner scanner_t; iter_policy_t iter_policy(skip); scanner_policies_t policies(iter_policy); IteratorT first = first_; scanner_t scan(first, last, policies); match hit = p.parse(scan); return parse_info( first, hit, hit && (first == last), hit.length()); } }; template <> struct phrase_parser { template static parse_info parse( IteratorT const& first_, IteratorT const& last, ParserT const& p, space_parser const&) { typedef skipper_iteration_policy<> iter_policy_t; typedef scanner_policies scanner_policies_t; typedef scanner scanner_t; IteratorT first = first_; scanner_t scan(first, last); match hit = p.parse(scan); return parse_info( first, hit, hit && (first == last), hit.length()); } }; } /////////////////////////////////////////////////////////////////////////// // // Free parse functions using the skippers // /////////////////////////////////////////////////////////////////////////// template inline parse_info parse( IteratorT const& first, IteratorT const& last, parser const& p, parser const& skip) { return impl::phrase_parser:: parse(first, last, p.derived(), skip.derived()); } /////////////////////////////////////////////////////////////////////////// // // Parse function for null terminated strings using the skippers // /////////////////////////////////////////////////////////////////////////// template inline parse_info parse( CharT const* str, parser const& p, parser const& skip) { CharT const* last = str; while (*last) last++; return parse(str, last, p, skip); } BOOST_SPIRIT_CLASSIC_NAMESPACE_END }} // namespace boost::spirit #endif