perl_matcher_non_recursive.hpp
来自「CGAL is a collaborative effort of severa」· HPP 代码 · 共 1,303 行 · 第 1/3 页
HPP
1,303 行
position = pmp->position; bool result = (r == pmp->positive); m_recursive_result = pmp->positive ? r : !r; boost::re_detail::inplace_destroy(pmp++); m_backup_state = pmp; return !result; // return false if the assertion was matched to stop search.}template <class BidiIterator, class Allocator, class traits, class Allocator2>bool perl_matcher<BidiIterator, Allocator, traits, Allocator2>::unwind_alt(bool r){ saved_position<BidiIterator>* pmp = static_cast<saved_position<BidiIterator>*>(m_backup_state); if(!r) { pstate = pmp->pstate; position = pmp->position; } boost::re_detail::inplace_destroy(pmp++); m_backup_state = pmp; return r; }template <class BidiIterator, class Allocator, class traits, class Allocator2>bool perl_matcher<BidiIterator, Allocator, traits, Allocator2>::unwind_repeater_counter(bool){ saved_repeater<BidiIterator>* pmp = static_cast<saved_repeater<BidiIterator>*>(m_backup_state); boost::re_detail::inplace_destroy(pmp++); m_backup_state = pmp; return true; // keep looking}template <class BidiIterator, class Allocator, class traits, class Allocator2>bool perl_matcher<BidiIterator, Allocator, traits, Allocator2>::unwind_extra_block(bool){ saved_extra_block* pmp = static_cast<saved_extra_block*>(m_backup_state); void* condemmed = m_stack_base; m_stack_base = pmp->base; m_backup_state = pmp->end; boost::re_detail::inplace_destroy(pmp); put_mem_block(condemmed); return true; // keep looking}template <class BidiIterator, class Allocator, class traits, class Allocator2>inline void perl_matcher<BidiIterator, Allocator, traits, Allocator2>::destroy_single_repeat(){ saved_single_repeat<BidiIterator>* p = static_cast<saved_single_repeat<BidiIterator>*>(m_backup_state); boost::re_detail::inplace_destroy(p++); m_backup_state = p;}template <class BidiIterator, class Allocator, class traits, class Allocator2>bool perl_matcher<BidiIterator, Allocator, traits, Allocator2>::unwind_greedy_single_repeat(bool r){ saved_single_repeat<BidiIterator>* pmp = static_cast<saved_single_repeat<BidiIterator>*>(m_backup_state); // if we have a match, just discard this state: if(r) { destroy_single_repeat(); return true; } const re_repeat* rep = pmp->rep; unsigned count = pmp->count; assert(rep->next.p != 0); assert(rep->alt.p != 0); count -= rep->min; if((m_match_flags & match_partial) && (position == last)) m_has_partial_match = true; assert(count); position = pmp->last_position; // backtrack till we can skip out: do { --position; --count; ++state_count; }while(count && !access::can_start(*position, rep->_map, mask_skip)); // if we've hit base, destroy this state: if(count == 0) { destroy_single_repeat(); if(!access::can_start(*position, rep->_map, mask_skip)) return true; } else { pmp->count = count + rep->min; pmp->last_position = position; } pstate = rep->alt.p; return false;}template <class BidiIterator, class Allocator, class traits, class Allocator2>bool perl_matcher<BidiIterator, Allocator, traits, Allocator2>::unwind_slow_dot_repeat(bool r){ saved_single_repeat<BidiIterator>* pmp = static_cast<saved_single_repeat<BidiIterator>*>(m_backup_state); // if we have a match, just discard this state: if(r) { destroy_single_repeat(); return true; } const re_repeat* rep = pmp->rep; unsigned count = pmp->count; assert(rep->type == syntax_element_dot_rep); assert(rep->next.p != 0); assert(rep->alt.p != 0); assert(rep->next.p->type == syntax_element_wild); assert(count < rep->max); pstate = rep->next.p; position = pmp->last_position; if(position != last) { // wind forward until we can skip out of the repeat: do { if(!match_wild()) { // failed repeat match, discard this state and look for another: destroy_single_repeat(); return true; } ++count; ++state_count; pstate = rep->next.p; }while((count < rep->max) && (position != last) && !access::can_start(*position, rep->_map, mask_skip)); } if(position == last) { // can't repeat any more, remove the pushed state: destroy_single_repeat(); if(0 == (rep->can_be_null & mask_skip)) return true; } else if(count == rep->max) { // can't repeat any more, remove the pushed state: destroy_single_repeat(); if(!access::can_start(*position, rep->_map, mask_skip)) return true; } else { pmp->count = count; pmp->last_position = position; } pstate = rep->alt.p; return false;}template <class BidiIterator, class Allocator, class traits, class Allocator2>bool perl_matcher<BidiIterator, Allocator, traits, Allocator2>::unwind_fast_dot_repeat(bool r){ saved_single_repeat<BidiIterator>* pmp = static_cast<saved_single_repeat<BidiIterator>*>(m_backup_state); // if we have a match, just discard this state: if(r) { destroy_single_repeat(); return true; } const re_repeat* rep = pmp->rep; unsigned count = pmp->count; assert(count < rep->max); position = pmp->last_position; if(position != last) { // wind forward until we can skip out of the repeat: do { ++position; ++count; ++state_count; }while((count < rep->max) && (position != last) && !access::can_start(*position, rep->_map, mask_skip)); } if(position == last) { // can't repeat any more, remove the pushed state: destroy_single_repeat(); if(0 == (rep->can_be_null & mask_skip)) return true; } else if(count == rep->max) { // can't repeat any more, remove the pushed state: destroy_single_repeat(); if(!access::can_start(*position, rep->_map, mask_skip)) return true; } else { pmp->count = count; pmp->last_position = position; } pstate = rep->alt.p; return false;}template <class BidiIterator, class Allocator, class traits, class Allocator2>bool perl_matcher<BidiIterator, Allocator, traits, Allocator2>::unwind_char_repeat(bool r){ saved_single_repeat<BidiIterator>* pmp = static_cast<saved_single_repeat<BidiIterator>*>(m_backup_state); // if we have a match, just discard this state: if(r) { destroy_single_repeat(); return true; } const re_repeat* rep = pmp->rep; unsigned count = pmp->count; pstate = rep->next.p; const char_type what = *reinterpret_cast<const char_type*>(static_cast<const re_literal*>(pstate) + 1); position = pmp->last_position; assert(rep->type == syntax_element_char_rep); assert(rep->next.p != 0); assert(rep->alt.p != 0); assert(rep->next.p->type == syntax_element_literal); assert(count < rep->max); if(position != last) { // wind forward until we can skip out of the repeat: do { if(traits_inst.translate(*position, icase) != what) { // failed repeat match, discard this state and look for another: destroy_single_repeat(); return true; } ++count; ++ position; ++state_count; pstate = rep->next.p; }while((count < rep->max) && (position != last) && !access::can_start(*position, rep->_map, mask_skip)); } if(position == last) { // can't repeat any more, remove the pushed state: destroy_single_repeat(); if(0 == (rep->can_be_null & mask_skip)) return true; } else if(count == rep->max) { // can't repeat any more, remove the pushed state: destroy_single_repeat(); if(!access::can_start(*position, rep->_map, mask_skip)) return true; } else { pmp->count = count; pmp->last_position = position; } pstate = rep->alt.p; return false;}template <class BidiIterator, class Allocator, class traits, class Allocator2>bool perl_matcher<BidiIterator, Allocator, traits, Allocator2>::unwind_short_set_repeat(bool r){ saved_single_repeat<BidiIterator>* pmp = static_cast<saved_single_repeat<BidiIterator>*>(m_backup_state); // if we have a match, just discard this state: if(r) { destroy_single_repeat(); return true; } const re_repeat* rep = pmp->rep; unsigned count = pmp->count; pstate = rep->next.p; const unsigned char* map = static_cast<const re_set*>(rep->next.p)->_map; position = pmp->last_position; assert(rep->type == syntax_element_short_set_rep); assert(rep->next.p != 0); assert(rep->alt.p != 0); assert(rep->next.p->type == syntax_element_set); assert(count < rep->max); if(position != last) { // wind forward until we can skip out of the repeat: do { if(!map[(traits_uchar_type)traits_inst.translate(*position, icase)]) { // failed repeat match, discard this state and look for another: destroy_single_repeat(); return true; } ++count; ++ position; ++state_count; pstate = rep->next.p; }while((count < rep->max) && (position != last) && !access::can_start(*position, rep->_map, mask_skip)); } if(position == last) { // can't repeat any more, remove the pushed state: destroy_single_repeat(); if(0 == (rep->can_be_null & mask_skip)) return true; } else if(count == rep->max) { // can't repeat any more, remove the pushed state: destroy_single_repeat(); if(!access::can_start(*position, rep->_map, mask_skip)) return true; } else { pmp->count = count; pmp->last_position = position; } pstate = rep->alt.p; return false;}template <class BidiIterator, class Allocator, class traits, class Allocator2>bool perl_matcher<BidiIterator, Allocator, traits, Allocator2>::unwind_long_set_repeat(bool r){ saved_single_repeat<BidiIterator>* pmp = static_cast<saved_single_repeat<BidiIterator>*>(m_backup_state); // if we have a match, just discard this state: if(r) { destroy_single_repeat(); return true; } const re_repeat* rep = pmp->rep; unsigned count = pmp->count; pstate = rep->next.p; const re_set_long* set = static_cast<const re_set_long*>(pstate); position = pmp->last_position; assert(rep->type == syntax_element_long_set_rep); assert(rep->next.p != 0); assert(rep->alt.p != 0); assert(rep->next.p->type == syntax_element_long_set); assert(position != last); assert(count < rep->max); if(position != last) { // wind forward until we can skip out of the repeat: do { if(position == re_is_set_member(position, last, set, re)) { // failed repeat match, discard this state and look for another: destroy_single_repeat(); return true; } ++position; ++count; ++state_count; pstate = rep->next.p; }while((count < rep->max) && (position != last) && !access::can_start(*position, rep->_map, mask_skip)); } if(position == last) { // can't repeat any more, remove the pushed state: destroy_single_repeat(); if(0 == (rep->can_be_null & mask_skip)) return true; } else if(count == rep->max) { // can't repeat any more, remove the pushed state: destroy_single_repeat(); if(!access::can_start(*position, rep->_map, mask_skip)) return true; } else { pmp->count = count; pmp->last_position = position; } pstate = rep->alt.p; return false;}template <class BidiIterator, class Allocator, class traits, class Allocator2>bool perl_matcher<BidiIterator, Allocator, traits, Allocator2>::unwind_non_greedy_repeat(bool r){ saved_position<BidiIterator>* pmp = static_cast<saved_position<BidiIterator>*>(m_backup_state); if(!r) { position = pmp->position; pstate = pmp->pstate; ++(*next_count); } boost::re_detail::inplace_destroy(pmp++); m_backup_state = pmp; return r;}} // namespace re_detail} // namespace boost#ifdef BOOST_HAS_ABI_HEADERS# include BOOST_ABI_SUFFIX#endif#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?