3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-12 20:18:18 +00:00

took care of comments for related PR

This commit is contained in:
Margus Veanes 2020-08-13 13:14:00 -07:00
parent 3ab75bdf3b
commit 024ccf1b53
2 changed files with 90 additions and 87 deletions

View file

@ -1469,130 +1469,133 @@ app* seq_util::re::mk_epsilon(sort* seq_sort) {
*/ */
std::string seq_util::re::pp(expr* r) { std::string seq_util::re::pp(expr* r) {
SASSERT(u.is_re(r)); SASSERT(u.is_re(r));
std::ostringstream buffer; std::ostringstream out;
pp_compact_to_buffer(buffer, r); pp(out, r);
return buffer.str(); return out.str();
} }
void seq_util::re::pp_compact_to_buffer(std::ostringstream& buffer, expr* r) { /*
Pretty prints a standard pretty printed view of the regex r into the out stream
*/
void seq_util::re::pp(std::ostream& out, expr* r) {
SASSERT(u.is_re(r)); SASSERT(u.is_re(r));
expr* r1 = nullptr, * r2 = nullptr, * s = nullptr, * s2 = nullptr; expr* r1 = nullptr, * r2 = nullptr, * s = nullptr, * s2 = nullptr;
unsigned lo = 0, hi = 0; unsigned lo = 0, hi = 0;
if (is_full_char(r)) if (is_full_char(r))
buffer << "."; out << ".";
else if (is_full_seq(r)) else if (is_full_seq(r))
buffer << ".*"; out << ".*";
else if (is_to_re(r, s)) else if (is_to_re(r, s))
pp_compact_helper_seq(buffer, s); pp_compact_helper_seq(out, s);
else if (is_range(r, s, s2)) else if (is_range(r, s, s2))
pp_compact_helper_range(buffer, s, s2); pp_compact_helper_range(out, s, s2);
else if (is_epsilon(r)) else if (is_epsilon(r))
buffer << "()"; out << "()";
else if (is_empty(r)) else if (is_empty(r))
buffer << "[]"; out << "[]";
else if (is_concat(r, r1, r2)) { else if (is_concat(r, r1, r2)) {
pp_compact_to_buffer(buffer, r1); pp(out, r1);
pp_compact_to_buffer(buffer, r2); pp(out, r2);
} }
else if (is_union(r, r1, r2)) { else if (is_union(r, r1, r2)) {
pp_compact_to_buffer(buffer, r1); pp(out, r1);
buffer << "|"; out << "|";
pp_compact_to_buffer(buffer, r2); pp(out, r2);
} }
else if (is_intersection(r, r1, r2)) { else if (is_intersection(r, r1, r2)) {
buffer << "("; out << "(";
pp_compact_to_buffer(buffer, r1); pp(out, r1);
buffer << ")&("; out << ")&(";
pp_compact_to_buffer(buffer, r2); pp(out, r2);
buffer << ")"; out << ")";
} }
else if (is_complement(r, r1)) { else if (is_complement(r, r1)) {
buffer << "~"; out << "~";
if (pp_can_skip_parenth(r1)) if (pp_can_skip_parenth(r1))
pp_compact_to_buffer(buffer, r1); pp(out, r1);
else { else {
buffer << "("; out << "(";
pp_compact_to_buffer(buffer, r1); pp(out, r1);
buffer << ")"; out << ")";
} }
} }
else if (is_plus(r, r1)) else if (is_plus(r, r1))
if (pp_can_skip_parenth(r1)) { if (pp_can_skip_parenth(r1)) {
pp_compact_to_buffer(buffer, r1); pp(out, r1);
buffer << "+"; out << "+";
} }
else { else {
buffer << "("; out << "(";
pp_compact_to_buffer(buffer, r1); pp(out, r1);
buffer << ")+"; out << ")+";
} }
else if (is_star(r, r1)) else if (is_star(r, r1))
if (pp_can_skip_parenth(r1)) { if (pp_can_skip_parenth(r1)) {
pp_compact_to_buffer(buffer, r1); pp(out, r1);
buffer << "*"; out << "*";
} }
else { else {
buffer << "("; out << "(";
pp_compact_to_buffer(buffer, r1); pp(out, r1);
buffer << ")*"; out << ")*";
} }
else if (is_loop(r, r1, lo)) else if (is_loop(r, r1, lo))
if (pp_can_skip_parenth(r1)) if (pp_can_skip_parenth(r1))
{ {
pp_compact_to_buffer(buffer, r1); pp(out, r1);
buffer << "{" << std::to_string(lo) << ",}"; out << "{" << lo << ",}";
} }
else { else {
buffer << "("; out << "(";
pp_compact_to_buffer(buffer, r1); pp(out, r1);
buffer << "){" << std::to_string(lo) << ",}"; out << "){" << lo << ",}";
} }
else if (is_loop(r, r1, lo, hi)) else if (is_loop(r, r1, lo, hi))
if (pp_can_skip_parenth(r1)) if (pp_can_skip_parenth(r1))
{ {
pp_compact_to_buffer(buffer, r1); pp(out, r1);
buffer << "{" << std::to_string(lo) << "," << std::to_string(hi) << "}"; out << "{" << lo << "," << hi << "}";
} }
else { else {
buffer << "("; out << "(";
pp_compact_to_buffer(buffer, r1); pp(out, r1);
buffer << "){" << std::to_string(lo) << "," << std::to_string(hi) << "}"; out << "){" << lo << "," << hi << "}";
} }
else if (is_diff(r, r1, r2)) { else if (is_diff(r, r1, r2)) {
buffer << "("; out << "(";
pp_compact_to_buffer(buffer, r1); pp(out, r1);
buffer << ")\\("; out << ")\\(";
pp_compact_to_buffer(buffer, r2); pp(out, r2);
buffer << ")"; out << ")";
} }
else if (m.is_ite(r, s, r1, r2)) { else if (m.is_ite(r, s, r1, r2)) {
buffer << "if(" << mk_pp(s, m) << ","; out << "if(" << mk_pp(s, m) << ",";
pp_compact_to_buffer(buffer, r1); pp(out, r1);
buffer << ","; out << ",";
pp_compact_to_buffer(buffer, r2); pp(out, r2);
buffer << ")"; out << ")";
} }
else if (is_opt(r, r1)) else if (is_opt(r, r1))
if (pp_can_skip_parenth(r1)) { if (pp_can_skip_parenth(r1)) {
pp_compact_to_buffer(buffer, r1); pp(out, r1);
buffer << "?"; out << "?";
} }
else { else {
buffer << "("; out << "(";
pp_compact_to_buffer(buffer, r1); pp(out, r1);
buffer << ")?"; out << ")?";
} }
else if (is_reverse(r, r1)) { else if (is_reverse(r, r1)) {
buffer << "reverse("; out << "reverse(";
pp_compact_to_buffer(buffer, r1); pp(out, r1);
buffer << ")"; out << ")";
} }
else else
// Else: derivative or is_of_pred // Else: derivative or is_of_pred
buffer << mk_pp(r, m); out << mk_pp(r, m);
} }
void seq_util::re::pp_compact_helper_seq(std::ostringstream& buffer, expr* s) { void seq_util::re::pp_compact_helper_seq(std::ostream& out, expr* s) {
SASSERT(u.is_seq(s)); SASSERT(u.is_seq(s));
if (m.is_value(s)) { if (m.is_value(s)) {
SASSERT(s->get_kind() == ast_kind::AST_APP); SASSERT(s->get_kind() == ast_kind::AST_APP);
@ -1601,29 +1604,29 @@ void seq_util::re::pp_compact_helper_seq(std::ostringstream& buffer, expr* s) {
u.str.get_concat(s, es); u.str.get_concat(s, es);
for (unsigned i = 0; i < es.size(); i++) for (unsigned i = 0; i < es.size(); i++)
if (u.str.is_unit(es.get(i))) if (u.str.is_unit(es.get(i)))
pp_seq_unit(buffer, es.get(i)); pp_seq_unit(out, es.get(i));
else else
buffer << mk_pp(es.get(i), m); out << mk_pp(es.get(i), m);
} }
else else
pp_seq_unit(buffer, s); pp_seq_unit(out, s);
} }
else else
buffer << mk_pp(s, m); out << mk_pp(s, m);
} }
void seq_util::re::pp_compact_helper_range(std::ostringstream& buffer, expr* s1, expr* s2) { void seq_util::re::pp_compact_helper_range(std::ostream& out, expr* s1, expr* s2) {
buffer << "["; out << "[";
if (u.str.is_unit(s1)) if (u.str.is_unit(s1))
pp_seq_unit(buffer, s1); pp_seq_unit(out, s1);
else else
buffer << mk_pp(s1, m); out << mk_pp(s1, m);
buffer << "-"; out << "-";
if (u.str.is_unit(s2)) if (u.str.is_unit(s2))
pp_seq_unit(buffer, s2); pp_seq_unit(out, s2);
else else
buffer << mk_pp(s1, m); out << mk_pp(s1, m);
buffer << "]"; out << "]";
} }
bool seq_util::re::pp_can_skip_parenth(expr* r) { bool seq_util::re::pp_can_skip_parenth(expr* r) {
@ -1631,7 +1634,7 @@ bool seq_util::re::pp_can_skip_parenth(expr* r) {
return ((is_to_re(r, s) && u.str.is_unit(s)) || is_range(r)); return ((is_to_re(r, s) && u.str.is_unit(s)) || is_range(r));
} }
void seq_util::re::pp_seq_unit(std::ostringstream& buffer, expr* s) { void seq_util::re::pp_seq_unit(std::ostream& out, expr* s) {
expr* e; expr* e;
if (u.str.is_unit(s, e)) { if (u.str.is_unit(s, e)) {
rational r; rational r;
@ -1639,15 +1642,15 @@ void seq_util::re::pp_seq_unit(std::ostringstream& buffer, expr* s) {
if (u.bv().is_numeral(e, r, sz) && sz == 8 && r.is_unsigned()) { if (u.bv().is_numeral(e, r, sz) && sz == 8 && r.is_unsigned()) {
unsigned n = r.get_unsigned(); unsigned n = r.get_unsigned();
if (32 < n && n < 127) if (32 < n && n < 127)
buffer << (char)n; out << (char)n;
else if (n < 10) else if (n < 10)
buffer << "\\x0" << std::hex << n; out << "\\x0" << std::hex << n;
else else
buffer << "\\x" << std::hex << n; out << "\\x" << std::hex << n;
} }
else else
buffer << mk_pp(s, m); out << mk_pp(s, m);
} }
else else
buffer << mk_pp(s, m); out << mk_pp(s, m);
} }

View file

@ -410,11 +410,10 @@ public:
seq_util& u; seq_util& u;
ast_manager& m; ast_manager& m;
family_id m_fid; family_id m_fid;
void seq_util::re::pp_compact_helper_seq(std::ostringstream& buffer, expr* s); void seq_util::re::pp_compact_helper_seq(std::ostream& out, expr* s);
void seq_util::re::pp_compact_helper_range(std::ostringstream& buffer, expr* s1, expr* s2); void seq_util::re::pp_compact_helper_range(std::ostream& out, expr* s1, expr* s2);
bool seq_util::re::pp_can_skip_parenth(expr* r); bool seq_util::re::pp_can_skip_parenth(expr* r);
void seq_util::re::pp_seq_unit(std::ostringstream& buffer, expr* s); void seq_util::re::pp_seq_unit(std::ostream& out, expr* s);
void pp_compact_to_buffer(std::ostringstream& buffer, expr* r);
public: public:
re(seq_util& u): u(u), m(u.m), m_fid(u.m_fid) {} re(seq_util& u): u(u), m(u.m), m_fid(u.m_fid) {}
@ -483,6 +482,7 @@ public:
bool is_epsilon(expr* r) const; bool is_epsilon(expr* r) const;
app* mk_epsilon(sort* seq_sort); app* mk_epsilon(sort* seq_sort);
std::string pp(expr* r); std::string pp(expr* r);
void pp(std::ostream& out, expr* r);
}; };
str str; str str;
re re; re re;