⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 skipper.hpp

📁 Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
💻 HPP
字号:
/*=============================================================================    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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -