mirror of
https://github.com/Z3Prover/z3
synced 2026-04-04 02:39:02 +00:00
Simplify regex splits
This commit is contained in:
parent
5d912bdfa5
commit
737c5d44ed
3 changed files with 32 additions and 77 deletions
|
|
@ -524,7 +524,7 @@ namespace euf {
|
|||
return n;
|
||||
}
|
||||
|
||||
snode* sgraph::brzozowski_deriv(snode* re, snode* elem, snode* allowed_range) {
|
||||
snode* sgraph::brzozowski_deriv(snode* re, snode* elem) {
|
||||
expr* re_expr = re->get_expr();
|
||||
expr* elem_expr = elem->get_expr();
|
||||
SASSERT(re_expr);
|
||||
|
|
@ -549,26 +549,7 @@ namespace euf {
|
|||
// This avoids generating massive 'ite' structures for symbolic variables.
|
||||
sort* seq_sort = nullptr, *ele_sort = nullptr;
|
||||
if (m_seq.is_re(re_expr, seq_sort) && m_seq.is_seq(seq_sort, ele_sort)) {
|
||||
if (allowed_range && allowed_range->get_expr()) {
|
||||
expr* range_expr = allowed_range->get_expr();
|
||||
expr* lo = nullptr, *hi = nullptr;
|
||||
if (m_seq.re.is_full_char(range_expr)) {
|
||||
// For full char, we can't substitute a representative without losing info.
|
||||
// Fallback to testing the symbolic character.
|
||||
}
|
||||
else if (m_seq.re.is_range(range_expr, lo, hi) && lo) {
|
||||
expr* lo_ch = nullptr;
|
||||
zstring zs;
|
||||
if (m_seq.str.is_unit(lo, lo_ch))
|
||||
elem_expr = lo_ch;
|
||||
else if (m_seq.str.is_string(lo, zs) && zs.length() > 0)
|
||||
elem_expr = m_seq.str.mk_char(zs[0]);
|
||||
else
|
||||
elem_expr = lo; // Use representative to take the derivative
|
||||
}
|
||||
}
|
||||
// Fallback: If elem itself is a regex predicate, extract representative
|
||||
else if (ele_sort != elem_expr->get_sort()) {
|
||||
if (ele_sort != elem_expr->get_sort()) {
|
||||
// std::cout << "Different sorts: " << ele_sort->get_name() << " vs " << elem_expr->get_sort()->get_name() << std::endl;
|
||||
expr* lo = nullptr, *hi = nullptr;
|
||||
if (m_seq.re.is_full_char(elem_expr))
|
||||
|
|
|
|||
|
|
@ -142,7 +142,7 @@ namespace euf {
|
|||
// Brzozowski derivative of regex re with respect to element elem.
|
||||
// allowed_range can explicitly provide a concrete character or range to use
|
||||
// for deriving symbolic variables.
|
||||
snode* brzozowski_deriv(snode* re, snode* elem, snode* allowed_range = nullptr);
|
||||
snode* brzozowski_deriv(snode* re, snode* elem);
|
||||
|
||||
// Decode a character expression that may be represented as a const-char,
|
||||
// a unit string containing a const-char, or a one-character string literal.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue