mirror of
https://github.com/boostorg/regex.git
synced 2025-07-17 14:22:08 +02:00
Add support for ACCEPT verb.
This commit is contained in:
@ -2715,8 +2715,32 @@ bool basic_regex_parser<charT, traits>::parse_perl_verb()
|
|||||||
this->append_state(syntax_element_fail);
|
this->append_state(syntax_element_fail);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
case 'A':
|
||||||
|
if(++m_position == m_end)
|
||||||
|
{
|
||||||
|
// Rewind to start of (* sequence:
|
||||||
|
--m_position;
|
||||||
|
while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
|
||||||
|
fail(regex_constants::error_perl_extension, m_position - m_base);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
if(match_verb("CCEPT"))
|
||||||
|
{
|
||||||
|
if((m_position == m_end) || (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_mark))
|
||||||
|
{
|
||||||
|
// Rewind to start of (* sequence:
|
||||||
|
--m_position;
|
||||||
|
while(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_open_mark) --m_position;
|
||||||
|
fail(regex_constants::error_perl_extension, m_position - m_base);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
++m_position;
|
||||||
|
this->append_state(syntax_element_accept);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -444,6 +444,7 @@ private:
|
|||||||
#endif
|
#endif
|
||||||
bool match_recursion();
|
bool match_recursion();
|
||||||
bool match_fail();
|
bool match_fail();
|
||||||
|
bool match_accept();
|
||||||
|
|
||||||
// find procs stored in s_find_vtable:
|
// find procs stored in s_find_vtable:
|
||||||
bool find_restart_any();
|
bool find_restart_any();
|
||||||
|
@ -800,6 +800,20 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_fail()
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <class BidiIterator, class Allocator, class traits>
|
||||||
|
bool perl_matcher<BidiIterator, Allocator, traits>::match_accept()
|
||||||
|
{
|
||||||
|
// Almost the same as match_match, but we need to close any half-open capturing groups:
|
||||||
|
for(unsigned i = 1; i < m_result.size(); ++i)
|
||||||
|
{
|
||||||
|
if((m_result[i].matched == false) && (m_result[i].first != last))
|
||||||
|
{
|
||||||
|
m_result.set_second(position, i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return match_match();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
template <class BidiIterator, class Allocator, class traits>
|
template <class BidiIterator, class Allocator, class traits>
|
||||||
bool perl_matcher<BidiIterator, Allocator, traits>::find_restart_any()
|
bool perl_matcher<BidiIterator, Allocator, traits>::find_restart_any()
|
||||||
|
@ -141,7 +141,7 @@ struct saved_recursion : public saved_state
|
|||||||
template <class BidiIterator, class Allocator, class traits>
|
template <class BidiIterator, class Allocator, class traits>
|
||||||
bool perl_matcher<BidiIterator, Allocator, traits>::match_all_states()
|
bool perl_matcher<BidiIterator, Allocator, traits>::match_all_states()
|
||||||
{
|
{
|
||||||
static matcher_proc_type const s_match_vtable[31] =
|
static matcher_proc_type const s_match_vtable[32] =
|
||||||
{
|
{
|
||||||
(&perl_matcher<BidiIterator, Allocator, traits>::match_startmark),
|
(&perl_matcher<BidiIterator, Allocator, traits>::match_startmark),
|
||||||
&perl_matcher<BidiIterator, Allocator, traits>::match_endmark,
|
&perl_matcher<BidiIterator, Allocator, traits>::match_endmark,
|
||||||
@ -178,6 +178,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_all_states()
|
|||||||
&perl_matcher<BidiIterator, Allocator, traits>::match_toggle_case,
|
&perl_matcher<BidiIterator, Allocator, traits>::match_toggle_case,
|
||||||
&perl_matcher<BidiIterator, Allocator, traits>::match_recursion,
|
&perl_matcher<BidiIterator, Allocator, traits>::match_recursion,
|
||||||
&perl_matcher<BidiIterator, Allocator, traits>::match_fail,
|
&perl_matcher<BidiIterator, Allocator, traits>::match_fail,
|
||||||
|
&perl_matcher<BidiIterator, Allocator, traits>::match_accept,
|
||||||
};
|
};
|
||||||
|
|
||||||
push_recursion_stopper();
|
push_recursion_stopper();
|
||||||
|
@ -60,7 +60,7 @@ public:
|
|||||||
template <class BidiIterator, class Allocator, class traits>
|
template <class BidiIterator, class Allocator, class traits>
|
||||||
bool perl_matcher<BidiIterator, Allocator, traits>::match_all_states()
|
bool perl_matcher<BidiIterator, Allocator, traits>::match_all_states()
|
||||||
{
|
{
|
||||||
static matcher_proc_type const s_match_vtable[31] =
|
static matcher_proc_type const s_match_vtable[32] =
|
||||||
{
|
{
|
||||||
(&perl_matcher<BidiIterator, Allocator, traits>::match_startmark),
|
(&perl_matcher<BidiIterator, Allocator, traits>::match_startmark),
|
||||||
&perl_matcher<BidiIterator, Allocator, traits>::match_endmark,
|
&perl_matcher<BidiIterator, Allocator, traits>::match_endmark,
|
||||||
@ -97,6 +97,7 @@ bool perl_matcher<BidiIterator, Allocator, traits>::match_all_states()
|
|||||||
&perl_matcher<BidiIterator, Allocator, traits>::match_toggle_case,
|
&perl_matcher<BidiIterator, Allocator, traits>::match_toggle_case,
|
||||||
&perl_matcher<BidiIterator, Allocator, traits>::match_recursion,
|
&perl_matcher<BidiIterator, Allocator, traits>::match_recursion,
|
||||||
&perl_matcher<BidiIterator, Allocator, traits>::match_fail,
|
&perl_matcher<BidiIterator, Allocator, traits>::match_fail,
|
||||||
|
&perl_matcher<BidiIterator, Allocator, traits>::match_accept,
|
||||||
};
|
};
|
||||||
|
|
||||||
if(state_count > max_state_count)
|
if(state_count > max_state_count)
|
||||||
|
@ -123,6 +123,7 @@ enum syntax_element_type
|
|||||||
syntax_element_recurse = syntax_element_toggle_case + 1,
|
syntax_element_recurse = syntax_element_toggle_case + 1,
|
||||||
// Verbs:
|
// Verbs:
|
||||||
syntax_element_fail = syntax_element_recurse + 1,
|
syntax_element_fail = syntax_element_recurse + 1,
|
||||||
|
syntax_element_accept = syntax_element_fail + 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef BOOST_REGEX_DEBUG
|
#ifdef BOOST_REGEX_DEBUG
|
||||||
|
@ -939,4 +939,6 @@ void test_verbs()
|
|||||||
TEST_INVALID_REGEX("a+(*", perl);
|
TEST_INVALID_REGEX("a+(*", perl);
|
||||||
TEST_INVALID_REGEX("a+(*FX)", perl);
|
TEST_INVALID_REGEX("a+(*FX)", perl);
|
||||||
TEST_REGEX_SEARCH("a+(*FAIL)b", perl, "aaaab", match_default, make_array(-2, -2));
|
TEST_REGEX_SEARCH("a+(*FAIL)b", perl, "aaaab", match_default, make_array(-2, -2));
|
||||||
|
TEST_REGEX_SEARCH("(A(A|B(*ACCEPT)|C)D)(E)", perl, "AB", match_default, make_array(0, 2, 0, 2, 1, 2, -1, -1, -2, -2));
|
||||||
|
TEST_REGEX_SEARCH("(A(A|B(*ACCEPT)|C)D)(E)", perl, "ACDE", match_default, make_array(0, 4, 0, 3, 1, 2, 3, 4, -2, -2));
|
||||||
}
|
}
|
Reference in New Issue
Block a user