mirror of
https://github.com/Z3Prover/z3
synced 2025-04-23 17:15:31 +00:00
add range / loop handling for re. Fix regression reading mixed numerals reported by Trentin
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
9a6fe93e6c
commit
9909c056f0
8 changed files with 200 additions and 58 deletions
|
@ -151,7 +151,7 @@ public:
|
|||
m_final_states(other.m_final_states)
|
||||
{}
|
||||
|
||||
// create the automaton that accepts the empty string only.
|
||||
// create the automaton that accepts the empty string/sequence only.
|
||||
static automaton* mk_epsilon(M& m) {
|
||||
moves mvs;
|
||||
unsigned_vector final;
|
||||
|
@ -168,10 +168,24 @@ public:
|
|||
return alloc(automaton, m, 0, final, mvs);
|
||||
}
|
||||
|
||||
static automaton* clone(automaton const& a) {
|
||||
moves mvs;
|
||||
unsigned_vector final;
|
||||
append_moves(0, a, mvs);
|
||||
append_final(0, a, final);
|
||||
return alloc(automaton, a.m, a.init(), final, mvs);
|
||||
}
|
||||
|
||||
// create the sum of disjoint automata
|
||||
static automaton* mk_union(automaton const& a, automaton const& b) {
|
||||
SASSERT(&a.m == &b.m);
|
||||
M& m = a.m;
|
||||
if (a.is_empty()) {
|
||||
return clone(b);
|
||||
}
|
||||
if (b.is_empty()) {
|
||||
return clone(a);
|
||||
}
|
||||
moves mvs;
|
||||
unsigned_vector final;
|
||||
unsigned offset1 = 1;
|
||||
|
@ -196,6 +210,10 @@ public:
|
|||
init = 0;
|
||||
mvs.push_back(move(m, 0, a.init() + offset));
|
||||
}
|
||||
if (a.is_empty()) {
|
||||
return clone(a);
|
||||
}
|
||||
|
||||
mvs.push_back(move(m, init, a.final_state() + offset));
|
||||
append_moves(offset, a, mvs);
|
||||
append_final(offset, a, final);
|
||||
|
@ -206,6 +224,19 @@ public:
|
|||
static automaton* mk_concat(automaton const& a, automaton const& b) {
|
||||
SASSERT(&a.m == &b.m);
|
||||
M& m = a.m;
|
||||
if (a.is_empty()) {
|
||||
return clone(a);
|
||||
}
|
||||
if (b.is_empty()) {
|
||||
return clone(b);
|
||||
}
|
||||
if (a.is_epsilon()) {
|
||||
return clone(b);
|
||||
}
|
||||
if (b.is_epsilon()) {
|
||||
return clone(a);
|
||||
}
|
||||
|
||||
moves mvs;
|
||||
unsigned_vector final;
|
||||
unsigned init = 0;
|
||||
|
@ -295,6 +326,10 @@ public:
|
|||
// src - e -> dst - ET -> Dst1 => src - ET -> Dst1 if in_degree(dst) = 1, src != dst
|
||||
// Src - E -> dst - et -> dst1 => Src - et -> dst1 if out_degree(dst) = 1, src != dst
|
||||
//
|
||||
// Some missing:
|
||||
// src - et -> dst - E -> Dst1 => src - et -> Dst1 if in_degree(dst) = 1
|
||||
// Src - ET -> dst - e -> dst1 => Src - ET -> dst1 if out_degree(dst) = 1,
|
||||
//
|
||||
void compress() {
|
||||
for (unsigned i = 0; i < m_delta.size(); ++i) {
|
||||
for (unsigned j = 0; j < m_delta[i].size(); ++j) {
|
||||
|
@ -446,6 +481,7 @@ public:
|
|||
}
|
||||
|
||||
bool is_empty() const { return m_final_states.empty(); }
|
||||
bool is_epsilon() const { return m_final_states.size() == 1 && m_final_states.back() == init() && m_delta.empty(); }
|
||||
unsigned final_state() const { return m_final_states[0]; }
|
||||
bool has_single_final_sink() const { return m_final_states.size() == 1 && m_delta[final_state()].empty(); }
|
||||
unsigned num_states() const { return m_delta.size(); }
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue