| /*============================================================================= |
| Copyright (c) 2002-2003 Hartmut Kaiser |
| 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_REGEX_IPP |
| #define BOOST_SPIRIT_REGEX_IPP |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| #include <boost/spirit/home/classic/core/primitives/impl/primitives.ipp> |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| namespace boost { namespace spirit { |
| |
| BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN |
| |
| namespace impl { |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| // |
| inline const char* rx_prefix(char) { return "\\A"; } |
| inline const wchar_t* rx_prefix(wchar_t) { return L"\\A"; } |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| // |
| // rx_parser class |
| // |
| /////////////////////////////////////////////////////////////////////////////// |
| template <typename CharT = char> |
| class rx_parser : public parser<rx_parser<CharT> > { |
| |
| public: |
| typedef std::basic_string<CharT> string_t; |
| typedef rx_parser<CharT> self_t; |
| |
| rx_parser(CharT const *first, CharT const *last) |
| { |
| rxstr = string_t(rx_prefix(CharT())) + string_t(first, last); |
| } |
| |
| rx_parser(CharT const *first) |
| { |
| rxstr = string_t(rx_prefix(CharT())) + |
| string_t(first, impl::get_last(first)); |
| } |
| |
| template <typename ScannerT> |
| typename parser_result<self_t, ScannerT>::type |
| parse(ScannerT const& scan) const |
| { |
| boost::match_results<typename ScannerT::iterator_t> what; |
| boost::regex_search(scan.first, scan.last, what, rxstr, |
| boost::match_default); |
| |
| if (!what[0].matched) |
| return scan.no_match(); |
| |
| scan.first = what[0].second; |
| return scan.create_match(what[0].length(), nil_t(), |
| what[0].first, scan.first); |
| } |
| |
| private: |
| #if BOOST_VERSION >= 013300 |
| boost::basic_regex<CharT> rxstr; // regular expression to match |
| #else |
| boost::reg_expression<CharT> rxstr; // regular expression to match |
| #endif |
| }; |
| |
| } // namespace impl |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| BOOST_SPIRIT_CLASSIC_NAMESPACE_END |
| |
| }} // namespace boost::spirit |
| |
| #endif // BOOST_SPIRIT_REGEX_IPP |