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
 |