sl@0: /*============================================================================= sl@0: Copyright (c) 2002-2003 Hartmut Kaiser sl@0: http://spirit.sourceforge.net/ sl@0: sl@0: Use, modification and distribution is subject to the Boost Software sl@0: License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at sl@0: http://www.boost.org/LICENSE_1_0.txt) sl@0: =============================================================================*/ sl@0: #ifndef BOOST_SPIRIT_REGEX_HPP sl@0: #define BOOST_SPIRIT_REGEX_HPP sl@0: sl@0: #include <boost/version.hpp> sl@0: sl@0: /////////////////////////////////////////////////////////////////////////////// sl@0: // sl@0: // Include the regular expression library of boost (Boost.Regex) sl@0: // sl@0: // Note though, that this library is not distributed with Spirit. You have to sl@0: // obtain a separate copy from http://www.boost.org. sl@0: // sl@0: /////////////////////////////////////////////////////////////////////////////// sl@0: #if defined(BOOST_SPIRIT_NO_REGEX_LIB) && BOOST_VERSION < 103300 sl@0: // sl@0: // Include all the Boost.regex library. Please note that this will not work, sl@0: // if you are using the boost/spirit/regex.hpp header from more than one sl@0: // translation units. sl@0: // sl@0: #define BOOST_REGEX_NO_LIB sl@0: #define BOOST_REGEX_STATIC_LINK sl@0: #define BOOST_REGEX_NO_EXTERNAL_TEMPLATES sl@0: #include <boost/regex.hpp> sl@0: #include <boost/regex/src.cpp> sl@0: sl@0: #else sl@0: // sl@0: // Include the Boost.Regex headers only. Note, that you will have to link your sl@0: // application against the Boost.Regex library as described in the related sl@0: // documentation. sl@0: // This is the only way for Boost newer than V1.32.0 sl@0: // sl@0: #include <boost/regex.hpp> sl@0: #endif // defined(BOOST_SPIRIT_NO_REGEX_LIB) sl@0: sl@0: #include <boost/static_assert.hpp> sl@0: sl@0: /////////////////////////////////////////////////////////////////////////////// sl@0: #include <boost/spirit/meta/as_parser.hpp> sl@0: #include <boost/spirit/core/parser.hpp> sl@0: #include <boost/spirit/utility/impl/regex.ipp> sl@0: #include <boost/detail/iterator.hpp> // for boost::detail::iterator_traits sl@0: sl@0: /////////////////////////////////////////////////////////////////////////////// sl@0: namespace boost { namespace spirit { sl@0: sl@0: /////////////////////////////////////////////////////////////////////////////// sl@0: // rxstrlit class sl@0: template <typename CharT = char> sl@0: struct rxstrlit : public parser<rxstrlit<CharT> > { sl@0: sl@0: typedef rxstrlit self_t; sl@0: sl@0: rxstrlit(CharT const *first, CharT const *last) sl@0: : rx(first, last) {} sl@0: rxstrlit(CharT const *first) sl@0: : rx(first) {} sl@0: sl@0: template <typename ScannerT> sl@0: typename parser_result<self_t, ScannerT>::type sl@0: parse(ScannerT const& scan) const sl@0: { sl@0: // Due to limitations in the boost::regex library the iterators wrapped in sl@0: // the ScannerT object should be at least bidirectional iterators. Plain sl@0: // forward iterators do not work here. sl@0: typedef typename ScannerT::iterator_t iterator_t; sl@0: typedef sl@0: typename boost::detail::iterator_traits<iterator_t>::iterator_category sl@0: iterator_category; sl@0: sl@0: BOOST_STATIC_ASSERT(( sl@0: boost::is_convertible<iterator_category, sl@0: std::bidirectional_iterator_tag>::value sl@0: )); sl@0: sl@0: typedef typename parser_result<self_t, ScannerT>::type result_t; sl@0: return impl::contiguous_parser_parse<result_t>(rx, scan, scan); sl@0: } sl@0: sl@0: private: sl@0: impl::rx_parser<CharT> rx; // contains the boost regular expression parser sl@0: }; sl@0: sl@0: /////////////////////////////////////////////////////////////////////////////// sl@0: // Generator functions sl@0: template <typename CharT> sl@0: inline rxstrlit<CharT> sl@0: regex_p(CharT const *first) sl@0: { return rxstrlit<CharT>(first); } sl@0: sl@0: ////////////////////////////////// sl@0: template <typename CharT> sl@0: inline rxstrlit<CharT> sl@0: regex_p(CharT const *first, CharT const *last) sl@0: { return rxstrlit<CharT>(first, last); } sl@0: sl@0: /////////////////////////////////////////////////////////////////////////////// sl@0: }} // namespace boost::spirit sl@0: sl@0: #endif // BOOST_SPIRIT_REGEX_HPP