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

📄 scanner.hpp

📁 Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
💻 HPP
字号:
/*=============================================================================    Copyright (c) 1998-2002 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_SCANNER_HPP)#define BOOST_SPIRIT_SCANNER_HPP#include <iterator>#include <boost/config.hpp>#include <boost/spirit/home/classic/namespace.hpp>#include <boost/spirit/home/classic/core/match.hpp>#include <boost/spirit/home/classic/core/non_terminal/parser_id.hpp>#include <boost/detail/iterator.hpp> // for boost::detail::iterator_traits#include <boost/spirit/home/classic/core/scanner/scanner_fwd.hpp>namespace boost { namespace spirit {BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN    ///////////////////////////////////////////////////////////////////////////    //    //  iteration_policy class    //    ///////////////////////////////////////////////////////////////////////////    struct iteration_policy    {        template <typename ScannerT>        void        advance(ScannerT const& scan) const        {            ++scan.first;        }        template <typename ScannerT>        bool at_end(ScannerT const& scan) const        {            return scan.first == scan.last;        }        template <typename T>        T filter(T ch) const        {            return ch;        }        template <typename ScannerT>        typename ScannerT::ref_t        get(ScannerT const& scan) const        {            return *scan.first;        }    };    ///////////////////////////////////////////////////////////////////////////    //    //  match_policy class    //    ///////////////////////////////////////////////////////////////////////////    struct match_policy    {        template <typename T>        struct result { typedef match<T> type; };        const match<nil_t>        no_match() const        {            return match<nil_t>();        }        const match<nil_t>        empty_match() const        {            return match<nil_t>(0, nil_t());        }        template <typename AttrT, typename IteratorT>        match<AttrT>        create_match(            std::size_t         length,            AttrT const&        val,            IteratorT const&    /*first*/,            IteratorT const&    /*last*/) const        {            return match<AttrT>(length, val);        }        template <typename MatchT, typename IteratorT>        void group_match(            MatchT&             /*m*/,            parser_id const&    /*id*/,            IteratorT const&    /*first*/,            IteratorT const&    /*last*/) const {}        template <typename Match1T, typename Match2T>        void concat_match(Match1T& l, Match2T const& r) const        {            l.concat(r);        }    };    ///////////////////////////////////////////////////////////////////////////    //    //  match_result class    //    ///////////////////////////////////////////////////////////////////////////    template <typename MatchPolicyT, typename T>    struct match_result    {        typedef typename MatchPolicyT::template result<T>::type type;    };    ///////////////////////////////////////////////////////////////////////////    //    //  action_policy class    //    ///////////////////////////////////////////////////////////////////////////    template <typename AttrT>    struct attributed_action_policy    {        template <typename ActorT, typename IteratorT>        static void        call(            ActorT const& actor,            AttrT& val,            IteratorT const&,            IteratorT const&)        {            actor(val);        }    };    //////////////////////////////////    template <>    struct attributed_action_policy<nil_t>    {        template <typename ActorT, typename IteratorT>        static void        call(            ActorT const& actor,            nil_t,            IteratorT const& first,            IteratorT const& last)        {            actor(first, last);        }    };    //////////////////////////////////    struct action_policy    {        template <typename ActorT, typename AttrT, typename IteratorT>        void        do_action(            ActorT const&       actor,            AttrT&              val,            IteratorT const&    first,            IteratorT const&    last) const        {            attributed_action_policy<AttrT>::call(actor, val, first, last);        }    };    ///////////////////////////////////////////////////////////////////////////    //    //  scanner_policies class    //    ///////////////////////////////////////////////////////////////////////////    template <        typename IterationPolicyT,        typename MatchPolicyT,        typename ActionPolicyT>    struct scanner_policies :        public IterationPolicyT,        public MatchPolicyT,        public ActionPolicyT    {        typedef IterationPolicyT    iteration_policy_t;        typedef MatchPolicyT        match_policy_t;        typedef ActionPolicyT       action_policy_t;        scanner_policies(            IterationPolicyT const& i_policy = IterationPolicyT(),            MatchPolicyT const&     m_policy = MatchPolicyT(),            ActionPolicyT const&    a_policy = ActionPolicyT())        : IterationPolicyT(i_policy)        , MatchPolicyT(m_policy)        , ActionPolicyT(a_policy) {}        template <typename ScannerPoliciesT>        scanner_policies(ScannerPoliciesT const& policies)        : IterationPolicyT(policies)        , MatchPolicyT(policies)        , ActionPolicyT(policies) {}    };    ///////////////////////////////////////////////////////////////////////////    //    //  scanner_policies_base class: the base class of all scanners    //    ///////////////////////////////////////////////////////////////////////////    struct scanner_base {};    ///////////////////////////////////////////////////////////////////////////    //    //  scanner class    //    ///////////////////////////////////////////////////////////////////////////    template <        typename IteratorT,        typename PoliciesT>    class scanner : public PoliciesT, public scanner_base    {    public:        typedef IteratorT iterator_t;        typedef PoliciesT policies_t;        typedef typename boost::detail::            iterator_traits<IteratorT>::value_type value_t;        typedef typename boost::detail::            iterator_traits<IteratorT>::reference ref_t;        typedef typename boost::            call_traits<IteratorT>::param_type iter_param_t;        scanner(            IteratorT&          first_,            iter_param_t        last_,            PoliciesT const&    policies = PoliciesT())        : PoliciesT(policies), first(first_), last(last_)        {            at_end();        }        scanner(scanner const& other)        : PoliciesT(other), first(other.first), last(other.last) {}        scanner(scanner const& other, IteratorT& first_)        : PoliciesT(other), first(first_), last(other.last) {}        template <typename PoliciesT1>        scanner(scanner<IteratorT, PoliciesT1> const& other)        : PoliciesT(other), first(other.first), last(other.last) {}        bool        at_end() const        {            typedef typename PoliciesT::iteration_policy_t iteration_policy_type;            return iteration_policy_type::at_end(*this);        }        value_t        operator*() const        {            typedef typename PoliciesT::iteration_policy_t iteration_policy_type;            return iteration_policy_type::filter(iteration_policy_type::get(*this));        }        scanner const&        operator++() const        {            typedef typename PoliciesT::iteration_policy_t iteration_policy_type;            iteration_policy_type::advance(*this);            return *this;        }        template <typename PoliciesT2>        struct rebind_policies        {            typedef scanner<IteratorT, PoliciesT2> type;        };        template <typename PoliciesT2>        scanner<IteratorT, PoliciesT2>        change_policies(PoliciesT2 const& policies) const        {            return scanner<IteratorT, PoliciesT2>(first, last, policies);        }        template <typename IteratorT2>        struct rebind_iterator        {            typedef scanner<IteratorT2, PoliciesT> type;        };        template <typename IteratorT2>        scanner<IteratorT2, PoliciesT>        change_iterator(IteratorT2 const& first_, IteratorT2 const &last_) const        {            return scanner<IteratorT2, PoliciesT>(first_, last_, *this);        }        IteratorT& first;        IteratorT const last;    private:        scanner&        operator=(scanner const& other);    };    ///////////////////////////////////////////////////////////////////////////    //    //  rebind_scanner_policies class    //    ///////////////////////////////////////////////////////////////////////////    template <typename ScannerT, typename PoliciesT>    struct rebind_scanner_policies    {        typedef typename ScannerT::template            rebind_policies<PoliciesT>::type type;    };    //////////////////////////////////    template <typename ScannerT, typename IteratorT>    struct rebind_scanner_iterator    {        typedef typename ScannerT::template            rebind_iterator<IteratorT>::type type;    };BOOST_SPIRIT_CLASSIC_NAMESPACE_END}}#endif

⌨️ 快捷键说明

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