mirror of
https://github.com/boostorg/regex.git
synced 2025-07-21 08:12:37 +02:00
Fix up recursive implementation of ACCEPT and COMMIT.
This commit is contained in:
@ -446,9 +446,7 @@ private:
|
||||
bool match_fail();
|
||||
bool match_accept();
|
||||
bool match_commit();
|
||||
#ifdef BOOST_REGEX_NON_RECURSIVE
|
||||
bool skip_until_paren(int index, bool match = true);
|
||||
#endif
|
||||
|
||||
// find procs stored in s_find_vtable:
|
||||
bool find_restart_any();
|
||||
@ -509,6 +507,7 @@ private:
|
||||
#ifdef BOOST_REGEX_RECURSIVE
|
||||
// Set to false by a (*COMMIT):
|
||||
bool m_can_backtrack;
|
||||
bool m_have_accept;
|
||||
#endif
|
||||
#ifdef BOOST_REGEX_NON_RECURSIVE
|
||||
//
|
||||
|
@ -82,6 +82,7 @@ void perl_matcher<BidiIterator, Allocator, traits>::construct_init(const basic_r
|
||||
m_backup_state = 0;
|
||||
#elif defined(BOOST_REGEX_RECURSIVE)
|
||||
m_can_backtrack = true;
|
||||
m_have_accept = false;
|
||||
#endif
|
||||
// find the value to use for matching word boundaries:
|
||||
m_word_mask = re.get_data().m_word_mask;
|
||||
@ -805,6 +806,18 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_fail()
|
||||
return false;
|
||||
}
|
||||
|
||||
template <class BidiIterator, class Allocator, class traits>
|
||||
bool perl_matcher<BidiIterator, Allocator, traits>::match_accept()
|
||||
{
|
||||
if(!recursion_stack.empty())
|
||||
{
|
||||
return skip_until_paren(recursion_stack.back().idx);
|
||||
}
|
||||
else
|
||||
{
|
||||
return skip_until_paren(INT_MAX);
|
||||
}
|
||||
}
|
||||
|
||||
template <class BidiIterator, class Allocator, class traits>
|
||||
bool perl_matcher<BidiIterator, Allocator, traits>::find_restart_any()
|
||||
|
@ -1070,20 +1070,6 @@ bool perl_matcher<BidiIterator, Allocator, traits>::skip_until_paren(int index,
|
||||
return true;
|
||||
}
|
||||
|
||||
template <class BidiIterator, class Allocator, class traits>
|
||||
bool perl_matcher<BidiIterator, Allocator, traits>::match_accept()
|
||||
{
|
||||
if(!recursion_stack.empty())
|
||||
{
|
||||
skip_until_paren(recursion_stack.back().idx);
|
||||
}
|
||||
else
|
||||
{
|
||||
skip_until_paren(INT_MAX);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
||||
Unwind and associated proceedures follow, these perform what normal stack
|
||||
|
@ -142,6 +142,8 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_startmark()
|
||||
r = false;
|
||||
else
|
||||
r = true;
|
||||
if(r && m_have_accept)
|
||||
r = skip_until_paren(INT_MAX);
|
||||
break;
|
||||
}
|
||||
case -3:
|
||||
@ -183,6 +185,8 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_startmark()
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if(r && m_have_accept)
|
||||
r = skip_until_paren(INT_MAX);
|
||||
break;
|
||||
}
|
||||
case -4:
|
||||
@ -1003,11 +1007,45 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_commit()
|
||||
}
|
||||
|
||||
template <class BidiIterator, class Allocator, class traits>
|
||||
bool perl_matcher<BidiIterator, Allocator, traits>::match_accept()
|
||||
bool perl_matcher<BidiIterator, Allocator, traits>::skip_until_paren(int index, bool match)
|
||||
{
|
||||
while(pstate)
|
||||
{
|
||||
if(pstate->type == syntax_element_endmark)
|
||||
{
|
||||
if(static_cast<const re_brace*>(pstate)->index == index)
|
||||
{
|
||||
if(match)
|
||||
return this->match_endmark();
|
||||
pstate = pstate->next.p;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Unenclosed closing ), occurs when (*ACCEPT) is inside some other
|
||||
// parenthesis which may or may not have other side effects associated with it.
|
||||
bool r = match_endmark();
|
||||
m_have_accept = true;
|
||||
if(!pstate)
|
||||
return r;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
else if(pstate->type == syntax_element_match)
|
||||
return true;
|
||||
else if(pstate->type == syntax_element_startmark)
|
||||
{
|
||||
int idx = static_cast<const re_brace*>(pstate)->index;
|
||||
pstate = pstate->next.p;
|
||||
skip_until_paren(idx, false);
|
||||
continue;
|
||||
}
|
||||
pstate = pstate->next.p;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
} // namespace BOOST_REGEX_DETAIL_NS
|
||||
} // namespace boost
|
||||
#ifdef BOOST_MSVC
|
||||
|
Reference in New Issue
Block a user