rule_parser.hpp

来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 1,143 行 · 第 1/4 页

HPP
1,143
字号
#   include <boost/spirit/home/classic/core/parser.hpp>// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -#   include <boost/preprocessor/cat.hpp>#   include <boost/preprocessor/seq/seq.hpp>#   include <boost/preprocessor/seq/for_each_i.hpp>#   include <boost/preprocessor/tuple/eat.hpp>#   include <boost/preprocessor/tuple/to_seq.hpp>#   include <boost/preprocessor/array/size.hpp>#   include <boost/preprocessor/control/if.hpp>#   include <boost/preprocessor/control/iif.hpp>#   include <boost/preprocessor/control/expr_iif.hpp>#   include <boost/preprocessor/logical/or.hpp>#   include <boost/preprocessor/logical/nor.hpp>#   include <boost/preprocessor/logical/not.hpp>#   include <boost/preprocessor/logical/compl.hpp>#   include <boost/preprocessor/arithmetic/inc.hpp>#   include <boost/preprocessor/arithmetic/dec.hpp>#   include <boost/preprocessor/arithmetic/add.hpp>#   include <boost/preprocessor/detail/is_unary.hpp>#   include <boost/preprocessor/detail/is_binary.hpp>#   include <boost/preprocessor/repetition/repeat.hpp>#   include <boost/preprocessor/repetition/enum_params.hpp>#   include <boost/preprocessor/repetition/enum_binary_params.hpp>#   include <boost/preprocessor/repetition/enum_shifted_params.hpp>#   include <boost/preprocessor/repetition/enum_trailing_params.hpp>#   include <boost/preprocessor/punctuation/comma.hpp>#   include <boost/preprocessor/punctuation/comma_if.hpp>#   include <boost/preprocessor/facilities/empty.hpp>#   include <boost/preprocessor/facilities/identity.hpp>#   include <boost/preprocessor/facilities/intercept.hpp>//==============================================================================// Interface//==============================================================================// Creates a rule parser. Use at namespace scope.#   define BOOST_SPIRIT_RULE_PARSER(name,params,actions,members,rule)          \      BOOST_SPIRIT_RP_IMPL_I(name,params,actions,members,rule)// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// Creates a non-templated rule parser. Use at namespace scope.#   define BOOST_SPIRIT_OPAQUE_RULE_PARSER(name,params,members,rule)           \      BOOST_SPIRIT_RP_OPAQUE_IMPL_I(name,params,members,rule)// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// Defines an action placeholder. Use at namespace scope.#   define BOOST_SPIRIT_ACTION_PLACEHOLDER(name)                               \      BOOST_SPIRIT_RP_AP_IMPL(name,::BOOST_SPIRIT_CLASSIC_NS::type_of)// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// Utilities to embed parsers by reference.namespace boost{  namespace spirit  {    BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN    template<class P> class parser_reference;    template<class P> parser_reference<P> embed_by_reference(parser<P> const &);    BOOST_SPIRIT_CLASSIC_NAMESPACE_END  }}//==============================================================================// Implementation//==============================================================================#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// RP_REGISTER_TEMPLATE//// Boost.Typeof registration from within BOOST_SPIRIT__NAMESPACE #   define BOOST_SPIRIT_RP_REGISTER_TEMPLATE(name,params)                      \      BOOST_SPIRIT_RP_EMIT(NS_CLOSE,BOOST_SPIRIT__NAMESPACE,-)                 \    BOOST_TYPEOF_REGISTER_TEMPLATE(                                            \        BOOST_SPIRIT_RP_EMIT(NS_QUALIFY,BOOST_SPIRIT__NAMESPACE,-) name,       \        params)                                                                \      BOOST_SPIRIT_RP_EMIT(NS_OPEN,BOOST_SPIRIT__NAMESPACE,-)     // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// RP_REGISTER_TYPE//// Boost.Typeof registration from within BOOST_SPIRIT__NAMESPACE #   define BOOST_SPIRIT_RP_REGISTER_TYPE(name)                                 \      BOOST_SPIRIT_RP_EMIT(NS_CLOSE,BOOST_SPIRIT__NAMESPACE,-)                 \    BOOST_TYPEOF_REGISTER_TYPE(                                                \        BOOST_SPIRIT_RP_EMIT(NS_QUALIFY,BOOST_SPIRIT__NAMESPACE,-) name )      \      BOOST_SPIRIT_RP_EMIT(NS_OPEN,BOOST_SPIRIT__NAMESPACE,-)     // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// RP_AP_IMPL//// The action placeholder definition#   define BOOST_SPIRIT_RP_AP_IMPL(name,ns)                                    \      namespace __action_placeholder                                           \      {                                                                        \        struct name                                                            \        {                                                                      \          template<typename Action>                                            \          ns :: action_chain< name, ns :: replace, Action>                     \          operator=(Action const & __a) const                                  \          { return ns :: action_chain< name, ns :: replace, Action>(__a); }    \                                                                               \          template<typename Action>                                            \          ns :: action_chain< name, ns :: append, Action>                      \          operator+=(Action const & __a) const                                 \          { return ns :: action_chain< name, ns :: append, Action> (__a); }    \        };                                                                     \      }                                                                        \      __action_placeholder:: name const name = __action_placeholder:: name (); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// RP_IMPL_I//// Does some precalculation so RP_IMPL_II can look cleaner#   define BOOST_SPIRIT_RP_IMPL_I(name,pars,acts,mbrs,expr)                    \      BOOST_SPIRIT_RP_IMPL_II(name, name ## _t ,                               \                              pars, BOOST_SPIRIT_RP_ARRAY_SIZE(pars),          \                              acts, BOOST_SPIRIT_RP_ARRAY_SIZE(acts),          \                              mbrs, BOOST_SPIRIT_RP_ARRAY_SIZE(mbrs), expr)// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// RP_IMPL_II#   define BOOST_SPIRIT_RP_IMPL_II(name,name_t,pars,np,acts,na,mbrs,nm,x)      \      BOOST_PP_IIF(BOOST_PP_OR(np,na),BOOST_SPIRIT_RP_IMPL_III,                \                                      BOOST_SPIRIT_RP_OPAQUE_IMPL_II)          \                                         (name,name_t,pars,np,acts,na,mbrs,nm,x)// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// RP_IMPL_III//// The rule parser definition#   define BOOST_SPIRIT_RP_IMPL_III(name,name_t,pars,np,acts,na,mbrs,nm,x)     \                                                                               \      template< BOOST_SPIRIT_RP_TPL_PARAMS(pars,acts,typename __,1) >          \      class name_t                                                             \        : public ::BOOST_SPIRIT_CLASSIC_NS::parser< name_t                               \                       < BOOST_SPIRIT_RP_TPL_PARAMS(pars,acts,__,0) > >        \      {                                                                        \        class __rule                                                           \        {                                                                      \          BOOST_SPIRIT_RP_EMIT(PM_STATIC,pars,__T)                             \          BOOST_SPIRIT_RP_EMIT(AP_STATIC,acts,-)                               \          BOOST_SPIRIT_RP_EMIT(MV_STATIC,mbrs,BOOST_PP_IDENTITY(typename))     \        public:                                                                \          BOOST_TYPEOF_NESTED_TYPEDEF_TPL(__expr,                              \            ::BOOST_SPIRIT_CLASSIC_NS::type_of::depend_on_type<__Dummy>(x) );            \        };                                                                     \                                                                               \      public:                                                                  \                                                                               \        typedef name_t self_t;                                                 \        typedef typename __rule::__expr::type::parser_category_t               \                                                           parser_category_t;  \                                                                               \        BOOST_PP_EXPR_IIF(BOOST_PP_NOR(np,na),typedef self_t const & embed_t;) \                                                                               \      protected:                                                               \                                                                               \        BOOST_SPIRIT_RP_EMIT(MV_NONSTATIC,mbrs,BOOST_PP_IDENTITY(typename))    \        BOOST_SPIRIT_RP_IF(na,SPIRIT_RP_AP_EXTRA_MBRS,2)(np,na)                \                                                                               \        typename __rule::__expr::type::embed_t __parser;                       \                                                                               \      public:                                                                  \                                                                               \        explicit name_t ( BOOST_SPIRIT_RP_CTOR(PARAMS,pars,np,acts) )          \          : BOOST_SPIRIT_RP_EMIT(MV_CTOR_INIT_LIST,mbrs,-)                     \          BOOST_PP_COMMA_IF(nm)                                                \          BOOST_SPIRIT_RP_IF(na,SPIRIT_RP_CTOR_COMMA,4)(INIT_LIST,pars,np,acts)\            __parser(x)                                                        \        { }                                                                    \                                                                               \        name_t( name_t const & that)                                           \          : BOOST_SPIRIT_RP_EMIT(MV_CTOR_COPY_INIT_LIST,mbrs,that)             \          BOOST_PP_COMMA_IF(nm)                                                \          BOOST_SPIRIT_RP_IF(na,SPIRIT_RP_CTOR_COMMA,4)                        \                                                 (COPY_INIT_LIST,pars,np,acts) \            __parser(that.__parser)                                            \        { }                                                                    \                                                                               \        template<typename Scanner> struct result                               \        {                                                                      \          typedef typename ::BOOST_SPIRIT_CLASSIC_NS::parser_result<                     \                           typename __rule::__expr::type, Scanner>::type type; \        };                                                                     \                                                                               \        template<typename Scanner>                                             \        typename ::BOOST_SPIRIT_CLASSIC_NS::parser_result<self_t, Scanner>::type         \        parse(Scanner const & s) const { return __parser.parse(s); }           \                                                                               \        BOOST_SPIRIT_RP_IF(na,SPIRIT_RP_AP_HANDLER,5)                          \                                  (name_t,np,acts,na,::BOOST_SPIRIT_CLASSIC_NS::type_of) \      };                                                                       \                                                                               \      BOOST_PP_IF(np,BOOST_SPIRIT_RP_GEN_FUNC,BOOST_SPIRIT_RP_GLOB_VAR)        \                                                           (name,name_t,np,na) \      BOOST_SPIRIT_RP_REGISTER_TEMPLATE                                        \        (name_t,BOOST_PP_INC(BOOST_PP_ADD(np,na))) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// RP_OPAQUE_IMPL_I//#   define BOOST_SPIRIT_RP_OPAQUE_IMPL_I(name,pars,mbrs,expr)                  \      BOOST_SPIRIT_RP_OPAQUE_IMPL_II(name, name ## _t,                         \                                     pars,BOOST_SPIRIT_RP_ARRAY_SIZE(pars),-,-,\                                     mbrs,BOOST_SPIRIT_RP_ARRAY_SIZE(mbrs),expr)// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// RP_OPAQUE_IMPL_II//#   define BOOST_SPIRIT_RP_OPAQUE_IMPL_II(name,name_t,pars,np,_1,_2,mbrs,nm,x) \      class name_t;                                                            \                                                                               \      BOOST_SPIRIT_RP_REGISTER_TYPE(name_t)                                    \                                                                               \      class name_t                                                             \        : public ::BOOST_SPIRIT_CLASSIC_NS::parser< name_t >                             \      {                                                                        \        class __rule                                                           \        {                                                                      \          BOOST_SPIRIT_RP_EMIT(PM_OPAQUE_STATIC,pars,-)                        \          BOOST_SPIRIT_RP_EMIT(MV_STATIC,mbrs,BOOST_PP_EMPTY)                  \        public:                                                                \          BOOST_TYPEOF_NESTED_TYPEDEF(__expr,x)  ;                             \        };                                                                     \                                                                               \      public:                                                                  \                                                                               \        typedef name_t self_t;                                                 \        typedef __rule::__expr::type::parser_category_t parser_category_t;     \        BOOST_PP_EXPR_IIF(BOOST_PP_NOT(np),typedef self_t const & embed_t;)    \                                                                               \      protected:                                                               \                                                                               \        BOOST_SPIRIT_RP_EMIT(MV_NONSTATIC,mbrs,BOOST_PP_EMPTY)                 \                                                                               \        __rule::__expr::type::embed_t __parser;                                \                                                                               \      public:                                                                  \                                                                               \        explicit name_t (BOOST_SPIRIT_RP_EMIT(PM_OPAQUE_CTOR_PARAMS,pars,-))   \          : BOOST_SPIRIT_RP_EMIT(MV_CTOR_INIT_LIST,mbrs,-)                     \            BOOST_PP_COMMA_IF(nm) __parser(x)                                  \        { }                                                                    \                                                                               \        name_t(name_t const & that)                                            \          : BOOST_SPIRIT_RP_EMIT(MV_CTOR_COPY_INIT_LIST,mbrs,that)             \            BOOST_PP_COMMA_IF(nm) __parser(that.__parser)                      \        { }                                                                    \                                                                               \        template<typename Scanner> struct result                               \        {                                                                      \          typedef typename ::BOOST_SPIRIT_CLASSIC_NS::parser_result<                     \                                   __rule::__expr::type, Scanner>::type type;  \        };                                                                     \                                                                               \        template<typename Scanner>                                             \        typename ::BOOST_SPIRIT_CLASSIC_NS::parser_result<self_t, Scanner>::type         \        parse(Scanner const & s) const { return __parser.parse(s); }           \      };                                                                       \                                                                               \      BOOST_PP_IF(np,BOOST_SPIRIT_RP_GEN_OPAQUE,BOOST_SPIRIT_RP_GLOB_OPAQUE)   \                                                         (name,name_t,np,pars)// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// RP_AP_HANDLER //// Part of the rule parser definition for handling action placeholders#   define BOOST_SPIRIT_RP_AP_HANDLER(name_t,np,acts,na,ns)                    \      private:                                                                 \        template<typename A> struct __rebound_1st                              \        {                                                                      \          typedef name_t < void BOOST_PP_ENUM_TRAILING_PARAMS(np,__T) ,        \            typename ns ::action_concatenator<__A0,A>::type                    \            BOOST_PP_COMMA_IF(BOOST_PP_DEC(na))                                \            BOOST_PP_ENUM_SHIFTED_PARAMS(na,__A)                               \          > type;                                                              \        };                                                                     \                                                                               \        template<typename X> struct __rebound                                  \        {                                                                      \          typedef name_t <                                                     \            void BOOST_PP_ENUM_TRAILING_PARAMS(np,__T)                         \            BOOST_SPIRIT_RP_EMIT(AP_REBOUND_TPL_ARGS,acts,X)                   \          > type;                                                              \        };                                                                     \      public:                                                                  \        template<typename A>                                                   \        typename __rebound_1st<A>::type const operator[](A const & a) const    \        {                                                                      \          return typename __rebound_1st<A>::type (                             \            BOOST_PP_ENUM_PARAMS(np,__p) BOOST_PP_COMMA_IF(np)                 \            ns ::concatenate_actions(__a0,a)                                   \            BOOST_PP_COMMA_IF(BOOST_PP_DEC(na))                                \            BOOST_PP_ENUM_SHIFTED_PARAMS(na,__a) );                            \        }                                                                      \        template<class PH, ns ::action_chain_mode M, typename A>               \        typename __rebound< ns ::action_chain<PH,M,A> >::type const            \        operator[]( ns ::action_chain<PH,M,A> const & x) const                 \

⌨️ 快捷键说明

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