123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- /*=============================================================================
- Copyright (c) 1998-2003 Joel de Guzman
- http://spirit.sourceforge.net/
- Use, modification and distribution is subject to 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_IPP)
- #define BOOST_SPIRIT_SKIPPER_IPP
- ///////////////////////////////////////////////////////////////////////////////
- namespace boost { namespace spirit {
- BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
- struct space_parser;
- template <typename BaseT>
- struct no_skipper_iteration_policy;
- namespace impl
- {
- template <typename ST, typename ScannerT, typename BaseT>
- inline void
- skipper_skip(
- ST const& s,
- ScannerT const& scan,
- skipper_iteration_policy<BaseT> const&)
- {
- typedef scanner_policies<
- no_skipper_iteration_policy<
- BOOST_DEDUCED_TYPENAME ScannerT::iteration_policy_t>,
- BOOST_DEDUCED_TYPENAME ScannerT::match_policy_t,
- BOOST_DEDUCED_TYPENAME ScannerT::action_policy_t
- > policies_t;
- scanner<BOOST_DEDUCED_TYPENAME ScannerT::iterator_t, policies_t>
- scan2(scan.first, scan.last, policies_t(scan));
- typedef typename ScannerT::iterator_t iterator_t;
- for (;;)
- {
- iterator_t save = scan.first;
- if (!s.parse(scan2))
- {
- scan.first = save;
- break;
- }
- }
- }
- template <typename ST, typename ScannerT, typename BaseT>
- inline void
- skipper_skip(
- ST const& s,
- ScannerT const& scan,
- no_skipper_iteration_policy<BaseT> const&)
- {
- for (;;)
- {
- typedef typename ScannerT::iterator_t iterator_t;
- iterator_t save = scan.first;
- if (!s.parse(scan))
- {
- scan.first = save;
- break;
- }
- }
- }
- template <typename ST, typename ScannerT>
- inline void
- skipper_skip(
- ST const& s,
- ScannerT const& scan,
- iteration_policy const&)
- {
- for (;;)
- {
- typedef typename ScannerT::iterator_t iterator_t;
- iterator_t save = scan.first;
- if (!s.parse(scan))
- {
- scan.first = save;
- break;
- }
- }
- }
- template <typename SkipT>
- struct phrase_parser
- {
- template <typename IteratorT, typename ParserT>
- static parse_info<IteratorT>
- parse(
- IteratorT const& first_,
- IteratorT const& last,
- ParserT const& p,
- SkipT const& skip)
- {
- typedef skip_parser_iteration_policy<SkipT> it_policy_t;
- typedef scanner_policies<it_policy_t> scan_policies_t;
- typedef scanner<IteratorT, scan_policies_t> scanner_t;
- it_policy_t iter_policy(skip);
- scan_policies_t policies(iter_policy);
- IteratorT first = first_;
- scanner_t scan(first, last, policies);
- match<nil_t> hit = p.parse(scan);
- return parse_info<IteratorT>(
- first, hit, hit && (first == last),
- hit.length());
- }
- };
- template <>
- struct phrase_parser<space_parser>
- {
- template <typename IteratorT, typename ParserT>
- static parse_info<IteratorT>
- parse(
- IteratorT const& first_,
- IteratorT const& last,
- ParserT const& p,
- space_parser const&)
- {
- typedef skipper_iteration_policy<> it_policy_t;
- typedef scanner_policies<it_policy_t> scan_policies_t;
- typedef scanner<IteratorT, scan_policies_t> scanner_t;
- IteratorT first = first_;
- scanner_t scan(first, last);
- match<nil_t> hit = p.parse(scan);
- return parse_info<IteratorT>(
- first, hit, hit && (first == last),
- hit.length());
- }
- };
- }
- ///////////////////////////////////////////////////////////////////////////
- //
- // Free parse functions using the skippers
- //
- ///////////////////////////////////////////////////////////////////////////
- template <typename IteratorT, typename ParserT, typename SkipT>
- inline parse_info<IteratorT>
- parse(
- IteratorT const& first,
- IteratorT const& last,
- parser<ParserT> const& p,
- parser<SkipT> const& skip)
- {
- return impl::phrase_parser<SkipT>::
- parse(first, last, p.derived(), skip.derived());
- }
-
- ///////////////////////////////////////////////////////////////////////////
- //
- // Parse function for null terminated strings using the skippers
- //
- ///////////////////////////////////////////////////////////////////////////
- template <typename CharT, typename ParserT, typename SkipT>
- inline parse_info<CharT const*>
- parse(
- CharT const* str,
- parser<ParserT> const& p,
- parser<SkipT> const& skip)
- {
- CharT const* last = str;
- while (*last)
- last++;
- return parse(str, last, p, skip);
- }
- BOOST_SPIRIT_CLASSIC_NAMESPACE_END
- }} // namespace boost::spirit
- #endif
|