// class template regex -*- C++ -*- // Copyright (C) 2010-2013 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the // terms of the GNU General Public License as published by the // Free Software Foundation; either version 3, or (at your option) // any later version. // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // Under Section 7 of GPL version 3, you are granted additional // permissions described in the GCC Runtime Library Exception, version // 3.1, as published by the Free Software Foundation. // You should have received a copy of the GNU General Public License and // a copy of the GCC Runtime Library Exception along with this program; // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see // <http://www.gnu.org/licenses/>. /** * @file bits/regex_grep_matcher.tcc * This is an internal header file, included by other library headers. * Do not attempt to use it directly. @headername{regex} */ #include <regex> namespace std _GLIBCXX_VISIBILITY(default) { namespace { // A stack of states used in evaluating the NFA. typedef std::stack<std::__detail::_StateIdT, std::vector<std::__detail::_StateIdT> > _StateStack; // Obtains the next state set given the current state set __s and the current // input character. inline std::__detail::_StateSet __move(const std::__detail::_PatternCursor& __p, const std::__detail::_Nfa& __nfa, const std::__detail::_StateSet& __s) { std::__detail::_StateSet __m; for (std::__detail::_StateSet::const_iterator __i = __s.begin(); __i != __s.end(); ++__i) { if (*__i == std::__detail::_S_invalid_state_id) continue; const std::__detail::_State& __state = __nfa[*__i]; if (__state._M_opcode == std::__detail::_S_opcode_match && __state._M_matches(__p)) __m.insert(__state._M_next); } return __m; } // returns true if (__s intersect __t) is not empty inline bool __includes_some(const std::__detail::_StateSet& __s, const std::__detail::_StateSet& __t) { if (__s.size() > 0 && __t.size() > 0) { std::__detail::_StateSet::const_iterator __first = __s.begin(); std::__detail::_StateSet::const_iterator __second = __t.begin(); while (__first != __s.end() && __second != __t.end()) { if (*__first < *__second) ++__first; else if (*__second < *__first) ++__second; else return true; } } return false; } // If an identified state __u is not already in the current state set __e, // insert it and push it on the current state stack __s. inline void __add_visited_state(const std::__detail::_StateIdT __u, _StateStack& __s, std::__detail::_StateSet& __e) { if (__e.count(__u) == 0) { __e.insert(__u); __s.push(__u); } } } // anonymous namespace namespace __detail { _GLIBCXX_BEGIN_NAMESPACE_VERSION inline _Grep_matcher:: _Grep_matcher(_PatternCursor& __p, _Results& __r, const _AutomatonPtr& __nfa, regex_constants::match_flag_type __flags) : _M_nfa(static_pointer_cast<_Nfa>(__nfa)), _M_pattern(__p), _M_results(__r) { __detail::_StateSet __t = this->_M_e_closure(_M_nfa->_M_start()); for (; !_M_pattern._M_at_end(); _M_pattern._M_next()) __t = this->_M_e_closure(__move(_M_pattern, *_M_nfa, __t)); _M_results._M_set_matched(0, __includes_some(_M_nfa->_M_final_states(), __t)); } // Creates the e-closure set for the initial state __i. inline _StateSet _Grep_matcher:: _M_e_closure(_StateIdT __i) { _StateSet __s; __s.insert(__i); _StateStack __stack; __stack.push(__i); return this->_M_e_closure(__stack, __s); } // Creates the e-closure set for an arbitrary state set __s. inline _StateSet _Grep_matcher:: _M_e_closure(const _StateSet& __s) { _StateStack __stack; for (_StateSet::const_iterator __i = __s.begin(); __i != __s.end(); ++__i) __stack.push(*__i); return this->_M_e_closure(__stack, __s); } inline _StateSet _Grep_matcher:: _M_e_closure(_StateStack& __stack, const _StateSet& __s) { _StateSet __e = __s; while (!__stack.empty()) { _StateIdT __t = __stack.top(); __stack.pop(); if (__t == _S_invalid_state_id) continue; // for each __u with edge from __t to __u labeled e do ... const _State& __state = _M_nfa->operator[](__t); switch (__state._M_opcode) { case _S_opcode_alternative: __add_visited_state(__state._M_next, __stack, __e); __add_visited_state(__state._M_alt, __stack, __e); break; case _S_opcode_subexpr_begin: __add_visited_state(__state._M_next, __stack, __e); __state._M_tagger(_M_pattern, _M_results); break; case _S_opcode_subexpr_end: __add_visited_state(__state._M_next, __stack, __e); __state._M_tagger(_M_pattern, _M_results); _M_results._M_set_matched(__state._M_subexpr, true); break; case _S_opcode_accept: __add_visited_state(__state._M_next, __stack, __e); break; default: break; } } return __e; } _GLIBCXX_END_NAMESPACE_VERSION } // namespace __detail } // namespace
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
algorithmfwd.h | File | 20.66 KB | 0644 |
|
alloc_traits.h | File | 17.66 KB | 0644 |
|
allocator.h | File | 6.1 KB | 0644 |
|
atomic_base.h | File | 24.99 KB | 0644 |
|
atomic_lockfree_defines.h | File | 2.2 KB | 0644 |
|
basic_ios.h | File | 14.76 KB | 0644 |
|
basic_ios.tcc | File | 5.89 KB | 0644 |
|
basic_string.h | File | 109.49 KB | 0644 |
|
basic_string.tcc | File | 38.43 KB | 0644 |
|
boost_concept_check.h | File | 26.41 KB | 0644 |
|
c++0x_warning.h | File | 1.47 KB | 0644 |
|
char_traits.h | File | 16.95 KB | 0644 |
|
codecvt.h | File | 16.23 KB | 0644 |
|
concept_check.h | File | 3.26 KB | 0644 |
|
cpp_type_traits.h | File | 9.56 KB | 0644 |
|
cxxabi_forced.h | File | 1.77 KB | 0644 |
|
deque.tcc | File | 31.91 KB | 0644 |
|
exception_defines.h | File | 1.6 KB | 0644 |
|
exception_ptr.h | File | 5.29 KB | 0644 |
|
forward_list.h | File | 46.72 KB | 0644 |
|
forward_list.tcc | File | 15.17 KB | 0644 |
|
fstream.tcc | File | 28.3 KB | 0644 |
|
functexcept.h | File | 3.04 KB | 0644 |
|
functional_hash.h | File | 6.05 KB | 0644 |
|
gslice.h | File | 5.39 KB | 0644 |
|
gslice_array.h | File | 7.59 KB | 0644 |
|
hash_bytes.h | File | 2.1 KB | 0644 |
|
hashtable.h | File | 61.05 KB | 0644 |
|
hashtable_policy.h | File | 52.72 KB | 0644 |
|
indirect_array.h | File | 7.68 KB | 0644 |
|
ios_base.h | File | 27.85 KB | 0644 |
|
istream.tcc | File | 30.36 KB | 0644 |
|
list.tcc | File | 12.2 KB | 0644 |
|
locale_classes.h | File | 22.45 KB | 0644 |
|
locale_classes.tcc | File | 8.18 KB | 0644 |
|
locale_facets.h | File | 88.84 KB | 0644 |
|
locale_facets.tcc | File | 38.02 KB | 0644 |
|
locale_facets_nonio.h | File | 63.51 KB | 0644 |
|
locale_facets_nonio.tcc | File | 40.85 KB | 0644 |
|
localefwd.h | File | 5.1 KB | 0644 |
|
mask_array.h | File | 7.41 KB | 0644 |
|
memoryfwd.h | File | 2.36 KB | 0644 |
|
move.h | File | 5.67 KB | 0644 |
|
nested_exception.h | File | 4.58 KB | 0644 |
|
ostream.tcc | File | 12.03 KB | 0644 |
|
ostream_insert.h | File | 3.91 KB | 0644 |
|
postypes.h | File | 8.02 KB | 0644 |
|
ptr_traits.h | File | 5.17 KB | 0644 |
|
random.h | File | 173.19 KB | 0644 |
|
random.tcc | File | 106.59 KB | 0644 |
|
range_access.h | File | 3.06 KB | 0644 |
|
regex.h | File | 83.49 KB | 0644 |
|
regex_compiler.h | File | 27.68 KB | 0644 |
|
regex_constants.h | File | 10.81 KB | 0644 |
|
regex_cursor.h | File | 2.7 KB | 0644 |
|
regex_error.h | File | 4.5 KB | 0644 |
|
regex_grep_matcher.h | File | 4.23 KB | 0644 |
|
regex_grep_matcher.tcc | File | 5.41 KB | 0644 |
|
regex_nfa.h | File | 10.65 KB | 0644 |
|
regex_nfa.tcc | File | 4.85 KB | 0644 |
|
shared_ptr.h | File | 18.97 KB | 0644 |
|
shared_ptr_base.h | File | 40.65 KB | 0644 |
|
slice_array.h | File | 9.12 KB | 0644 |
|
sstream.tcc | File | 9.27 KB | 0644 |
|
stl_algo.h | File | 212.55 KB | 0644 |
|
stl_algobase.h | File | 41.41 KB | 0644 |
|
stl_bvector.h | File | 28.98 KB | 0644 |
|
stl_construct.h | File | 5.05 KB | 0644 |
|
stl_deque.h | File | 66.41 KB | 0644 |
|
stl_function.h | File | 22.06 KB | 0644 |
|
stl_heap.h | File | 19.99 KB | 0644 |
|
stl_iterator.h | File | 35.77 KB | 0644 |
|
stl_iterator_base_funcs.h | File | 6.8 KB | 0644 |
|
stl_iterator_base_types.h | File | 8.19 KB | 0644 |
|
stl_list.h | File | 52.83 KB | 0644 |
|
stl_map.h | File | 36.78 KB | 0644 |
|
stl_multimap.h | File | 33.94 KB | 0644 |
|
stl_multiset.h | File | 28.37 KB | 0644 |
|
stl_numeric.h | File | 13.5 KB | 0644 |
|
stl_pair.h | File | 9.63 KB | 0644 |
|
stl_queue.h | File | 18.21 KB | 0644 |
|
stl_raw_storage_iter.h | File | 3.37 KB | 0644 |
|
stl_relops.h | File | 4.49 KB | 0644 |
|
stl_set.h | File | 28.61 KB | 0644 |
|
stl_stack.h | File | 9.65 KB | 0644 |
|
stl_tempbuf.h | File | 8.15 KB | 0644 |
|
stl_tree.h | File | 53.56 KB | 0644 |
|
stl_uninitialized.h | File | 19.95 KB | 0644 |
|
stl_vector.h | File | 48.64 KB | 0644 |
|
stream_iterator.h | File | 6.44 KB | 0644 |
|
streambuf.tcc | File | 4.81 KB | 0644 |
|
streambuf_iterator.h | File | 12.33 KB | 0644 |
|
stringfwd.h | File | 2.37 KB | 0644 |
|
unique_ptr.h | File | 17.19 KB | 0644 |
|
unordered_map.h | File | 47.76 KB | 0644 |
|
unordered_set.h | File | 43.25 KB | 0644 |
|
uses_allocator.h | File | 3.49 KB | 0644 |
|
valarray_after.h | File | 22.12 KB | 0644 |
|
valarray_array.h | File | 21.23 KB | 0644 |
|
valarray_array.tcc | File | 7.08 KB | 0644 |
|
valarray_before.h | File | 18.08 KB | 0644 |
|
vector.tcc | File | 25.55 KB | 0644 |
|