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 + -
显示快捷键?