3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-08-22 19:17:53 +00:00

fix regex bug in theory_str for empty string match. need to fix indents

This commit is contained in:
Murphy Berzish 2017-08-06 17:17:04 -04:00
parent 9d6be286d0
commit f4c0e0b28d

View file

@ -6189,27 +6189,33 @@ namespace smt {
expr * arg_str = a->get_arg(0); expr * arg_str = a->get_arg(0);
zstring str; zstring str;
if (u.str.is_string(arg_str, str)) { if (u.str.is_string(arg_str, str)) {
TRACE("str", tout << "build NFA for '" << str << "'" << "\n";); if (str.length() == 0) {
/* // transitioning on the empty string is handled specially
* For an n-character string, we make (n-1) intermediate states, TRACE("str", tout << "empty string epsilon-move " << start << " --> " << end << std::endl;);
* labelled i_(0) through i_(n-2). make_epsilon_move(start, end);
* Then we construct the following transitions: } else {
* start --str[0]--> i_(0) --str[1]--> i_(1) --...--> i_(n-2) --str[n-1]--> final TRACE("str", tout << "build NFA for '" << str << "'" << "\n";);
*/ /*
unsigned last = start; * For an n-character string, we make (n-1) intermediate states,
for (int i = 0; i <= ((int)str.length()) - 2; ++i) { * labelled i_(0) through i_(n-2).
unsigned i_state = next_id(); * Then we construct the following transitions:
make_transition(last, str[i], i_state); * start --str[0]--> i_(0) --str[1]--> i_(1) --...--> i_(n-2) --str[n-1]--> final
TRACE("str", tout << "string transition " << last << "--" << str[i] << "--> " << i_state << "\n";); */
last = i_state; unsigned last = start;
} for (int i = 0; i <= ((int)str.length()) - 2; ++i) {
make_transition(last, str[(str.length() - 1)], end); unsigned i_state = next_id();
TRACE("str", tout << "string transition " << last << "--" << str[(str.length() - 1)] << "--> " << end << "\n";); make_transition(last, str[i], i_state);
} else { TRACE("str", tout << "string transition " << last << "--" << str[i] << "--> " << i_state << "\n";);
TRACE("str", tout << "invalid string constant in Str2Reg" << std::endl;); last = i_state;
m_valid = false; }
return; make_transition(last, str[(str.length() - 1)], end);
} TRACE("str", tout << "string transition " << last << "--" << str[(str.length() - 1)] << "--> " << end << "\n";);
}
} else { // ! u.str.is_string(arg_str, str)
TRACE("str", tout << "invalid string constant in Str2Reg" << std::endl;);
m_valid = false;
return;
}
} else if (u.re.is_concat(e)){ } else if (u.re.is_concat(e)){
app * a = to_app(e); app * a = to_app(e);
expr * re1 = a->get_arg(0); expr * re1 = a->get_arg(0);