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

📄 traverse.ipp

📁 Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
💻 IPP
字号:
/*=============================================================================    Copyright (c) 2002-2003 Joel de Guzman    Copyright (c) 2002-2003 Hartmut Kaiser    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_TRAVERSE_IPP)#define BOOST_SPIRIT_TRAVERSE_IPP///////////////////////////////////////////////////////////////////////////////#include <boost/spirit/home/classic/meta/fundamental.hpp>///////////////////////////////////////////////////////////////////////////////namespace boost { namespace spirit {BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN///////////////////////////////////////////////////////////////////////////////namespace impl{    template <typename CategoryT>    struct traverse_post_order_return_category;}   // namespace impl///////////////////////////////////////////////////////////////////////////////////  Environment class for post_order_traversal/////////////////////////////////////////////////////////////////////////////////template <int Level, int Node, int Index, int LastLeft>struct traverse_post_order_env {    BOOST_STATIC_CONSTANT(int, level = Level);    BOOST_STATIC_CONSTANT(int, node = Node);    BOOST_STATIC_CONSTANT(int, index = Index);    BOOST_STATIC_CONSTANT(int, lastleft = LastLeft);};///////////////////////////////////////////////////////////////////////////////////  traverse_post_order_return template////      This template is a helper for dispatching the calculation of a parser//      type result for a traversal level to the corresponding parser_category//      based specialization./////////////////////////////////////////////////////////////////////////////////template <typename MetaT, typename ParserT, typename EnvT>struct traverse_post_order_return {    typedef typename ParserT::parser_category_t parser_category_t;    typedef typename impl::traverse_post_order_return_category<parser_category_t>        ::template result<MetaT, ParserT, EnvT>::type type;};///////////////////////////////////////////////////////////////////////////////////  parser_traversal_..._result templates////      These are metafunctions, which calculate the resulting parser type//      for all subparsers and feed these types to the user supplied//      metafunctions to get back the resulting parser type of this traversal//      level./////////////////////////////////////////////////////////////////////////////////template <typename MetaT, typename ParserT, typename EnvT>struct parser_traversal_plain_result {    typedef typename MetaT::template plain_result<ParserT, EnvT>::type type;};///////////////////////////////////////////////////////////////////////////////template <typename MetaT, typename UnaryT, typename SubjectT, typename EnvT>struct parser_traversal_unary_result {    typedef typename MetaT        ::template unary_result<UnaryT, SubjectT, EnvT>::type type;};///////////////////////////////////////////////////////////////////////////////template <typename MetaT, typename ActionT, typename SubjectT, typename EnvT>struct parser_traversal_action_result {    typedef typename MetaT        ::template action_result<ActionT, SubjectT, EnvT>::type type;};///////////////////////////////////////////////////////////////////////////////template <    typename MetaT, typename BinaryT, typename LeftT,    typename RightT, typename EnvT>struct parser_traversal_binary_result {    BOOST_STATIC_CONSTANT(int,        thisnum = (node_count<BinaryT>::value + EnvT::lastleft-1));    BOOST_STATIC_CONSTANT(int,        leftnum = (node_count<LeftT>::value + EnvT::lastleft-1));    BOOST_STATIC_CONSTANT(int,        leafnum = (leaf_count<LeftT>::value + EnvT::index));    typedef parser_traversal_binary_result self_t;    // left traversal environment and resulting parser type    typedef traverse_post_order_env<                (EnvT::level+1), (self_t::leftnum), (EnvT::index), (EnvT::lastleft)            > left_sub_env_t;    typedef typename traverse_post_order_return<                MetaT, LeftT, left_sub_env_t            >::type        left_t;    // right traversal environment and resulting parser type    typedef traverse_post_order_env<                (EnvT::level+1), (self_t::thisnum-1), (self_t::leafnum), (self_t::leftnum+1)            > right_sub_env_t;    typedef typename traverse_post_order_return<                MetaT, RightT, right_sub_env_t            >::type        right_t;    typedef typename MetaT::template binary_result<                BinaryT, left_t, right_t, EnvT            >::type        type;};///////////////////////////////////////////////////////////////////////////////namespace impl{    ///////////////////////////////////////////////////////////////////////////    //    //  Meta functions, which dispatch the calculation of the return type of    //  of the post_order traverse function to the result template of the    //  corresponding parser_category based metafunction template.    //    ///////////////////////////////////////////////////////////////////////////    template <typename CategoryT>    struct traverse_post_order_return_category;    template <>    struct traverse_post_order_return_category<plain_parser_category> {        template <typename MetaT, typename ParserT, typename EnvT>        struct result {            typedef typename parser_traversal_plain_result<                        MetaT, ParserT, EnvT                    >::type                type;        };    };    template <>    struct traverse_post_order_return_category<unary_parser_category> {        template <typename MetaT, typename ParserT, typename EnvT>        struct result {            typedef typename parser_traversal_unary_result<                        MetaT, ParserT, typename ParserT::subject_t, EnvT                    >::type                type;        };    };    template <>    struct traverse_post_order_return_category<action_parser_category> {        template <typename MetaT, typename ParserT, typename EnvT>        struct result {            typedef typename parser_traversal_action_result<                        MetaT, ParserT, typename ParserT::subject_t, EnvT                    >::type                type;        };    };    template <>    struct traverse_post_order_return_category<binary_parser_category> {        template <typename MetaT, typename ParserT, typename EnvT>        struct result {            typedef typename parser_traversal_binary_result<                        MetaT, ParserT, typename ParserT::left_t,                        typename ParserT::right_t, EnvT                    >::type                type;        };    };    ///////////////////////////////////////////////////////////////////////////    //    //  Post-order parser traversal    //    //      The following templates contain the parser_category based code for    //    //        - calculating the type of the resulting parser, which is to be    //          returned from a level of traversal    //        - traversing down the composite parser structure, this traversal    //          returnes a new parser object    //    //      Both tasks are delegated to the MetaT metafunction supplied by the    //      user.    //    ///////////////////////////////////////////////////////////////////////////    template <typename CategoryT>    struct traverse_post_order;    template <>    struct traverse_post_order<plain_parser_category> {        template <typename MetaT, typename ParserT, typename EnvT>        struct result {            typedef                typename parser_traversal_plain_result<MetaT, ParserT, EnvT>::type                type;        };        template <typename MetaT, typename ParserT, typename EnvT>        static        typename parser_traversal_plain_result<MetaT, ParserT, EnvT>::type        generate(MetaT const &meta_, ParserT const &parser_, EnvT const &env)        {            return meta_.generate_plain(parser_, env);        }    };    template <>    struct traverse_post_order<unary_parser_category> {        template <            typename MetaT, typename ParserT, typename SubjectT, typename EnvT        >        struct result {            typedef typename parser_traversal_unary_result<                        MetaT, ParserT, SubjectT, EnvT                    >::type                type;        };        template <typename MetaT, typename ParserT, typename EnvT>        static        typename parser_traversal_unary_result<            MetaT, ParserT,             typename traverse_post_order_return<                MetaT, typename ParserT::subject_t, EnvT            >::type,            EnvT        >::type        generate(MetaT const &meta_, ParserT const &unary_, EnvT const &env)        {            typedef typename ParserT::subject_t             subject_t;            typedef typename subject_t::parser_category_t   subject_category_t;            return meta_.generate_unary(                unary_,                traverse_post_order<subject_category_t>::generate(meta_,                    unary_.subject(),                    traverse_post_order_env<                        EnvT::level+1, EnvT::node-1, EnvT::index, EnvT::lastleft                    >()                ),                env            );        }    };    template <>    struct traverse_post_order<action_parser_category> {        template <            typename MetaT, typename ParserT, typename SubjectT, typename EnvT        >        struct result {            typedef typename parser_traversal_action_result<                        MetaT, ParserT, SubjectT, EnvT                    >::type                type;        };        template <typename MetaT, typename ParserT, typename EnvT>        static        typename parser_traversal_action_result<            MetaT, ParserT,             typename traverse_post_order_return<                MetaT, typename ParserT::subject_t, EnvT            >::type,            EnvT        >::type        generate(MetaT const &meta_, ParserT const &action_, EnvT const &env)        {            typedef typename ParserT::subject_t             subject_t;            typedef typename subject_t::parser_category_t   subject_category_t;            return meta_.generate_action(                action_,                traverse_post_order<subject_category_t>::generate(meta_,                    action_.subject(),                    traverse_post_order_env<                        EnvT::level+1, EnvT::node-1, EnvT::index, EnvT::lastleft                    >()                ),                env            );        }    };    template <>    struct traverse_post_order<binary_parser_category> {        template <            typename MetaT, typename ParserT, typename LeftT,            typename RightT, typename EnvT        >        struct result {            typedef typename parser_traversal_binary_result<                        MetaT, ParserT, LeftT, RightT, EnvT                    >::type                type;        };        template <typename MetaT, typename ParserT, typename EnvT>        static        typename parser_traversal_binary_result<            MetaT, ParserT,             typename traverse_post_order_return<                MetaT, typename ParserT::left_t, EnvT            >::type,            typename traverse_post_order_return<                MetaT, typename ParserT::right_t, EnvT            >::type,            EnvT        >::type        generate(MetaT const &meta_, ParserT const &binary_, EnvT const& /*env*/)        {            typedef typename ParserT::left_t                left_t;            typedef typename ParserT::right_t               right_t;            typedef typename left_t::parser_category_t      left_category_t;            typedef typename right_t::parser_category_t     right_category_t;            enum {                leftnum = (node_count<left_t>::value + EnvT::lastleft-1),                thisnum = (node_count<ParserT>::value + EnvT::lastleft-1),                rightnum = (thisnum-1),                leafnum = (leaf_count<left_t>::value + EnvT::index)            };            return meta_.generate_binary(                binary_,                traverse_post_order<left_category_t>::generate(                    meta_, binary_.left(),                    traverse_post_order_env<                        EnvT::level+1, leftnum, EnvT::index, EnvT::lastleft                    >()                ),                traverse_post_order<right_category_t>::generate(                    meta_, binary_.right(),                    traverse_post_order_env<                        EnvT::level+1, rightnum, leafnum, leftnum+1                    >()                ),                traverse_post_order_env<                    EnvT::level, thisnum, EnvT::index, EnvT::lastleft                >()            );        }    };}   //  namespace impl///////////////////////////////////////////////////////////////////////////////BOOST_SPIRIT_CLASSIC_NAMESPACE_END}} // namespace boost::spirit#endif // !defined(BOOST_SPIRIT_TRAVERSE_IPP)

⌨️ 快捷键说明

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