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

📄 refactoring.hpp

📁 Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
💻 HPP
字号:
/*=============================================================================    Copyright (c) 2002-2003 Hartmut Kaiser    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)=============================================================================*/#ifndef BOOST_SPIRIT_REFACTORING_HPP#define BOOST_SPIRIT_REFACTORING_HPP///////////////////////////////////////////////////////////////////////////////#include <boost/static_assert.hpp>#include <boost/spirit/home/classic/namespace.hpp>#include <boost/spirit/home/classic/meta/as_parser.hpp>#include <boost/spirit/home/classic/core/parser.hpp>#include <boost/spirit/home/classic/core/composite/composite.hpp>#include <boost/spirit/home/classic/meta/impl/refactoring.ipp>///////////////////////////////////////////////////////////////////////////////namespace boost { namespace spirit {BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN///////////////////////////////////////////////////////////////////////////////////  refactor_unary_parser class////      This helper template allows to attach an unary operation to a newly//      constructed parser, which combines the subject of the left operand of//      the original given parser (BinaryT) with the right operand of the//      original binary parser through the original binary operation and//      rewraps the resulting parser with the original unary operator.////      For instance given the parser://          *some_parser - another_parser////      will be refactored to://          *(some_parser - another_parser)////      If the parser to refactor is not a unary parser, no refactoring is done//      at all.////      The original parser should be a binary_parser_category parser,//      else the compilation will fail/////////////////////////////////////////////////////////////////////////////////template <typename NestedT = non_nested_refactoring>class refactor_unary_gen;template <typename BinaryT, typename NestedT = non_nested_refactoring>class refactor_unary_parser :    public parser<refactor_unary_parser<BinaryT, NestedT> > {public:    //  the parser to refactor has to be at least a binary_parser_category    //  parser    BOOST_STATIC_ASSERT((        boost::is_convertible<typename BinaryT::parser_category_t,            binary_parser_category>::value    ));    refactor_unary_parser(BinaryT const& binary_, NestedT const& nested_)    : binary(binary_), nested(nested_) {}    typedef refactor_unary_parser<BinaryT, NestedT> self_t;    typedef refactor_unary_gen<NestedT> parser_generator_t;    typedef typename BinaryT::left_t::parser_category_t parser_category_t;    template <typename ScannerT>    typename parser_result<self_t, ScannerT>::type    parse(ScannerT const& scan) const    {        return impl::refactor_unary_type<NestedT>::            parse(*this, scan, binary, nested);    }private:    typename as_parser<BinaryT>::type::embed_t binary;    typename NestedT::embed_t nested;};//////////////////////////////////template <typename NestedT>class refactor_unary_gen {public:    typedef refactor_unary_gen<NestedT> embed_t;    refactor_unary_gen(NestedT const& nested_ = non_nested_refactoring())    : nested(nested_) {}    template <typename ParserT>    refactor_unary_parser<ParserT, NestedT>    operator[](parser<ParserT> const& subject) const    {        return refactor_unary_parser<ParserT, NestedT>            (subject.derived(), nested);    }private:    typename NestedT::embed_t nested;};const refactor_unary_gen<> refactor_unary_d = refactor_unary_gen<>();///////////////////////////////////////////////////////////////////////////////////  refactor_action_parser class////      This helper template allows to attach an action taken from the left//      operand of the given binary parser to a newly constructed parser,//      which combines the subject of the left operand of the original binary//      parser with the right operand of the original binary parser by means of//      the original binary operator parser.////      For instance the parser://          some_parser[some_attached_functor] - another_parser////      will be refactored to://          (some_parser - another_parser)[some_attached_functor]////      If the left operand to refactor is not an action parser, no refactoring//      is done at all.////      The original parser should be a binary_parser_category parser,//      else the compilation will fail/////////////////////////////////////////////////////////////////////////////////template <typename NestedT = non_nested_refactoring>class refactor_action_gen;template <typename BinaryT, typename NestedT = non_nested_refactoring>class refactor_action_parser :    public parser<refactor_action_parser<BinaryT, NestedT> > {public:    //  the parser to refactor has to be at least a binary_parser_category    //  parser    BOOST_STATIC_ASSERT((        boost::is_convertible<typename BinaryT::parser_category_t,            binary_parser_category>::value    ));    refactor_action_parser(BinaryT const& binary_, NestedT const& nested_)    : binary(binary_), nested(nested_) {}    typedef refactor_action_parser<BinaryT, NestedT> self_t;    typedef refactor_action_gen<NestedT> parser_generator_t;    typedef typename BinaryT::left_t::parser_category_t parser_category_t;    template <typename ScannerT>    typename parser_result<self_t, ScannerT>::type    parse(ScannerT const& scan) const    {        return impl::refactor_action_type<NestedT>::            parse(*this, scan, binary, nested);    }private:    typename as_parser<BinaryT>::type::embed_t binary;    typename NestedT::embed_t nested;};//////////////////////////////////template <typename NestedT>class refactor_action_gen {public:    typedef refactor_action_gen<NestedT> embed_t;    refactor_action_gen(NestedT const& nested_ = non_nested_refactoring())    : nested(nested_) {}    template <typename ParserT>    refactor_action_parser<ParserT, NestedT>    operator[](parser<ParserT> const& subject) const    {        return refactor_action_parser<ParserT, NestedT>            (subject.derived(), nested);    }private:    typename NestedT::embed_t nested;};const refactor_action_gen<> refactor_action_d = refactor_action_gen<>();///////////////////////////////////////////////////////////////////////////////////  attach_action_parser class////      This helper template allows to attach an action given separately//      to to all parsers, out of which the given parser is constructed and//      reconstructs a new parser having the same structure.////      For instance the parser://          (some_parser >> another_parser)[some_attached_functor]////      will be refactored to://          some_parser[some_attached_functor]//              >> another_parser[some_attached_functor]////      The original parser should be a action_parser_category parser,//      else the compilation will fail////      If the parser, to which the action is attached is not an binary parser,//      no refactoring is done at all./////////////////////////////////////////////////////////////////////////////////template <typename NestedT = non_nested_refactoring>class attach_action_gen;template <typename ActionT, typename NestedT = non_nested_refactoring>class attach_action_parser :    public parser<attach_action_parser<ActionT, NestedT> > {public:    //  the parser to refactor has to be at least a action_parser_category    //  parser    BOOST_STATIC_ASSERT((        boost::is_convertible<typename ActionT::parser_category_t,            action_parser_category>::value    ));    attach_action_parser(ActionT const& actor_, NestedT const& nested_)    : actor(actor_), nested(nested_) {}    typedef attach_action_parser<ActionT, NestedT> self_t;    typedef attach_action_gen<NestedT> parser_generator_t;    typedef typename ActionT::parser_category_t parser_category_t;    template <typename ScannerT>    typename parser_result<self_t, ScannerT>::type    parse(ScannerT const& scan) const    {        return impl::attach_action_type<NestedT>::            parse(*this, scan, actor, nested);    }private:    typename as_parser<ActionT>::type::embed_t actor;    typename NestedT::embed_t nested;};//////////////////////////////////template <typename NestedT>class attach_action_gen {public:    typedef attach_action_gen<NestedT> embed_t;    attach_action_gen(NestedT const& nested_ = non_nested_refactoring())    : nested(nested_) {}    template <typename ParserT, typename ActionT>    attach_action_parser<action<ParserT, ActionT>, NestedT>    operator[](action<ParserT, ActionT> const& actor) const    {        return attach_action_parser<action<ParserT, ActionT>, NestedT>            (actor, nested);    }private:    typename NestedT::embed_t nested;};const attach_action_gen<> attach_action_d = attach_action_gen<>();///////////////////////////////////////////////////////////////////////////////BOOST_SPIRIT_CLASSIC_NAMESPACE_END}} // namespace BOOST_SPIRIT_CLASSIC_NS#endif // BOOST_SPIRIT_REFACTORING_HPP

⌨️ 快捷键说明

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