/*============================================================================= Copyright (c) 2001-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) =============================================================================*/ #ifndef BOOST_SPIRIT_PARAMETRIC_HPP #define BOOST_SPIRIT_PARAMETRIC_HPP /////////////////////////////////////////////////////////////////////////////// #include #include #include namespace boost { namespace spirit { /////////////////////////////////////////////////////////////////////////// // // f_chlit class [ functional version of chlit ] // /////////////////////////////////////////////////////////////////////////// template struct f_chlit : public char_parser > { f_chlit(ChGenT chgen_) : chgen(chgen_) {} template bool test(T ch) const { return ch == chgen(); } ChGenT chgen; }; template inline f_chlit f_ch_p(ChGenT chgen) { return f_chlit(chgen); } /////////////////////////////////////////////////////////////////////////// // // f_range class [ functional version of range ] // /////////////////////////////////////////////////////////////////////////// template struct f_range : public char_parser > { f_range(ChGenAT first_, ChGenBT last_) : first(first_), last(last_) {} template bool test(T ch) const { BOOST_SPIRIT_ASSERT(first() <= last()); return (ch >= first()) && (ch <= last()); } ChGenAT first; ChGenBT last; }; template inline f_range f_range_p(ChGenAT first, ChGenBT last) { return f_range(first, last); } /////////////////////////////////////////////////////////////////////////// // // f_chseq class [ functional version of chseq ] // /////////////////////////////////////////////////////////////////////////// template class f_chseq : public parser > { public: typedef f_chseq self_t; f_chseq(IterGenAT first_, IterGenBT last_) : first(first_), last(last_) {} template typename parser_result::type parse(ScannerT const& scan) const { typedef typename parser_result::type result_t; return impl::string_parser_parse(first(), last(), scan); } private: IterGenAT first; IterGenBT last; }; template inline f_chseq f_chseq_p(IterGenAT first, IterGenBT last) { return f_chseq(first, last); } /////////////////////////////////////////////////////////////////////////// // // f_strlit class [ functional version of strlit ] // /////////////////////////////////////////////////////////////////////////// template class f_strlit : public parser > { public: typedef f_strlit self_t; f_strlit(IterGenAT first, IterGenBT last) : seq(first, last) {} template typename parser_result::type parse(ScannerT const& scan) const { typedef typename parser_result::type result_t; return impl::contiguous_parser_parse (seq, scan, scan); } private: f_chseq seq; }; template inline f_strlit f_str_p(IterGenAT first, IterGenBT last) { return f_strlit(first, last); } }} // namespace boost::spirit #endif