mirror of
https://github.com/Z3Prover/z3
synced 2026-04-21 19:33:30 +00:00
Fixed couple of regex problems [there are still others]
This commit is contained in:
parent
b1bae695e6
commit
ab53889c10
11 changed files with 392 additions and 382 deletions
|
|
@ -725,83 +725,7 @@ namespace seq {
|
|||
}
|
||||
|
||||
// -----------------------------------------------------------------------
|
||||
// Collect first characters
|
||||
// -----------------------------------------------------------------------
|
||||
|
||||
void seq_regex::collect_first_chars(euf::snode* re, euf::snode_vector& chars) {
|
||||
if (!re)
|
||||
return;
|
||||
|
||||
// to_re(s): extract first character of the string body
|
||||
if (re->is_to_re()) {
|
||||
euf::snode* body = re->arg(0);
|
||||
if (body && !body->is_empty()) {
|
||||
euf::snode* first = body->first();
|
||||
if (first && first->is_char()) {
|
||||
bool dup = false;
|
||||
for (euf::snode* c : chars)
|
||||
if (c == first) { dup = true; break; }
|
||||
if (!dup)
|
||||
chars.push_back(first);
|
||||
}
|
||||
// Handle string literals (classified as s_other in sgraph)
|
||||
else if (first && first->get_expr()) {
|
||||
seq_util& seq = m_sg.get_seq_util();
|
||||
zstring s;
|
||||
if (seq.str.is_string(first->get_expr(), s) && s.length() > 0) {
|
||||
euf::snode* ch = m_sg.mk_char(s[0]);
|
||||
bool dup = false;
|
||||
for (euf::snode* c : chars)
|
||||
if (c == ch) { dup = true; break; }
|
||||
if (!dup)
|
||||
chars.push_back(ch);
|
||||
}
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// leaf cases: produce representative characters for character classes
|
||||
if (re->is_full_char()) {
|
||||
// full character set (.): use 'a' as representative
|
||||
euf::snode* ch = m_sg.mk_char('a');
|
||||
bool dup = false;
|
||||
for (euf::snode* c : chars)
|
||||
if (c == ch) { dup = true; break; }
|
||||
if (!dup)
|
||||
chars.push_back(ch);
|
||||
return;
|
||||
}
|
||||
|
||||
// re.range(lo, hi): use lo as representative
|
||||
if (re->get_expr()) {
|
||||
seq_util& seq = m_sg.get_seq_util();
|
||||
expr* lo = nullptr, *hi = nullptr;
|
||||
if (seq.re.is_range(re->get_expr(), lo, hi) && lo) {
|
||||
zstring s;
|
||||
unsigned ch_val = 'a';
|
||||
if (seq.is_const_char(lo, ch_val)) {
|
||||
euf::snode* ch = m_sg.mk_char(ch_val);
|
||||
bool dup = false;
|
||||
for (euf::snode* c : chars)
|
||||
if (c == ch) { dup = true; break; }
|
||||
if (!dup)
|
||||
chars.push_back(ch);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (re->is_fail() || re->is_full_seq())
|
||||
return;
|
||||
|
||||
// recurse into children (handles union, concat, star, loop, etc.)
|
||||
for (unsigned i = 0; i < re->num_args(); ++i)
|
||||
collect_first_chars(re->arg(i), chars);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------
|
||||
// Membership processing
|
||||
// Membership processing
|
||||
// -----------------------------------------------------------------------
|
||||
|
||||
bool seq_regex::process_str_mem(seq::str_mem const& mem,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue