mirror of
https://github.com/Z3Prover/z3
synced 2025-06-06 22:23:22 +00:00
parse RegLan
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
d3c00ca2c3
commit
21c4d451d8
2 changed files with 36 additions and 16 deletions
|
@ -412,7 +412,7 @@ seq_decl_plugin::seq_decl_plugin(): m_init(false),
|
||||||
m_charc_sym("Char"),
|
m_charc_sym("Char"),
|
||||||
m_string(nullptr),
|
m_string(nullptr),
|
||||||
m_char(nullptr),
|
m_char(nullptr),
|
||||||
m_re(nullptr),
|
m_reglan(nullptr),
|
||||||
m_has_re(false),
|
m_has_re(false),
|
||||||
m_has_seq(false) {}
|
m_has_seq(false) {}
|
||||||
|
|
||||||
|
@ -422,7 +422,7 @@ void seq_decl_plugin::finalize() {
|
||||||
}
|
}
|
||||||
m_manager->dec_ref(m_string);
|
m_manager->dec_ref(m_string);
|
||||||
m_manager->dec_ref(m_char);
|
m_manager->dec_ref(m_char);
|
||||||
m_manager->dec_ref(m_re);
|
m_manager->dec_ref(m_reglan);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool seq_decl_plugin::is_sort_param(sort* s, unsigned& idx) {
|
bool seq_decl_plugin::is_sort_param(sort* s, unsigned& idx) {
|
||||||
|
@ -642,14 +642,15 @@ void seq_decl_plugin::init() {
|
||||||
void seq_decl_plugin::set_manager(ast_manager* m, family_id id) {
|
void seq_decl_plugin::set_manager(ast_manager* m, family_id id) {
|
||||||
decl_plugin::set_manager(m, id);
|
decl_plugin::set_manager(m, id);
|
||||||
bv_util bv(*m);
|
bv_util bv(*m);
|
||||||
|
// to be changed to Unicode (abstract sort)
|
||||||
m_char = bv.mk_sort(8);
|
m_char = bv.mk_sort(8);
|
||||||
m->inc_ref(m_char);
|
m->inc_ref(m_char);
|
||||||
parameter param(m_char);
|
parameter param(m_char);
|
||||||
m_string = m->mk_sort(symbol("String"), sort_info(m_family_id, SEQ_SORT, 1, ¶m));
|
m_string = m->mk_sort(symbol("String"), sort_info(m_family_id, SEQ_SORT, 1, ¶m));
|
||||||
m->inc_ref(m_string);
|
m->inc_ref(m_string);
|
||||||
parameter paramS(m_string);
|
parameter paramS(m_string);
|
||||||
m_re = m->mk_sort(m_family_id, RE_SORT, 1, ¶mS);
|
m_reglan = m->mk_sort(m_family_id, RE_SORT, 1, ¶mS);
|
||||||
m->inc_ref(m_re);
|
m->inc_ref(m_reglan);
|
||||||
}
|
}
|
||||||
|
|
||||||
sort * seq_decl_plugin::mk_sort(decl_kind k, unsigned num_parameters, parameter const * parameters) {
|
sort * seq_decl_plugin::mk_sort(decl_kind k, unsigned num_parameters, parameter const * parameters) {
|
||||||
|
@ -676,8 +677,12 @@ sort * seq_decl_plugin::mk_sort(decl_kind k, unsigned num_parameters, parameter
|
||||||
}
|
}
|
||||||
return m.mk_sort(symbol("RegEx"), sort_info(m_family_id, RE_SORT, num_parameters, parameters));
|
return m.mk_sort(symbol("RegEx"), sort_info(m_family_id, RE_SORT, num_parameters, parameters));
|
||||||
}
|
}
|
||||||
|
case _CHAR_SORT:
|
||||||
|
return m_char;
|
||||||
case _STRING_SORT:
|
case _STRING_SORT:
|
||||||
return m_string;
|
return m_string;
|
||||||
|
case _REGLAN_SORT:
|
||||||
|
return m_reglan;
|
||||||
default:
|
default:
|
||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
@ -749,14 +754,14 @@ func_decl * seq_decl_plugin::mk_func_decl(decl_kind k, unsigned num_parameters,
|
||||||
|
|
||||||
case _OP_REGEXP_FULL_CHAR:
|
case _OP_REGEXP_FULL_CHAR:
|
||||||
m_has_re = true;
|
m_has_re = true;
|
||||||
if (!range) range = m_re;
|
if (!range) range = m_reglan;
|
||||||
match(*m_sigs[k], arity, domain, range, rng);
|
match(*m_sigs[k], arity, domain, range, rng);
|
||||||
return m.mk_func_decl(symbol("re.allchar"), arity, domain, rng, func_decl_info(m_family_id, OP_RE_FULL_CHAR_SET));
|
return m.mk_func_decl(symbol("re.allchar"), arity, domain, rng, func_decl_info(m_family_id, OP_RE_FULL_CHAR_SET));
|
||||||
|
|
||||||
case OP_RE_FULL_CHAR_SET:
|
case OP_RE_FULL_CHAR_SET:
|
||||||
m_has_re = true;
|
m_has_re = true;
|
||||||
if (!range) range = m_re;
|
if (!range) range = m_reglan;
|
||||||
if (range == m_re) {
|
if (range == m_reglan) {
|
||||||
match(*m_sigs[k], arity, domain, range, rng);
|
match(*m_sigs[k], arity, domain, range, rng);
|
||||||
return m.mk_func_decl(symbol("re.allchar"), arity, domain, rng, func_decl_info(m_family_id, k));
|
return m.mk_func_decl(symbol("re.allchar"), arity, domain, rng, func_decl_info(m_family_id, k));
|
||||||
}
|
}
|
||||||
|
@ -764,19 +769,19 @@ func_decl * seq_decl_plugin::mk_func_decl(decl_kind k, unsigned num_parameters,
|
||||||
|
|
||||||
case OP_RE_FULL_SEQ_SET:
|
case OP_RE_FULL_SEQ_SET:
|
||||||
m_has_re = true;
|
m_has_re = true;
|
||||||
if (!range) range = m_re;
|
if (!range) range = m_reglan;
|
||||||
return m.mk_func_decl(m_sigs[k]->m_name, arity, domain, range, func_decl_info(m_family_id, k));
|
return m.mk_func_decl(m_sigs[k]->m_name, arity, domain, range, func_decl_info(m_family_id, k));
|
||||||
|
|
||||||
case _OP_REGEXP_EMPTY:
|
case _OP_REGEXP_EMPTY:
|
||||||
m_has_re = true;
|
m_has_re = true;
|
||||||
if (!range) range = m_re;
|
if (!range) range = m_reglan;
|
||||||
match(*m_sigs[k], arity, domain, range, rng);
|
match(*m_sigs[k], arity, domain, range, rng);
|
||||||
return m.mk_func_decl(symbol("re.none"), arity, domain, rng, func_decl_info(m_family_id, OP_RE_EMPTY_SET));
|
return m.mk_func_decl(symbol("re.none"), arity, domain, rng, func_decl_info(m_family_id, OP_RE_EMPTY_SET));
|
||||||
|
|
||||||
case OP_RE_EMPTY_SET:
|
case OP_RE_EMPTY_SET:
|
||||||
m_has_re = true;
|
m_has_re = true;
|
||||||
if (!range) range = m_re;
|
if (!range) range = m_reglan;
|
||||||
if (range == m_re) {
|
if (range == m_reglan) {
|
||||||
match(*m_sigs[k], arity, domain, range, rng);
|
match(*m_sigs[k], arity, domain, range, rng);
|
||||||
return m.mk_func_decl(symbol("re.none"), arity, domain, rng, func_decl_info(m_family_id, k));
|
return m.mk_func_decl(symbol("re.none"), arity, domain, rng, func_decl_info(m_family_id, k));
|
||||||
}
|
}
|
||||||
|
@ -792,12 +797,12 @@ func_decl * seq_decl_plugin::mk_func_decl(decl_kind k, unsigned num_parameters,
|
||||||
}
|
}
|
||||||
return m.mk_func_decl(m_sigs[k]->m_name, arity, domain, rng, func_decl_info(m_family_id, k, num_parameters, parameters));
|
return m.mk_func_decl(m_sigs[k]->m_name, arity, domain, rng, func_decl_info(m_family_id, k, num_parameters, parameters));
|
||||||
case 2:
|
case 2:
|
||||||
if (m_re != domain[0] || !arith_util(m).is_int(domain[1])) {
|
if (m_reglan != domain[0] || !arith_util(m).is_int(domain[1])) {
|
||||||
m.raise_exception("Incorrect type of arguments passed to re.loop. Expecting regular expression and two integer parameters");
|
m.raise_exception("Incorrect type of arguments passed to re.loop. Expecting regular expression and two integer parameters");
|
||||||
}
|
}
|
||||||
return m.mk_func_decl(m_sigs[k]->m_name, arity, domain, domain[0], func_decl_info(m_family_id, k, num_parameters, parameters));
|
return m.mk_func_decl(m_sigs[k]->m_name, arity, domain, domain[0], func_decl_info(m_family_id, k, num_parameters, parameters));
|
||||||
case 3:
|
case 3:
|
||||||
if (m_re != domain[0] || !arith_util(m).is_int(domain[1]) || !arith_util(m).is_int(domain[2])) {
|
if (m_reglan != domain[0] || !arith_util(m).is_int(domain[1]) || !arith_util(m).is_int(domain[2])) {
|
||||||
m.raise_exception("Incorrect type of arguments passed to re.loop. Expecting regular expression and two integer parameters");
|
m.raise_exception("Incorrect type of arguments passed to re.loop. Expecting regular expression and two integer parameters");
|
||||||
}
|
}
|
||||||
return m.mk_func_decl(m_sigs[k]->m_name, arity, domain, domain[0], func_decl_info(m_family_id, k, num_parameters, parameters));
|
return m.mk_func_decl(m_sigs[k]->m_name, arity, domain, domain[0], func_decl_info(m_family_id, k, num_parameters, parameters));
|
||||||
|
@ -932,8 +937,15 @@ void seq_decl_plugin::get_sort_names(svector<builtin_name> & sort_names, symbol
|
||||||
init();
|
init();
|
||||||
sort_names.push_back(builtin_name("Seq", SEQ_SORT));
|
sort_names.push_back(builtin_name("Seq", SEQ_SORT));
|
||||||
sort_names.push_back(builtin_name("RegEx", RE_SORT));
|
sort_names.push_back(builtin_name("RegEx", RE_SORT));
|
||||||
// SMT-LIB 2.5 compatibility
|
|
||||||
|
// TBD:
|
||||||
|
// sort_names.push_back(builtin_name("Unicode", CHAR_SORT));
|
||||||
|
|
||||||
|
// SMTLIB 2.6 RegLan, String
|
||||||
|
sort_names.push_back(builtin_name("RegLan", _REGLAN_SORT));
|
||||||
sort_names.push_back(builtin_name("String", _STRING_SORT));
|
sort_names.push_back(builtin_name("String", _STRING_SORT));
|
||||||
|
|
||||||
|
// SMTLIB 2.5 compatibility
|
||||||
sort_names.push_back(builtin_name("StringSequence", _STRING_SORT));
|
sort_names.push_back(builtin_name("StringSequence", _STRING_SORT));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,12 @@ Revision History:
|
||||||
|
|
||||||
Updated to string sequences 2015-12-5
|
Updated to string sequences 2015-12-5
|
||||||
|
|
||||||
|
TBD:
|
||||||
|
- ((_ re.^ n) RegLan RegLan)
|
||||||
|
- (str.replace_re_all String RegLan String String)
|
||||||
|
- (str.replace_re String RegLan String String)
|
||||||
|
- (str.replace_all String String String String)
|
||||||
|
|
||||||
--*/
|
--*/
|
||||||
#ifndef SEQ_DECL_PLUGIN_H_
|
#ifndef SEQ_DECL_PLUGIN_H_
|
||||||
#define SEQ_DECL_PLUGIN_H_
|
#define SEQ_DECL_PLUGIN_H_
|
||||||
|
@ -28,7 +34,9 @@ Revision History:
|
||||||
enum seq_sort_kind {
|
enum seq_sort_kind {
|
||||||
SEQ_SORT,
|
SEQ_SORT,
|
||||||
RE_SORT,
|
RE_SORT,
|
||||||
_STRING_SORT // internal only
|
_CHAR_SORT, // internal only
|
||||||
|
_STRING_SORT,
|
||||||
|
_REGLAN_SORT
|
||||||
};
|
};
|
||||||
|
|
||||||
enum seq_op_kind {
|
enum seq_op_kind {
|
||||||
|
@ -153,7 +161,7 @@ class seq_decl_plugin : public decl_plugin {
|
||||||
symbol m_charc_sym;
|
symbol m_charc_sym;
|
||||||
sort* m_string;
|
sort* m_string;
|
||||||
sort* m_char;
|
sort* m_char;
|
||||||
sort* m_re;
|
sort* m_reglan;
|
||||||
bool m_has_re;
|
bool m_has_re;
|
||||||
bool m_has_seq;
|
bool m_has_seq;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue