You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
81 lines
2.5 KiB
81 lines
2.5 KiB
/*============================================================================= |
|
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
|
|
|