198 lines
6.3 KiB
Plaintext
198 lines
6.3 KiB
Plaintext
|
/*=============================================================================
|
||
|
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
|
||
|
|