rule_parser.hpp

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

HPP
1,143
字号
  template<class P> class parser_reference     : public parser< parser_reference<P> >  {    P const & ref_that;  public:    parser_reference(P & that)    // we allow implicit conversion but forbid temporaries.      : ref_that(that)    { }    typedef parser_reference<P>           self_t;    typedef self_t const &                embed_t;     typedef typename P::parser_category_t parser_category_t;    template<typename ScannerT> struct result     { typedef typename P::BOOST_NESTED_TEMPLATE result<ScannerT>::type type; };    template<typename ScannerT>     typename result<ScannerT>::type    parse(ScannerT const & scan) const    { return this->ref_that.parse(scan); }  };  template<class P> parser_reference<P>   embed_by_reference(::BOOST_SPIRIT_CLASSIC_NS::parser<P> & p)  { return p; }BOOST_SPIRIT_CLASSIC_NAMESPACE_END} } // namespace ::BOOST_SPIRIT_CLASSIC_NSBOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::parser_reference, 1)//------------------------------------------------------------------------------// Expression templates for action placeholders.//------------------------------------------------------------------------------namespace boost { namespace spirit { BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGINnamespace type_of {   // No-operation functor  struct nop_functor   {    template<typename T>    bool operator()(T const &) const     { return false; }    template<typename T, typename U>    bool operator()(T const &, U const &) const    { return false; }    typedef bool result_type;  };  // Composite action  template<typename Action1, typename Action2>  class composite_action  {    Action1 fnc_a1;    Action2 fnc_a2;  public:    composite_action(Action1 const & a1, Action2 const & a2)      : fnc_a1(a1), fnc_a2(a2)    { }    template<typename T>    void operator()(T const & inp) const    { fnc_a1(inp); fnc_a2(inp); }    template<typename T, typename U>    void operator()(T const & inp1, U const inp2) const    { fnc_a1(inp1, inp2); fnc_a2(inp1, inp2); }  };  // Action concatenation (and optimize away nop_functorS)  template<typename Action1, typename Action2>  struct action_concatenator  {    typedef composite_action<Action1,Action2> type;    static type concatenate(Action1 const & a1, Action2 const & a2)    { return composite_action<Action1,Action2>(a1,a2); }  };  template<typename Action> struct action_concatenator<nop_functor, Action>  {    typedef Action type;    static type concatenate(nop_functor const &, Action const & a)     { return a; }  };  template<typename Action> struct action_concatenator<Action, nop_functor>  {    typedef Action type;    static type concatenate(Action const & a, nop_functor const &)     { return a; }  };  template<> struct action_concatenator<nop_functor, nop_functor>  {    typedef nop_functor type;    static type concatenate(nop_functor const &, nop_functor const &)     { return nop_functor(); }  };  template<typename Action1, typename Action2>  typename action_concatenator<Action1,Action2>::type   concatenate_actions(Action1 const & a1, Action2 const & a2)  {    return action_concatenator<Action1,Action2>::concatenate(a1,a2);  }  // Action chains  enum action_chain_mode { replace, append };  template<class Placeholder, action_chain_mode Mode, typename Action>  class action_chain  {    Action fnc_action;  public:    action_chain(Action const & a)      : fnc_action(a)    { }    typedef Action action_type;    Action const & action() const { return fnc_action; }  };  // This operator adds actions to an action chain definition  template<class PH, action_chain_mode M, typename A1, typename A2>  action_chain<PH, M, typename action_concatenator<A1,A2>::type>  operator, (action_chain<PH,M,A1> const & chain, A2 const & a)  {    return action_chain<PH,M,typename action_concatenator<A1,A2>::type>        ( concatenate_actions(chain.action(), a) );  }  // Expression template for mutiple action chain assignments  template<class ChainOrChains, class LastChain>  class action_chains  {    ChainOrChains obj_head;    LastChain     obj_tail;  public:    action_chains(ChainOrChains const & head, LastChain const & tail)      : obj_head(head), obj_tail(tail)    { }    typedef ChainOrChains head_type;    typedef LastChain     tail_type;    head_type const & head() const { return obj_head; }    tail_type const & tail() const { return obj_tail; }  };   // Action chain concatenation  template<class Head, class Tail>  action_chains<Head,Tail> make_chain(Head const & h, Tail const & t)  { return action_chains<Head,Tail>(h,t); }  template<class PH1, action_chain_mode M1, typename A1,             class PH2, action_chain_mode M2, typename A2>  action_chains< action_chain<PH1,M1,A1>, action_chain<PH2,M2,A2> >  operator, (action_chain<PH1,M1,A1> const & h,              action_chain<PH2,M2,A2> const & t)  { return make_chain(h,t); }  template<class Head, class Tail,class PH, action_chain_mode M, typename A>  action_chains< action_chains<Head,Tail>, action_chain<PH,M,A> >  operator, (action_chains<Head,Tail> const & h, action_chain<PH,M,A> const & t)  { return make_chain(h,t); }  // Extract the (maybe composite) action associated with an action   // placeholders from the chains with a fold algorithm.  template<class Placeholder, typename StartAction, class NewChainOrChains>  struct placeholdee  {    typedef StartAction type;     static type get(StartAction const & a, NewChainOrChains const &)    { return a; }  };  template<class Placeholder, // <-- non-deduced           typename StartAction, class NewChainOrChains>  typename placeholdee<Placeholder,StartAction,NewChainOrChains>::type  get_placeholdee(StartAction const & a, NewChainOrChains const & c)  { return placeholdee<Placeholder,StartAction,NewChainOrChains>::get(a,c); }  template<class Placeholder, typename StartAction, class Head, class Tail>   struct placeholdee            < Placeholder, StartAction, action_chains<Head,Tail> >  {    typedef typename placeholdee<Placeholder,      typename placeholdee<Placeholder,StartAction,Head>::type, Tail >::type    type;    static type get(StartAction const & a, action_chains<Head,Tail> const & c)    {      return get_placeholdee<Placeholder>(        get_placeholdee<Placeholder>(a,c.head()), c.tail() );    }  };  template<class Placeholder, typename StartAction, typename A>  struct placeholdee            < Placeholder, StartAction, action_chain<Placeholder,replace,A> >  {    typedef A type;    static type get(StartAction const &,                     action_chain<Placeholder,replace,A> const & c)    { return c.action(); }  };  template<class Placeholder, typename StartAction, typename A>  struct placeholdee            < Placeholder, StartAction, action_chain<Placeholder,append,A> >  {    typedef typename action_concatenator<StartAction,A>::type type;    static type get(StartAction const & a,                     action_chain<Placeholder,append,A> const & c)    { return concatenate_actions(a,c.action()); }  };} BOOST_SPIRIT_CLASSIC_NAMESPACE_END} } // namespace ::BOOST_SPIRIT_CLASSIC_NS::type_ofBOOST_TYPEOF_REGISTER_TYPE(BOOST_SPIRIT_CLASSIC_NS::type_of::nop_functor)BOOST_TYPEOF_REGISTER_TEMPLATE(BOOST_SPIRIT_CLASSIC_NS::type_of::composite_action,2)//------------------------------------------------------------------------------// Misc.utilities//------------------------------------------------------------------------------namespace boost { namespace spirit { BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGINnamespace type_of {  // Utility function to create a dependency to a template argument.  template<typename T, typename X>  X const & depend_on_type(X const & x)   { return x; }  // Utility to allow use parenthesized type expressions with commas inside  // as a type within macros. Thanks to Dave Abrahams for telling me this nice  // trick.  #define BOOST_SPIRIT_RP_TYPE(x) \    ::BOOST_SPIRIT_CLASSIC_NS::type_of::remove_special_fptr \      < ::BOOST_SPIRIT_CLASSIC_NS::type_of::special_result & (*) x >::type  struct special_result;  template<typename T> struct remove_special_fptr { };  template<typename T> struct remove_special_fptr< special_result & (*)(T) >  { typedef T type; };} BOOST_SPIRIT_CLASSIC_NAMESPACE_END} } // namespace ::BOOST_SPIRIT_CLASSIC_NS::type_of//------------------------------------------------------------------------------#endif //------------------------------------------------------------------------------

⌨️ 快捷键说明

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