📄 perl_matcher_non_recursive.hpp
字号:
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);
assert(rep->alt.p);
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);
assert(rep->alt.p);
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);
assert(rep->alt.p);
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);
assert(rep->alt.p);
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);
assert(rep->alt.p);
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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -