summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '3rdParty/Boost/src/boost/spirit/home/classic/core/scanner/skipper.hpp')
-rw-r--r--3rdParty/Boost/src/boost/spirit/home/classic/core/scanner/skipper.hpp197
1 files changed, 197 insertions, 0 deletions
diff --git a/3rdParty/Boost/src/boost/spirit/home/classic/core/scanner/skipper.hpp b/3rdParty/Boost/src/boost/spirit/home/classic/core/scanner/skipper.hpp
new file mode 100644
index 0000000..4e655ae
--- /dev/null
+++ b/3rdParty/Boost/src/boost/spirit/home/classic/core/scanner/skipper.hpp
@@ -0,0 +1,197 @@
+/*=============================================================================
+ Copyright (c) 1998-2003 Joel de Guzman
+ 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_SKIPPER_HPP)
+#define BOOST_SPIRIT_SKIPPER_HPP
+
+///////////////////////////////////////////////////////////////////////////////
+#include <cctype>
+
+#include <boost/spirit/home/classic/namespace.hpp>
+#include <boost/spirit/home/classic/core/scanner/scanner.hpp>
+#include <boost/spirit/home/classic/core/primitives/impl/primitives.ipp>
+
+#include <boost/spirit/home/classic/core/scanner/skipper_fwd.hpp>
+
+namespace boost { namespace spirit {
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // skipper_iteration_policy class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename BaseT>
+ struct skipper_iteration_policy : public BaseT
+ {
+ typedef BaseT base_t;
+
+ skipper_iteration_policy()
+ : BaseT() {}
+
+ template <typename PolicyT>
+ skipper_iteration_policy(PolicyT const& other)
+ : BaseT(other) {}
+
+ template <typename ScannerT>
+ void
+ advance(ScannerT const& scan) const
+ {
+ BaseT::advance(scan);
+ scan.skip(scan);
+ }
+
+ template <typename ScannerT>
+ bool
+ at_end(ScannerT const& scan) const
+ {
+ scan.skip(scan);
+ return BaseT::at_end(scan);
+ }
+
+ template <typename ScannerT>
+ void
+ skip(ScannerT const& scan) const
+ {
+ while (!BaseT::at_end(scan) && impl::isspace_(BaseT::get(scan)))
+ BaseT::advance(scan);
+ }
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // no_skipper_iteration_policy class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ template <typename BaseT>
+ struct no_skipper_iteration_policy : public BaseT
+ {
+ typedef BaseT base_t;
+
+ no_skipper_iteration_policy()
+ : BaseT() {}
+
+ template <typename PolicyT>
+ no_skipper_iteration_policy(PolicyT const& other)
+ : BaseT(other) {}
+
+ template <typename ScannerT>
+ void
+ skip(ScannerT const& /*scan*/) const {}
+ };
+
+ ///////////////////////////////////////////////////////////////////////////
+ //
+ // skip_parser_iteration_policy class
+ //
+ ///////////////////////////////////////////////////////////////////////////
+ namespace impl
+ {
+ template <typename ST, typename ScannerT, typename BaseT>
+ void
+ skipper_skip(
+ ST const& s,
+ ScannerT const& scan,
+ skipper_iteration_policy<BaseT> const&);
+
+ template <typename ST, typename ScannerT, typename BaseT>
+ void
+ skipper_skip(
+ ST const& s,
+ ScannerT const& scan,
+ no_skipper_iteration_policy<BaseT> const&);
+
+ template <typename ST, typename ScannerT>
+ void
+ skipper_skip(
+ ST const& s,
+ ScannerT const& scan,
+ iteration_policy const&);
+ }
+
+ template <typename ParserT, typename BaseT>
+ class skip_parser_iteration_policy : public skipper_iteration_policy<BaseT>
+ {
+ public:
+
+ typedef skipper_iteration_policy<BaseT> base_t;
+
+ skip_parser_iteration_policy(
+ ParserT const& skip_parser,
+ base_t const& base = base_t())
+ : base_t(base), subject(skip_parser) {}
+
+ template <typename PolicyT>
+ skip_parser_iteration_policy(PolicyT const& other)
+ : base_t(other), subject(other.skipper()) {}
+
+ template <typename ScannerT>
+ void
+ skip(ScannerT const& scan) const
+ {
+ impl::skipper_skip(subject, scan, scan);
+ }
+
+ ParserT const&
+ skipper() const
+ {
+ return subject;
+ }
+
+ private:
+
+ ParserT const& subject;
+ };
+
+ ///////////////////////////////////////////////////////////////////////////////
+ //
+ // Free parse functions using the skippers
+ //
+ ///////////////////////////////////////////////////////////////////////////////
+ template <typename IteratorT, typename ParserT, typename SkipT>
+ parse_info<IteratorT>
+ parse(
+ IteratorT const& first,
+ IteratorT const& last,
+ parser<ParserT> const& p,
+ parser<SkipT> const& skip);
+
+ ///////////////////////////////////////////////////////////////////////////////
+ //
+ // Parse function for null terminated strings using the skippers
+ //
+ ///////////////////////////////////////////////////////////////////////////////
+ template <typename CharT, typename ParserT, typename SkipT>
+ parse_info<CharT const*>
+ parse(
+ CharT const* str,
+ parser<ParserT> const& p,
+ parser<SkipT> const& skip);
+
+ ///////////////////////////////////////////////////////////////////////////////
+ //
+ // phrase_scanner_t and wide_phrase_scanner_t
+ //
+ // The most common scanners. Use these typedefs when you need
+ // a scanner that skips white spaces.
+ //
+ ///////////////////////////////////////////////////////////////////////////////
+ typedef skipper_iteration_policy<> iter_policy_t;
+ typedef scanner_policies<iter_policy_t> scanner_policies_t;
+ typedef scanner<char const*, scanner_policies_t> phrase_scanner_t;
+ typedef scanner<wchar_t const*, scanner_policies_t> wide_phrase_scanner_t;
+
+ ///////////////////////////////////////////////////////////////////////////////
+
+BOOST_SPIRIT_CLASSIC_NAMESPACE_END
+
+}} // namespace BOOST_SPIRIT_CLASSIC_NS
+
+#include <boost/spirit/home/classic/core/scanner/impl/skipper.ipp>
+#endif
+