⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parser_context.hpp

📁 Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
💻 HPP
字号:
/*=============================================================================    Copyright (c) 2002-2003 Joel de Guzman    Copyright (c) 2002-2003 Hartmut Kaiser    http://spirit.sourceforge.net/  Distributed under the Boost Software License, Version 1.0. (See accompanying  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)=============================================================================*/#if !defined(BOOST_SPIRIT_PARSER_CONTEXT_HPP)#define BOOST_SPIRIT_PARSER_CONTEXT_HPP///////////////////////////////////////////////////////////////////////////////namespace boost{    namespace spirit    {    BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN    ///////////////////////////////////////////////////////////////////////////    //    //  default_parser_context_base class { default context base }    //    ///////////////////////////////////////////////////////////////////////////    struct default_parser_context_base    {        template <typename DerivedT>        struct aux {};    };    ///////////////////////////////////////////////////////////////////////////    //    //  parser_context_base class { base class of all context classes }    //    ///////////////////////////////////////////////////////////////////////////    struct parser_context_base {};    ///////////////////////////////////////////////////////////////////////////    //    //  parser_context class { default context }    //    ///////////////////////////////////////////////////////////////////////////    struct nil_t;    template<typename ContextT> struct parser_context_linker;    template<typename AttrT = nil_t>    struct parser_context : parser_context_base    {        typedef AttrT attr_t;        typedef default_parser_context_base base_t;        typedef parser_context_linker<parser_context<AttrT> > context_linker_t;        template <typename ParserT>        parser_context(ParserT const&) {}        template <typename ParserT, typename ScannerT>        void        pre_parse(ParserT const&, ScannerT const&) {}        template <typename ResultT, typename ParserT, typename ScannerT>        ResultT&        post_parse(ResultT& hit, ParserT const&, ScannerT const&)        { return hit; }    };    ///////////////////////////////////////////////////////////////////////////    //    //  context_aux class    //    //      context_aux<ContextT, DerivedT> is a class derived from the    //      ContextT's nested base_t::base<DerivedT> template class. (see    //      default_parser_context_base::aux for an example).    //    //      Basically, this class provides ContextT dependent optional    //      functionality to the derived class DerivedT through the CRTP    //      idiom (Curiously recurring template pattern).    //    ///////////////////////////////////////////////////////////////////////////    template <typename ContextT, typename DerivedT>    struct context_aux : public ContextT::base_t::template aux<DerivedT> {};    ///////////////////////////////////////////////////////////////////////////    //    //  parser_scanner_linker and parser_scanner_linker classes    //  { helper templates for the rule extensibility }    //    //      This classes can be 'overloaded' (defined elsewhere), to plug    //      in additional functionality into the non-terminal parsing process.    //    ///////////////////////////////////////////////////////////////////////////    #if !defined(BOOST_SPIRIT_PARSER_SCANNER_LINKER_DEFINED)    #define BOOST_SPIRIT_PARSER_SCANNER_LINKER_DEFINED    template<typename ScannerT>    struct parser_scanner_linker : public ScannerT    {        parser_scanner_linker(ScannerT const scan_) : ScannerT(scan_) {}    };    #endif // !defined(BOOST_SPIRIT_PARSER_SCANNER_LINKER_DEFINED)    //////////////////////////////////    #if !defined(BOOST_SPIRIT_PARSER_CONTEXT_LINKER_DEFINED)    #define BOOST_SPIRIT_PARSER_CONTEXT_LINKER_DEFINED    template<typename ContextT>    struct parser_context_linker : public ContextT    {        template <typename ParserT>        parser_context_linker(ParserT const& p)        : ContextT(p) {}        template <typename ParserT, typename ScannerT>        void pre_parse(ParserT const& p, ScannerT const& scan)        { ContextT::pre_parse(p, scan); }        template <typename ResultT, typename ParserT, typename ScannerT>        ResultT&        post_parse(ResultT& hit, ParserT const& p, ScannerT const& scan)        { return ContextT::post_parse(hit, p, scan); }    };    #endif // !defined(BOOST_SPIRIT_PARSER_CONTEXT_LINKER_DEFINED)    ///////////////////////////////////////////////////////////////////////////    //    //  BOOST_SPIRIT_CONTEXT_PARSE helper macro    //    //      The original implementation uses a template class. However, we    //      need to lessen the template instantiation depth to help inferior    //      compilers that sometimes choke on deep template instantiations.    //      The objective is to avoid code redundancy. A macro, in this case    //      is an obvious solution. Sigh!    //    //      WARNING: INTERNAL USE ONLY. NOT FOR PUBLIC CONSUMPTION.    //    ///////////////////////////////////////////////////////////////////////////    #define BOOST_SPIRIT_CONTEXT_PARSE(scan, this_, scanner_t, context_t, result_t) \            scanner_t scan_wrap(scan);                                              \            context_t context_wrap(this_);                                          \            context_wrap.pre_parse(this_, scan_wrap);                               \            result_t hit = parse_main(scan);                                        \            return context_wrap.post_parse(hit, this_, scan_wrap);    BOOST_SPIRIT_CLASSIC_NAMESPACE_END    } // namespace spirit} // namespace boost#endif

⌨️ 快捷键说明

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