perl_matcher_common.hpp
来自「CGAL is a collaborative effort of severa」· HPP 代码 · 共 841 行 · 第 1/2 页
HPP
841 行
if(match_extra & m_match_flags) { for(unsigned i = 0; i < m_presult->size(); ++i) if((*m_presult)[i].matched) ((*m_presult)[i]).get_captures().push_back((*m_presult)[i]); }#endif return true;}template <class BidiIterator, class Allocator, class traits, class Allocator2>bool perl_matcher<BidiIterator, Allocator, traits, Allocator2>::match_word_boundary(){ bool b; // indcates whether next character is a word character if(position != last) { // prev and this character must be opposites: #if defined(BOOST_REGEX_USE_C_LOCALE) && defined(__GNUC__) && (__GNUC__ == 2) && (__GNUC_MINOR__ < 95) b = traits::is_class(*position, traits::char_class_word); #else b = traits_inst.is_class(*position, traits::char_class_word); #endif } else { b = (m_match_flags & match_not_eow) ? true : false; } if((position == base) && ((m_match_flags & match_prev_avail) == 0)) { if(m_match_flags & match_not_bow) b ^= true; else b ^= false; } else { --position; b ^= traits_inst.is_class(*position, traits::char_class_word); ++position; } if(b) { pstate = pstate->next.p; return true; } return false; // no match if we get to here...}template <class BidiIterator, class Allocator, class traits, class Allocator2>bool perl_matcher<BidiIterator, Allocator, traits, Allocator2>::match_within_word(){ if(position == last) return false; // both prev and this character must be traits::char_class_word: if(traits_inst.is_class(*position, traits::char_class_word)) { bool b; if((position == base) && ((m_match_flags & match_prev_avail) == 0)) return false; else { --position; b = traits_inst.is_class(*position, traits::char_class_word); ++position; } if(b) { pstate = pstate->next.p; return true; } } return false;}template <class BidiIterator, class Allocator, class traits, class Allocator2>bool perl_matcher<BidiIterator, Allocator, traits, Allocator2>::match_word_start(){ if(position == last) return false; // can't be starting a word if we're already at the end of input if(!traits_inst.is_class(*position, traits::char_class_word)) return false; // next character isn't a word character if((position == base) && ((m_match_flags & match_prev_avail) == 0)) { if(m_match_flags & match_not_bow) return false; // no previous input } else { // otherwise inside buffer: BidiIterator t(position); --t; if(traits_inst.is_class(*t, traits::char_class_word)) return false; // previous character not non-word } // OK we have a match: pstate = pstate->next.p; return true;}template <class BidiIterator, class Allocator, class traits, class Allocator2>bool perl_matcher<BidiIterator, Allocator, traits, Allocator2>::match_word_end(){ if((position == base) && ((m_match_flags & match_prev_avail) == 0)) return false; // start of buffer can't be end of word BidiIterator t(position); --t; if(traits_inst.is_class(*t, traits::char_class_word) == false) return false; // previous character wasn't a word character if(position == last) { if(m_match_flags & match_not_eow) return false; // end of buffer but not end of word } else { // otherwise inside buffer: if(traits_inst.is_class(*position, traits::char_class_word)) return false; // next character is a word character } pstate = pstate->next.p; return true; // if we fall through to here then we've succeeded}template <class BidiIterator, class Allocator, class traits, class Allocator2>bool perl_matcher<BidiIterator, Allocator, traits, Allocator2>::match_buffer_start(){ if((position != base) || (m_match_flags & match_not_bob)) return false; // OK match: pstate = pstate->next.p; return true;}template <class BidiIterator, class Allocator, class traits, class Allocator2>bool perl_matcher<BidiIterator, Allocator, traits, Allocator2>::match_buffer_end(){ if((position != last) || (m_match_flags & match_not_eob)) return false; // OK match: pstate = pstate->next.p; return true;}template <class BidiIterator, class Allocator, class traits, class Allocator2>bool perl_matcher<BidiIterator, Allocator, traits, Allocator2>::match_backref(){ // compare with what we previously matched: BidiIterator i = (*m_presult)[static_cast<const re_brace*>(pstate)->index].first; BidiIterator j = (*m_presult)[static_cast<const re_brace*>(pstate)->index].second; while(i != j) { if((position == last) || (traits_inst.translate(*position, icase) != traits_inst.translate(*i, icase))) return false; ++i; ++position; } pstate = pstate->next.p; return true;}template <class BidiIterator, class Allocator, class traits, class Allocator2>bool perl_matcher<BidiIterator, Allocator, traits, Allocator2>::match_long_set(){ // let the traits class do the work: if(position == last) return false; BidiIterator t = re_is_set_member(position, last, static_cast<const re_set_long*>(pstate), re); if(t != position) { pstate = pstate->next.p; position = t; return true; } return false;}template <class BidiIterator, class Allocator, class traits, class Allocator2>bool perl_matcher<BidiIterator, Allocator, traits, Allocator2>::match_set(){ if(position == last) return false; if(static_cast<const re_set*>(pstate)->_map[(traits_uchar_type)traits_inst.translate(*position, icase)]) { pstate = pstate->next.p; ++position; return true; } return false;}template <class BidiIterator, class Allocator, class traits, class Allocator2>bool perl_matcher<BidiIterator, Allocator, traits, Allocator2>::match_jump(){ pstate = static_cast<const re_jump*>(pstate)->alt.p; return true;}template <class BidiIterator, class Allocator, class traits, class Allocator2>bool perl_matcher<BidiIterator, Allocator, traits, Allocator2>::match_combining(){ if(position == last) return false; if(traits_inst.is_combining(traits_inst.translate(*position, icase))) return false; ++position; while((position != last) && traits_inst.is_combining(traits_inst.translate(*position, icase))) ++position; pstate = pstate->next.p; return true;}template <class BidiIterator, class Allocator, class traits, class Allocator2>bool perl_matcher<BidiIterator, Allocator, traits, Allocator2>::match_soft_buffer_end(){ if(m_match_flags & match_not_eob) return false; BidiIterator p(position); while((p != last) && traits_inst.is_separator(traits_inst.translate(*p, icase)))++p; if(p != last) return false; pstate = pstate->next.p; return true;}template <class BidiIterator, class Allocator, class traits, class Allocator2>bool perl_matcher<BidiIterator, Allocator, traits, Allocator2>::match_restart_continue(){ if(position == search_base) { pstate = pstate->next.p; return true; } return false;}template <class BidiIterator, class Allocator, class traits, class Allocator2>bool perl_matcher<BidiIterator, Allocator, traits, Allocator2>::find_restart_any(){#ifdef BOOST_MSVC#pragma warning(push)#pragma warning(disable:4127)#endif const unsigned char* _map = access::get_map(re); while(true) { // skip everything we can't match: while((position != last) && !access::can_start(*position, _map, (unsigned char)mask_any) ) ++position; if(position == last) { // run out of characters, try a null match if possible: if(access::first(re)->can_be_null) return match_prefix(); break; } // now try and obtain a match: if(match_prefix()) return true; if(position == last) return false; ++position; } return false;#ifdef BOOST_MSVC#pragma warning(pop)#endif}template <class BidiIterator, class Allocator, class traits, class Allocator2>bool perl_matcher<BidiIterator, Allocator, traits, Allocator2>::find_restart_word(){#ifdef BOOST_MSVC#pragma warning(push)#pragma warning(disable:4127)#endif // do search optimised for word starts: const unsigned char* _map = access::get_map(re); if((m_match_flags & match_prev_avail) || (position != base)) --position; else if(match_prefix()) return true; do { while((position != last) && traits_inst.is_class(*position, traits::char_class_word)) ++position; while((position != last) && !traits_inst.is_class(*position, traits::char_class_word)) ++position; if(position == last) break; if(access::can_start(*position, _map, (unsigned char)mask_any) ) { if(match_prefix()) return true; } if(position == last) break; } while(true); return false;#ifdef BOOST_MSVC#pragma warning(pop)#endif}template <class BidiIterator, class Allocator, class traits, class Allocator2>bool perl_matcher<BidiIterator, Allocator, traits, Allocator2>::find_restart_line(){ // do search optimised for line starts: const unsigned char* _map = access::get_map(re); if(match_prefix()) return true; while(position != last) { while((position != last) && (*position != '\n')) ++position; if(position == last) return false; ++position; if(position == last) { if((access::first(re)->can_be_null) && match_prefix()) return true; return false; } if( access::can_start(*position, _map, (unsigned char)mask_any) ) { if(match_prefix()) return true; } if(position == last) return false; //++position; } return false;}template <class BidiIterator, class Allocator, class traits, class Allocator2>bool perl_matcher<BidiIterator, Allocator, traits, Allocator2>::find_restart_buf(){ if((position == base) && ((m_match_flags & match_not_bob) == 0)) return match_prefix(); return false;}template <class BidiIterator, class Allocator, class traits, class Allocator2>bool perl_matcher<BidiIterator, Allocator, traits, Allocator2>::find_restart_lit(){ if(position == last) return false; // can't possibly match if we're at the end already unsigned type = (m_match_flags & match_continuous) ? static_cast<unsigned int>(regbase::restart_continue) : static_cast<unsigned int>(access::restart_type(re)); const kmp_info<char_type>* info = access::get_kmp(re); int len = info->len; const char_type* x = info->pstr; int j = 0; while (position != last) { while((j > -1) && (x[j] != traits_inst.translate(*position, icase))) j = info->kmp_next[j]; ++position; ++j; if(j >= len) { if(type == regbase::restart_fixed_lit) { std::advance(position, -j); restart = position; std::advance(restart, len); m_result.set_first(position); m_result.set_second(restart); position = restart; return true; } else { restart = position; std::advance(position, -j); if(match_prefix()) return true; else { for(int k = 0; (restart != position) && (k < j); ++k, --restart) {} // dwa 10/20/2000 - warning suppression for MWCW if(restart != last) ++restart; position = restart; j = 0; //we could do better than this... } } } } if((m_match_flags & match_partial) && (position == last) && j) { // we need to check for a partial match: restart = position; std::advance(position, -j); return match_prefix(); } return false;}} // namespace re_detail} // namespace boost#ifdef __BORLANDC__# pragma option pop#endif#ifdef BOOST_HAS_ABI_HEADERS# include BOOST_ABI_SUFFIX#endif#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?