/*============================================================================= 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 #include #include #include #include namespace boost { namespace spirit { BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN /////////////////////////////////////////////////////////////////////////// // // skipper_iteration_policy class // /////////////////////////////////////////////////////////////////////////// template struct skipper_iteration_policy : public BaseT { typedef BaseT base_t; skipper_iteration_policy() : BaseT() {} template skipper_iteration_policy(PolicyT const& other) : BaseT(other) {} template void advance(ScannerT const& scan) const { BaseT::advance(scan); scan.skip(scan); } template bool at_end(ScannerT const& scan) const { scan.skip(scan); return BaseT::at_end(scan); } template 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 struct no_skipper_iteration_policy : public BaseT { typedef BaseT base_t; no_skipper_iteration_policy() : BaseT() {} template no_skipper_iteration_policy(PolicyT const& other) : BaseT(other) {} template void skip(ScannerT const& /*scan*/) const {} }; /////////////////////////////////////////////////////////////////////////// // // skip_parser_iteration_policy class // /////////////////////////////////////////////////////////////////////////// namespace impl { template void skipper_skip( ST const& s, ScannerT const& scan, skipper_iteration_policy const&); template void skipper_skip( ST const& s, ScannerT const& scan, no_skipper_iteration_policy const&); template void skipper_skip( ST const& s, ScannerT const& scan, iteration_policy const&); } template class skip_parser_iteration_policy : public skipper_iteration_policy { public: typedef skipper_iteration_policy base_t; skip_parser_iteration_policy( ParserT const& skip_parser, base_t const& base = base_t()) : base_t(base), subject(skip_parser) {} template skip_parser_iteration_policy(PolicyT const& other) : base_t(other), subject(other.skipper()) {} template 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 parse_info parse( IteratorT const& first, IteratorT const& last, parser const& p, parser const& skip); /////////////////////////////////////////////////////////////////////////////// // // Parse function for null terminated strings using the skippers // /////////////////////////////////////////////////////////////////////////////// template parse_info parse( CharT const* str, parser const& p, parser 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 scanner_policies_t; typedef scanner phrase_scanner_t; typedef scanner wide_phrase_scanner_t; /////////////////////////////////////////////////////////////////////////////// BOOST_SPIRIT_CLASSIC_NAMESPACE_END }} // namespace BOOST_SPIRIT_CLASSIC_NS #include #endif