Chris@16: /*============================================================================= Chris@16: Copyright (c) 2002-2003 Hartmut Kaiser Chris@16: http://spirit.sourceforge.net/ Chris@16: Chris@16: Use, modification and distribution is subject to the Boost Software Chris@16: License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: http://www.boost.org/LICENSE_1_0.txt) Chris@16: =============================================================================*/ Chris@16: #ifndef BOOST_SPIRIT_REGEX_IPP Chris@16: #define BOOST_SPIRIT_REGEX_IPP Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: #include Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: namespace boost { namespace spirit { Chris@16: Chris@16: BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN Chris@16: Chris@16: namespace impl { Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // Chris@16: inline const char* rx_prefix(char) { return "\\A"; } Chris@16: inline const wchar_t* rx_prefix(wchar_t) { return L"\\A"; } Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // Chris@16: // rx_parser class Chris@16: // Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: template Chris@16: class rx_parser : public parser > { Chris@16: Chris@16: public: Chris@16: typedef std::basic_string string_t; Chris@16: typedef rx_parser self_t; Chris@16: Chris@16: rx_parser(CharT const *first, CharT const *last) Chris@16: { Chris@16: rxstr = string_t(rx_prefix(CharT())) + string_t(first, last); Chris@16: } Chris@16: Chris@16: rx_parser(CharT const *first) Chris@16: { Chris@16: rxstr = string_t(rx_prefix(CharT())) + Chris@16: string_t(first, impl::get_last(first)); Chris@16: } Chris@16: Chris@16: template Chris@16: typename parser_result::type Chris@16: parse(ScannerT const& scan) const Chris@16: { Chris@16: boost::match_results what; Chris@16: boost::regex_search(scan.first, scan.last, what, rxstr, Chris@16: boost::match_default); Chris@16: Chris@16: if (!what[0].matched) Chris@16: return scan.no_match(); Chris@16: Chris@16: scan.first = what[0].second; Chris@16: return scan.create_match(what[0].length(), nil_t(), Chris@16: what[0].first, scan.first); Chris@16: } Chris@16: Chris@16: private: Chris@16: #if BOOST_VERSION >= 013300 Chris@16: boost::basic_regex rxstr; // regular expression to match Chris@16: #else Chris@16: boost::reg_expression rxstr; // regular expression to match Chris@16: #endif Chris@16: }; Chris@16: Chris@16: } // namespace impl Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: BOOST_SPIRIT_CLASSIC_NAMESPACE_END Chris@16: Chris@16: }} // namespace boost::spirit Chris@16: Chris@16: #endif // BOOST_SPIRIT_REGEX_IPP