summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '3rdParty/Boost/src/boost/spirit/home/classic/core/non_terminal/parser_context.hpp')
-rw-r--r--3rdParty/Boost/src/boost/spirit/home/classic/core/non_terminal/parser_context.hpp150
1 files changed, 150 insertions, 0 deletions
diff --git a/3rdParty/Boost/src/boost/spirit/home/classic/core/non_terminal/parser_context.hpp b/3rdParty/Boost/src/boost/spirit/home/classic/core/non_terminal/parser_context.hpp
new file mode 100644
index 0000000..2f7dd23
--- /dev/null
+++ b/3rdParty/Boost/src/boost/spirit/home/classic/core/non_terminal/parser_context.hpp
@@ -0,0 +1,150 @@
+/*=============================================================================
+ 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