📄 rule.ipp
字号:
/////////////////////////////////////////////////////////////////////// template <typename ScannerT, typename AttrT> struct abstract_parser { abstract_parser() {} virtual ~abstract_parser() {} virtual typename match_result<ScannerT, AttrT>::type do_parse_virtual(ScannerT const& scan) const = 0; virtual abstract_parser* clone() const = 0; }; /////////////////////////////////////////////////////////////////////// // // concrete_parser class // /////////////////////////////////////////////////////////////////////// template <typename ParserT, typename ScannerT, typename AttrT> struct concrete_parser : abstract_parser<ScannerT, AttrT> { concrete_parser(ParserT const& p) : p(p) {} virtual ~concrete_parser() {} virtual typename match_result<ScannerT, AttrT>::type do_parse_virtual(ScannerT const& scan) const { return p.parse(scan); } virtual abstract_parser<ScannerT, AttrT>* clone() const { return new concrete_parser(p); } typename ParserT::embed_t p; };#if BOOST_SPIRIT_RULE_SCANNERTYPE_LIMIT > 1 /////////////////////////////////////////////////////////////////////// // // This generates partial specializations for the class // // abstract_parser // // with an increasing number of different ScannerT template parameters // and corresponding do_parse_virtual function declarations for each // of the different required scanner types: // // template <typename ScannerT0, ..., typename AttrT> // struct abstract_parser<scanner_list<ScannerT0, ...>, AttrT> // { // abstract_parser() {} // virtual ~abstract_parser() {} // // virtual typename match_result<ScannerT0, AttrT>::type // do_parse_virtual(ScannerT0 const &scan) const = 0; // // virtual abstract_parser* // clone() const = 0; // // ... // }; // /////////////////////////////////////////////////////////////////////// #define BOOST_SPIRIT_RULE_ENUM_DOPARSE_A(z, N, _) \ virtual typename match_result< \ BOOST_PP_CAT(ScannerT, N), AttrT \ >::type \ do_parse_virtual( \ BOOST_PP_CAT(ScannerT, N) const& scan) const = 0; \ #define BOOST_SPIRIT_ENUM_ABSTRACT_PARSERS(z, N, _) \ template < \ BOOST_PP_ENUM_PARAMS_Z(z, BOOST_PP_INC(N), typename ScannerT), \ typename AttrT \ > \ struct abstract_parser< \ scanner_list< \ BOOST_PP_ENUM_PARAMS_Z(z, BOOST_PP_INC(N), ScannerT) \ >, \ AttrT \ > \ { \ abstract_parser() {} \ virtual ~abstract_parser() {} \ \ BOOST_PP_REPEAT_ ## z( \ BOOST_PP_INC(N), BOOST_SPIRIT_RULE_ENUM_DOPARSE_A, _) \ \ virtual abstract_parser* \ clone() const = 0; \ }; \ BOOST_PP_REPEAT_FROM_TO(1, BOOST_SPIRIT_RULE_SCANNERTYPE_LIMIT, BOOST_SPIRIT_ENUM_ABSTRACT_PARSERS, _) #undef BOOST_SPIRIT_RULE_ENUM_DOPARSE_A #undef BOOST_SPIRIT_ENUM_ABSTRACT_PARSERS /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// // // This generates partial specializations for the class // // concrete_parser // // with an increasing number of different ScannerT template parameters // and corresponding do_parse_virtual function declarations for each // of the different required scanner types: // // template < // typename ParserT, typename ScannerT0, ..., typename AttrT // > // struct concrete_parser< // ParserT, scanner_list<ScannerT0, ...>, AttrT // > // : public abstract_parser<scanner_list<ScannerT0, ...>, AttrT> // { // concrete_parser(ParserT const& p_) : p(p_) {} // virtual ~concrete_parser() {} // // virtual typename match_result<ScannerT0, AttrT>::type // do_parse_virtual(ScannerT0 const &scan) const // { return p.parse(scan); } // // virtual abstract_parser<scanner_list<ScannerT0, ...>, AttrT>* // clone() const // { // return new concrete_parser(p); // } // // ... // // typename ParserT::embed_t p; // }; // /////////////////////////////////////////////////////////////////////// #define BOOST_SPIRIT_RULE_ENUM_DOPARSE_C(z, N, _) \ virtual typename match_result< \ BOOST_PP_CAT(ScannerT, N), AttrT \ >::type \ do_parse_virtual( \ BOOST_PP_CAT(ScannerT, N) const& scan) const \ { return p.parse(scan); } \ #define BOOST_SPIRIT_ENUM_CONCRETE_PARSERS(z, N, _) \ template < \ typename ParserT, \ BOOST_PP_ENUM_PARAMS_Z(z, BOOST_PP_INC(N), typename ScannerT), \ typename AttrT \ > \ struct concrete_parser< \ ParserT, \ scanner_list< \ BOOST_PP_ENUM_PARAMS_Z(z, BOOST_PP_INC(N), ScannerT) \ >, \ AttrT \ > \ : abstract_parser< \ scanner_list< \ BOOST_PP_ENUM_PARAMS_Z(z, BOOST_PP_INC(N), ScannerT) \ >, \ AttrT \ > \ { \ concrete_parser(ParserT const& p_) : p(p_) {} \ virtual ~concrete_parser() {} \ \ BOOST_PP_REPEAT_ ## z( \ BOOST_PP_INC(N), BOOST_SPIRIT_RULE_ENUM_DOPARSE_C, _) \ \ virtual abstract_parser< \ scanner_list< \ BOOST_PP_ENUM_PARAMS_Z(z, BOOST_PP_INC(N), ScannerT) \ >, \ AttrT \ >* \ clone() const \ { \ return new concrete_parser(p); \ } \ \ typename ParserT::embed_t p; \ }; \ BOOST_PP_REPEAT_FROM_TO(1, BOOST_SPIRIT_RULE_SCANNERTYPE_LIMIT, BOOST_SPIRIT_ENUM_CONCRETE_PARSERS, _) #undef BOOST_SPIRIT_ENUM_CONCRETE_PARSERS #undef BOOST_SPIRIT_RULE_ENUM_DOPARSE_C ///////////////////////////////////////////////////////////////////////#endif // BOOST_SPIRIT_RULE_SCANNERTYPE_LIMIT > 1 } // namespace implBOOST_SPIRIT_CLASSIC_NAMESPACE_END}} // namespace boost::spirit#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -