rule_parser.hpp

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

HPP
1,143
字号
        {                                                                      \          return typename __rebound< ns ::action_chain<PH,M,A> >::type (       \            BOOST_PP_ENUM_PARAMS(np,__p) BOOST_PP_COMMA_IF(np)                 \            BOOST_SPIRIT_RP_EMIT(AP_REBOUND_ARGS,acts,x) );                    \        }                                                                      \        template<class Head, class Tail>                                       \        typename __rebound< ns ::action_chains<Head,Tail> >::type const        \        operator[]( ns ::action_chains<Head,Tail> const & x) const             \        {                                                                      \          return typename __rebound< ns ::action_chains<Head,Tail> >::type (   \            BOOST_PP_ENUM_PARAMS(np,__p) BOOST_PP_COMMA_IF(np)                 \            BOOST_SPIRIT_RP_EMIT(AP_REBOUND_ARGS,acts,x) );                    \        }// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// RP_AP_EXTRA_MBRS//// Extra members we need for rebinding if there are action placeholders#   define BOOST_SPIRIT_RP_AP_EXTRA_MBRS(np,na)                                \      private:                                                                 \        BOOST_PP_REPEAT(np,BOOST_SPIRIT_RP_PM_MBRS,-)                          \        BOOST_PP_REPEAT(na,BOOST_SPIRIT_RP_AP_MBRS,-) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// RP_PM_MBRS//// Member variables to remember parameters if there are action placeholder#   define BOOST_SPIRIT_RP_PM_MBRS(z,i,d) __T ## i __p ## i ;// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// RP_AP_MBRS//// Member variables to remember action placeholder substitutes#   define BOOST_SPIRIT_RP_AP_MBRS(z,i,d) __A ## i __a ## i ;// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// RP_CTOR//// Expands to a fragment of a constructor (parameters or init-list)#   define BOOST_SPIRIT_RP_CTOR(what,pars,np,acts)                             \      BOOST_SPIRIT_RP_EMIT(PM_CTOR_ ## what,pars,__T)                          \      BOOST_SPIRIT_RP_EMIT(AP_CTOR_ ## what,acts,np)// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// RP_CTOR_COMMA//// RP_CTOR with a trailing comma#   define BOOST_SPIRIT_RP_CTOR_COMMA(what,pars,np,acts)                       \      BOOST_SPIRIT_RP_CTOR(what,pars,np,acts) ,// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// RP_TPL_PARAMS//// Expands to the template parameters or arguments of the rule parser template #   define BOOST_SPIRIT_RP_TPL_PARAMS(pars,acts,prefix,defaults)               \      prefix ## Dummy                                                          \      BOOST_SPIRIT_RP_EMIT(PM_TEMPLATE_PARAMS,pars,prefix ## T)                \      BOOST_SPIRIT_RP_EMIT(AP_TEMPLATE_PARAMS,acts,(prefix ## A,defaults))// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// RP_GEN_FUNC//// Generator function#   define BOOST_SPIRIT_RP_GEN_FUNC(name,name_t,np,na)                         \      template< BOOST_PP_ENUM_PARAMS(np,typename T) >                          \      inline name_t < void BOOST_PP_ENUM_TRAILING_PARAMS(np,T) >               \      name( BOOST_PP_ENUM_BINARY_PARAMS(np,T, const & p) )                     \      { return name_t < void BOOST_PP_ENUM_TRAILING_PARAMS(np,T) >             \                 (BOOST_PP_ENUM_PARAMS(np,p) BOOST_PP_ENUM_TRAILING_PARAMS(na, \                ::BOOST_SPIRIT_CLASSIC_NS::type_of::nop_functor() BOOST_PP_INTERCEPT) ); \      }// RP_GEN_OPAQUE//// non-templated version for opaque rule parsers.#   define BOOST_SPIRIT_RP_GEN_OPAQUE(name,name_t,np,pars)                     \      inline name_t name( BOOST_SPIRIT_RP_EMIT(PM_OPAQUE_GEN_PARAMS,pars,p))   \      { return name_t (BOOST_PP_ENUM_PARAMS(np,p)); }// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// RP_GLOB_VAR//// Global variable -- used instead of the generator function if there are no// parameters#   define BOOST_SPIRIT_RP_GLOB_VAR(name,name_t,np,na)                         \      static name_t <void> const name = name_t <void>(BOOST_PP_ENUM_PARAMS(na, \                ::BOOST_SPIRIT_CLASSIC_NS::type_of::nop_functor() BOOST_PP_INTERCEPT) );// RP_GLOB_OPAQUE//// non-templated version for opaque rule parsers.#   define BOOST_SPIRIT_RP_GLOB_OPAQUE(name,name_t,np,pars)                    \      static name_t const name = name_t () ;// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// PP_EMIT operations (fragment emittion based on array input)// - - Namespace handling// NS_OPEN#   define BOOST_SPIRIT_RP__NS_OPEN(r,data,i,elem)                             \      namespace BOOST_SPIRIT_RP_OPTIONAL(elem) {// NS_QUALIFY#   define BOOST_SPIRIT_RP__NS_QUALIFY(r,data,i,elem)                          \      BOOST_SPIRIT_RP_OPTIONAL(elem ::)// NS_CLOSE#   define BOOST_SPIRIT_RP__NS_CLOSE(r,data,i,elem) }// - - Parameter handling// PM_STATIC#   define BOOST_SPIRIT_RP__PM_STATIC(r,data,i,elem)                           \      static typename ::boost::call_traits< data ## i >::reference elem ;// PM_CTOR_PARAMS#   define BOOST_SPIRIT_RP__PM_CTOR_PARAMS(r,data,i,elem)                      \      BOOST_PP_COMMA_IF(i)                                                     \      typename ::boost::call_traits< data ## i >::param_type elem // PM_CTOR_ARGS#   define BOOST_SPIRIT_RP__PM_CTOR_ARGS(r,data,i,elem)                        \      BOOST_PP_COMMA_IF(i) elem// PM_CTOR_INIT_LIST#   define BOOST_SPIRIT_RP__PM_CTOR_INIT_LIST(r,data,i,elem)                   \      BOOST_PP_COMMA_IF(i) __p ## i ( elem )// PM_CTOR_COPY_INIT_LIST#   define BOOST_SPIRIT_RP__PM_CTOR_COPY_INIT_LIST(r,data,i,elem)              \      BOOST_PP_COMMA_IF(i) __p ## i ( that. __p ## i )// PM_TEMPLATE_PARAMS#   define BOOST_SPIRIT_RP__PM_TEMPLATE_PARAMS(r,data,i,elem) , data ## i// - strictly typed parameters of the opaque rule_parser// PM_OPAQUE_STATIC#   define BOOST_SPIRIT_RP__PM_OPAQUE_STATIC(r,data,i,elem)                    \      static ::boost::call_traits<                                             \          BOOST_SPIRIT_RP_TYPE(BOOST_PP_TUPLE_ELEM(2,0,elem))                  \        >::reference BOOST_PP_TUPLE_ELEM(2,1,elem) ;// PM_OPAQUE_CTOR_PARAMS#   define BOOST_SPIRIT_RP__PM_OPAQUE_CTOR_PARAMS(r,data,i,elem)               \      BOOST_PP_COMMA_IF(i) ::boost::call_traits<                               \          BOOST_SPIRIT_RP_TYPE(BOOST_PP_TUPLE_ELEM(2,0,elem))                  \        >::param_type BOOST_PP_TUPLE_ELEM(2,1,elem)// PM_OPAQUE_GEN_PARAMS#   define BOOST_SPIRIT_RP__PM_OPAQUE_GEN_PARAMS(r,data,i,elem)                \      BOOST_PP_COMMA_IF(i) ::boost::call_traits<                               \          BOOST_SPIRIT_RP_TYPE(BOOST_PP_TUPLE_ELEM(2,0,elem))                  \        >::param_type data ## i// - - Member variable handling// MV_NONSTATIC#   define BOOST_SPIRIT_RP__MV_NONSTATIC(r,data,i,elem)                        \      data() BOOST_SPIRIT_RP_TYPE(BOOST_PP_TUPLE_ELEM(3,0,elem))               \        BOOST_PP_TUPLE_ELEM(3,1,elem) ;// MV_STATIC#   define BOOST_SPIRIT_RP__MV_STATIC(r,data,i,elem)                           \      static data() ::boost::call_traits<                                      \            data() BOOST_SPIRIT_RP_TYPE(BOOST_PP_TUPLE_ELEM(3,0,elem))         \        >::reference BOOST_PP_TUPLE_ELEM(3,1,elem) ;// MV_CTOR_INIT_LIST#   define BOOST_SPIRIT_RP__MV_CTOR_INIT_LIST(r,data,i,elem)                   \      BOOST_PP_COMMA_IF(i)                                                     \      BOOST_PP_TUPLE_ELEM(3,1,elem) BOOST_PP_TUPLE_ELEM(3,2,elem)// MV_CTOR_COPY_INIT_LIST#   define BOOST_SPIRIT_RP__MV_CTOR_COPY_INIT_LIST(r,data,i,elem)              \      BOOST_PP_COMMA_IF(i)                                                     \      BOOST_PP_TUPLE_ELEM(3,1,elem) (data . BOOST_PP_TUPLE_ELEM(3,1,elem))// - - Action placeholder handling// AP_STATIC#   define BOOST_SPIRIT_RP__AP_STATIC(r,data,i,elem) static __A ## i & elem ;// AP_CTOR_PARAMS#   define BOOST_SPIRIT_RP__AP_CTOR_PARAMS(r,data,i,elem)                      \      BOOST_SPIRIT_RP_COMMA_IF_OR(data,i)                                      \      typename ::boost::call_traits< __A ## i >::param_type elem// AP_CTOR_ARGS#   define BOOST_SPIRIT_RP__AP_CTOR_ARGS(r,data,i,elem)                        \      BOOST_SPIRIT_RP_COMMA_IF_OR(data,i) elem// AP_CTOR_INIT_LIST#   define BOOST_SPIRIT_RP__AP_CTOR_INIT_LIST(r,data,i,elem)                   \      BOOST_SPIRIT_RP_COMMA_IF_OR(data,i) __a ## i ( elem )// AP_CTOR_COPY_INIT_LIST#   define BOOST_SPIRIT_RP__AP_CTOR_COPY_INIT_LIST(r,data,i,elem)              \      BOOST_SPIRIT_RP_COMMA_IF_OR(data,i) __a ## i ( that. __a ## i )// AP_TEMPLATE_PARAMS#   define BOOST_SPIRIT_RP__AP_TEMPLATE_PARAMS(r,data,i,elem)                  \      , BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM(2,0,data),i)                          \      BOOST_PP_EXPR_IIF(BOOST_PP_TUPLE_ELEM(2,1,data),                         \          = ::BOOST_SPIRIT_CLASSIC_NS::type_of::nop_functor)// AP_REBOUND_ARGS#   define BOOST_SPIRIT_RP__AP_REBOUND_ARGS(r,data,i,elem)                     \      BOOST_PP_COMMA_IF(i)                                                     \      ::BOOST_SPIRIT_CLASSIC_NS::type_of::get_placeholdee< __action_placeholder:: elem > \                                                           ( __a ## i , data )// AP_REBOUND_TPL_ARGS#   define BOOST_SPIRIT_RP__AP_REBOUND_TPL_ARGS(r,data,i,elem)                 \      , typename ::BOOST_SPIRIT_CLASSIC_NS::type_of::placeholdee<                        \                  __action_placeholder:: elem , __A ## i, data >::type // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// PP_EMIT//// Performs one of the operations in the above section on an optional array.//#   define BOOST_SPIRIT_RP_EMIT(op, array, data)                               \      BOOST_SPIRIT_RP_ARRAY_FOR_EACH_I(BOOST_SPIRIT_RP__ ## op,data,array)// --- --- - - --- - - --- - - - - --- - - - - - - - - - - - - - - - - - - - - -// RP_ARRAY_FOR_EACH_I //// Iterates an optional array. That is you can pass e.g.'-' or 'none' to denote// emptiness.#   define BOOST_SPIRIT_RP_ARRAY_FOR_EACH_I(macro,data,optional_array)         \      BOOST_PP_IIF(BOOST_PP_IS_BINARY(optional_array),                         \                   BOOST_SPIRIT_RP_ARRAY_FOR_EACH_I_IMPL,                      \                   BOOST_PP_TUPLE_EAT(3))(macro,data,optional_array)// RP_ARRAY_FOR_EACH_I_IMPL #   define BOOST_SPIRIT_RP_ARRAY_FOR_EACH_I_IMPL(macro,data,array)             \      BOOST_SPIRIT_RP_IF(BOOST_PP_ARRAY_SIZE(array),PP_SEQ_FOR_EACH_I,3)       \        (macro,data, BOOST_SPIRIT_RP_IF(BOOST_PP_ARRAY_SIZE(array),            \                                        PP_TUPLE_TO_SEQ,2) array)// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// RP_ARRAY_SIZE //// Expands to the size of an "optional array".//// Examples:////   BOOST_SPIRIT_RP_ARRAY_SIZE( (2,(a,b)) ) // 2//   BOOST_SPIRIT_RP_ARRAY_SIZE( (0,()) )    // 0//   BOOST_SPIRIT_RP_ARRAY_SIZE( none )      // 0//   BOOST_SPIRIT_RP_ARRAY_SIZE( - )         // 0//#   define BOOST_SPIRIT_RP_ARRAY_SIZE(optional_array)                          \      BOOST_PP_IIF(BOOST_PP_IS_BINARY(optional_array),                         \                   BOOST_PP_ARRAY_SIZE, 0 BOOST_PP_TUPLE_EAT(1))(optional_array)// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// RP_OPTIONAL// // Expands to nothing if the argument is parenthesized.//// Examples:////   BOOST_SPIRIT_RP_OPTIONAL( foobar ) // foobar//   BOOST_SPIRIT_RP_OPTIONAL( (none) ) // evaluates to nothing//#   define BOOST_SPIRIT_RP_OPTIONAL(elem)                                      \      BOOST_PP_EXPR_IIF(BOOST_PP_COMPL(BOOST_PP_IS_UNARY(elem)),elem) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// RP_COMMA_IF_OR//// Expands to nothing if both arguments are zero, otherwise expands to a comma.//#   define BOOST_SPIRIT_RP_COMMA_IF_OR(a,b)                                    \      BOOST_PP_IIF(BOOST_PP_OR(a,b),BOOST_PP_COMMA,BOOST_PP_EMPTY)()// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -// RP_IF////   BOOST_SPIRIT_RP_IF(cond,name,arity)//// is equivalent to:////   BOOST_PP_IF(cond,BOOST_name,BOOST_PP_TUPLE_EAT(arity))//#   define BOOST_SPIRIT_RP_IF(cond,name,arity) \      BOOST_PP_IF(cond,BOOST_ ## name,BOOST_PP_TUPLE_EAT(arity))//------------------------------------------------------------------------------// Wrapper and gernator function to embed a parser by reference//------------------------------------------------------------------------------namespace boost { namespace spirit { BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN  // Wrapper to embed a parser by reference

⌨️ 快捷键说明

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