📄 rule_parser.hpp
字号:
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 \
{ \
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::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::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::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::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::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:
//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -