330 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			330 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| /*=============================================================================
 | |
|     Copyright (c) 1998-2002 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_SCANNER_HPP)
 | |
| #define BOOST_SPIRIT_SCANNER_HPP
 | |
| 
 | |
| #include <iterator>
 | |
| #include <boost/config.hpp>
 | |
| #include <boost/spirit/home/classic/namespace.hpp>
 | |
| #include <boost/spirit/home/classic/core/match.hpp>
 | |
| #include <boost/spirit/home/classic/core/non_terminal/parser_id.hpp>
 | |
| #include <boost/detail/iterator.hpp> // for boost::detail::iterator_traits
 | |
| 
 | |
| #include <boost/spirit/home/classic/core/scanner/scanner_fwd.hpp>
 | |
| 
 | |
| namespace boost { namespace spirit {
 | |
| 
 | |
| BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
 | |
| 
 | |
|     ///////////////////////////////////////////////////////////////////////////
 | |
|     //
 | |
|     //  iteration_policy class
 | |
|     //
 | |
|     ///////////////////////////////////////////////////////////////////////////
 | |
|     struct iteration_policy
 | |
|     {
 | |
|         template <typename ScannerT>
 | |
|         void
 | |
|         advance(ScannerT const& scan) const
 | |
|         {
 | |
|             ++scan.first;
 | |
|         }
 | |
| 
 | |
|         template <typename ScannerT>
 | |
|         bool at_end(ScannerT const& scan) const
 | |
|         {
 | |
|             return scan.first == scan.last;
 | |
|         }
 | |
| 
 | |
|         template <typename T>
 | |
|         T filter(T ch) const
 | |
|         {
 | |
|             return ch;
 | |
|         }
 | |
| 
 | |
|         template <typename ScannerT>
 | |
|         typename ScannerT::ref_t
 | |
|         get(ScannerT const& scan) const
 | |
|         {
 | |
|             return *scan.first;
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     ///////////////////////////////////////////////////////////////////////////
 | |
|     //
 | |
|     //  match_policy class
 | |
|     //
 | |
|     ///////////////////////////////////////////////////////////////////////////
 | |
|     struct match_policy
 | |
|     {
 | |
|         template <typename T>
 | |
|         struct result { typedef match<T> type; };
 | |
| 
 | |
|         const match<nil_t>
 | |
|         no_match() const
 | |
|         {
 | |
|             return match<nil_t>();
 | |
|         }
 | |
| 
 | |
|         const match<nil_t>
 | |
|         empty_match() const
 | |
|         {
 | |
|             return match<nil_t>(0, nil_t());
 | |
|         }
 | |
| 
 | |
|         template <typename AttrT, typename IteratorT>
 | |
|         match<AttrT>
 | |
|         create_match(
 | |
|             std::size_t         length,
 | |
|             AttrT const&        val,
 | |
|             IteratorT const&    /*first*/,
 | |
|             IteratorT const&    /*last*/) const
 | |
|         {
 | |
|             return match<AttrT>(length, val);
 | |
|         }
 | |
| 
 | |
|         template <typename MatchT, typename IteratorT>
 | |
|         void group_match(
 | |
|             MatchT&             /*m*/,
 | |
|             parser_id const&    /*id*/,
 | |
|             IteratorT const&    /*first*/,
 | |
|             IteratorT const&    /*last*/) const {}
 | |
| 
 | |
|         template <typename Match1T, typename Match2T>
 | |
|         void concat_match(Match1T& l, Match2T const& r) const
 | |
|         {
 | |
|             l.concat(r);
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     ///////////////////////////////////////////////////////////////////////////
 | |
|     //
 | |
|     //  match_result class
 | |
|     //
 | |
|     ///////////////////////////////////////////////////////////////////////////
 | |
|     template <typename MatchPolicyT, typename T>
 | |
|     struct match_result
 | |
|     {
 | |
|         typedef typename MatchPolicyT::template result<T>::type type;
 | |
|     };
 | |
| 
 | |
|     ///////////////////////////////////////////////////////////////////////////
 | |
|     //
 | |
|     //  action_policy class
 | |
|     //
 | |
|     ///////////////////////////////////////////////////////////////////////////
 | |
|     template <typename AttrT>
 | |
|     struct attributed_action_policy
 | |
|     {
 | |
|         template <typename ActorT, typename IteratorT>
 | |
|         static void
 | |
|         call(
 | |
|             ActorT const& actor,
 | |
|             AttrT& val,
 | |
|             IteratorT const&,
 | |
|             IteratorT const&)
 | |
|         {
 | |
|             actor(val);
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     //////////////////////////////////
 | |
|     template <>
 | |
|     struct attributed_action_policy<nil_t>
 | |
|     {
 | |
|         template <typename ActorT, typename IteratorT>
 | |
|         static void
 | |
|         call(
 | |
|             ActorT const& actor,
 | |
|             nil_t,
 | |
|             IteratorT const& first,
 | |
|             IteratorT const& last)
 | |
|         {
 | |
|             actor(first, last);
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     //////////////////////////////////
 | |
|     struct action_policy
 | |
|     {
 | |
|         template <typename ActorT, typename AttrT, typename IteratorT>
 | |
|         void
 | |
|         do_action(
 | |
|             ActorT const&       actor,
 | |
|             AttrT&              val,
 | |
|             IteratorT const&    first,
 | |
|             IteratorT const&    last) const
 | |
|         {
 | |
|             attributed_action_policy<AttrT>::call(actor, val, first, last);
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     ///////////////////////////////////////////////////////////////////////////
 | |
|     //
 | |
|     //  scanner_policies class
 | |
|     //
 | |
|     ///////////////////////////////////////////////////////////////////////////
 | |
|     template <
 | |
|         typename IterationPolicyT,
 | |
|         typename MatchPolicyT,
 | |
|         typename ActionPolicyT>
 | |
|     struct scanner_policies :
 | |
|         public IterationPolicyT,
 | |
|         public MatchPolicyT,
 | |
|         public ActionPolicyT
 | |
|     {
 | |
|         typedef IterationPolicyT    iteration_policy_t;
 | |
|         typedef MatchPolicyT        match_policy_t;
 | |
|         typedef ActionPolicyT       action_policy_t;
 | |
| 
 | |
|         scanner_policies(
 | |
|             IterationPolicyT const& i_policy = IterationPolicyT(),
 | |
|             MatchPolicyT const&     m_policy = MatchPolicyT(),
 | |
|             ActionPolicyT const&    a_policy = ActionPolicyT())
 | |
|         : IterationPolicyT(i_policy)
 | |
|         , MatchPolicyT(m_policy)
 | |
|         , ActionPolicyT(a_policy) {}
 | |
| 
 | |
|         template <typename ScannerPoliciesT>
 | |
|         scanner_policies(ScannerPoliciesT const& policies)
 | |
|         : IterationPolicyT(policies)
 | |
|         , MatchPolicyT(policies)
 | |
|         , ActionPolicyT(policies) {}
 | |
|     };
 | |
| 
 | |
|     ///////////////////////////////////////////////////////////////////////////
 | |
|     //
 | |
|     //  scanner_policies_base class: the base class of all scanners
 | |
|     //
 | |
|     ///////////////////////////////////////////////////////////////////////////
 | |
|     struct scanner_base {};
 | |
| 
 | |
|     ///////////////////////////////////////////////////////////////////////////
 | |
|     //
 | |
|     //  scanner class
 | |
|     //
 | |
|     ///////////////////////////////////////////////////////////////////////////
 | |
|     template <
 | |
|         typename IteratorT,
 | |
|         typename PoliciesT>
 | |
|     class scanner : public PoliciesT, public scanner_base
 | |
|     {
 | |
|     public:
 | |
| 
 | |
|         typedef IteratorT iterator_t;
 | |
|         typedef PoliciesT policies_t;
 | |
| 
 | |
|         typedef typename boost::detail::
 | |
|             iterator_traits<IteratorT>::value_type value_t;
 | |
|         typedef typename boost::detail::
 | |
|             iterator_traits<IteratorT>::reference ref_t;
 | |
|         typedef typename boost::
 | |
|             call_traits<IteratorT>::param_type iter_param_t;
 | |
| 
 | |
|         scanner(
 | |
|             IteratorT&          first_,
 | |
|             iter_param_t        last_,
 | |
|             PoliciesT const&    policies = PoliciesT())
 | |
|         : PoliciesT(policies), first(first_), last(last_)
 | |
|         {
 | |
|             at_end();
 | |
|         }
 | |
| 
 | |
|         scanner(scanner const& other)
 | |
|         : PoliciesT(other), first(other.first), last(other.last) {}
 | |
| 
 | |
|         scanner(scanner const& other, IteratorT& first_)
 | |
|         : PoliciesT(other), first(first_), last(other.last) {}
 | |
| 
 | |
|         template <typename PoliciesT1>
 | |
|         scanner(scanner<IteratorT, PoliciesT1> const& other)
 | |
|         : PoliciesT(other), first(other.first), last(other.last) {}
 | |
| 
 | |
|         bool
 | |
|         at_end() const
 | |
|         {
 | |
|             typedef typename PoliciesT::iteration_policy_t iteration_policy_type;
 | |
|             return iteration_policy_type::at_end(*this);
 | |
|         }
 | |
| 
 | |
|         value_t
 | |
|         operator*() const
 | |
|         {
 | |
|             typedef typename PoliciesT::iteration_policy_t iteration_policy_type;
 | |
|             return iteration_policy_type::filter(iteration_policy_type::get(*this));
 | |
|         }
 | |
| 
 | |
|         scanner const&
 | |
|         operator++() const
 | |
|         {
 | |
|             typedef typename PoliciesT::iteration_policy_t iteration_policy_type;
 | |
|             iteration_policy_type::advance(*this);
 | |
|             return *this;
 | |
|         }
 | |
| 
 | |
|         template <typename PoliciesT2>
 | |
|         struct rebind_policies
 | |
|         {
 | |
|             typedef scanner<IteratorT, PoliciesT2> type;
 | |
|         };
 | |
| 
 | |
|         template <typename PoliciesT2>
 | |
|         scanner<IteratorT, PoliciesT2>
 | |
|         change_policies(PoliciesT2 const& policies) const
 | |
|         {
 | |
|             return scanner<IteratorT, PoliciesT2>(first, last, policies);
 | |
|         }
 | |
| 
 | |
|         template <typename IteratorT2>
 | |
|         struct rebind_iterator
 | |
|         {
 | |
|             typedef scanner<IteratorT2, PoliciesT> type;
 | |
|         };
 | |
| 
 | |
|         template <typename IteratorT2>
 | |
|         scanner<IteratorT2, PoliciesT>
 | |
|         change_iterator(IteratorT2 const& first_, IteratorT2 const &last_) const
 | |
|         {
 | |
|             return scanner<IteratorT2, PoliciesT>(first_, last_, *this);
 | |
|         }
 | |
| 
 | |
|         IteratorT& first;
 | |
|         IteratorT const last;
 | |
| 
 | |
|     private:
 | |
| 
 | |
|         scanner&
 | |
|         operator=(scanner const& other);
 | |
|     };
 | |
| 
 | |
|     ///////////////////////////////////////////////////////////////////////////
 | |
|     //
 | |
|     //  rebind_scanner_policies class
 | |
|     //
 | |
|     ///////////////////////////////////////////////////////////////////////////
 | |
|     template <typename ScannerT, typename PoliciesT>
 | |
|     struct rebind_scanner_policies
 | |
|     {
 | |
|         typedef typename ScannerT::template
 | |
|             rebind_policies<PoliciesT>::type type;
 | |
|     };
 | |
| 
 | |
|     //////////////////////////////////
 | |
|     template <typename ScannerT, typename IteratorT>
 | |
|     struct rebind_scanner_iterator
 | |
|     {
 | |
|         typedef typename ScannerT::template
 | |
|             rebind_iterator<IteratorT>::type type;
 | |
|     };
 | |
| 
 | |
| BOOST_SPIRIT_CLASSIC_NAMESPACE_END
 | |
| 
 | |
| }}
 | |
| 
 | |
| #endif
 | 
