3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-06-10 08:03:25 +00:00

recover error stream from dimacs

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2018-11-12 15:33:46 -08:00
parent ef9b46b2e5
commit 9b4cf1559d
4 changed files with 36 additions and 25 deletions

View file

@ -183,8 +183,12 @@ extern "C" {
} }
else if (ext && std::string("dimacs") == ext) { else if (ext && std::string("dimacs") == ext) {
ast_manager& m = to_solver_ref(s)->get_manager(); ast_manager& m = to_solver_ref(s)->get_manager();
std::stringstream err;
sat::solver solver(to_solver_ref(s)->get_params(), m.limit()); sat::solver solver(to_solver_ref(s)->get_params(), m.limit());
parse_dimacs(is, solver); if (!parse_dimacs(is, err, solver)) {
SET_ERROR_CODE(Z3_PARSER_ERROR, err.str().c_str());
return;
}
sat2goal s2g; sat2goal s2g;
ref<sat2goal::mc> mc; ref<sat2goal::mc> mc;
atom2bool_var a2b(m); atom2bool_var a2b(m);

View file

@ -21,6 +21,8 @@ Revision History:
#undef min #undef min
#include "sat/sat_solver.h" #include "sat/sat_solver.h"
struct lex_error {};
class stream_buffer { class stream_buffer {
std::istream & m_stream; std::istream & m_stream;
int m_val; int m_val;
@ -67,7 +69,7 @@ void skip_line(Buffer & in) {
} }
template<typename Buffer> template<typename Buffer>
int parse_int(Buffer & in) { int parse_int(Buffer & in, std::ostream& err) {
int val = 0; int val = 0;
bool neg = false; bool neg = false;
skip_whitespace(in); skip_whitespace(in);
@ -81,9 +83,8 @@ int parse_int(Buffer & in) {
} }
if (*in < '0' || *in > '9') { if (*in < '0' || *in > '9') {
std::cerr << "(error, \"unexpected char: " << *in << " line: " << in.line() << "\")\n"; err << "(error, \"unexpected char: " << *in << " line: " << in.line() << "\")\n";
exit(3); throw lex_error();
exit(ERR_PARSER);
} }
while (*in >= '0' && *in <= '9') { while (*in >= '0' && *in <= '9') {
@ -95,14 +96,14 @@ int parse_int(Buffer & in) {
} }
template<typename Buffer> template<typename Buffer>
void read_clause(Buffer & in, sat::solver & solver, sat::literal_vector & lits) { void read_clause(Buffer & in, std::ostream& err, sat::solver & solver, sat::literal_vector & lits) {
int parsed_lit; int parsed_lit;
int var; int var;
lits.reset(); lits.reset();
while (true) { while (true) {
parsed_lit = parse_int(in); parsed_lit = parse_int(in, err);
if (parsed_lit == 0) if (parsed_lit == 0)
break; break;
var = abs(parsed_lit); var = abs(parsed_lit);
@ -114,24 +115,30 @@ void read_clause(Buffer & in, sat::solver & solver, sat::literal_vector & lits)
} }
template<typename Buffer> template<typename Buffer>
void parse_dimacs_core(Buffer & in, sat::solver & solver) { bool parse_dimacs_core(Buffer & in, std::ostream& err, sat::solver & solver) {
sat::literal_vector lits; sat::literal_vector lits;
while (true) { try {
skip_whitespace(in); while (true) {
if (*in == EOF) { skip_whitespace(in);
break; if (*in == EOF) {
} break;
else if (*in == 'c' || *in == 'p') { }
skip_line(in); else if (*in == 'c' || *in == 'p') {
} skip_line(in);
else { }
read_clause(in, solver, lits); else {
solver.mk_clause(lits.size(), lits.c_ptr()); read_clause(in, err, solver, lits);
solver.mk_clause(lits.size(), lits.c_ptr());
}
} }
} }
catch (lex_error) {
return false;
}
return true;
} }
void parse_dimacs(std::istream & in, sat::solver & solver) { bool parse_dimacs(std::istream & in, std::ostream& err, sat::solver & solver) {
stream_buffer _in(in); stream_buffer _in(in);
parse_dimacs_core(_in, solver); return parse_dimacs_core(_in, err, solver);
} }

View file

@ -21,7 +21,7 @@ Revision History:
#include "sat/sat_types.h" #include "sat/sat_types.h"
void parse_dimacs(std::istream & s, sat::solver & solver); bool parse_dimacs(std::istream & s, std::ostream& err, sat::solver & solver);
#endif /* DIMACS_PARSER_H_ */ #endif /* DIMACS_PARSER_H_ */

View file

@ -136,7 +136,7 @@ void verify_solution(char const * file_name) {
std::cerr << "(error \"failed to open file '" << file_name << "'\")" << std::endl; std::cerr << "(error \"failed to open file '" << file_name << "'\")" << std::endl;
exit(ERR_OPEN_FILE); exit(ERR_OPEN_FILE);
} }
parse_dimacs(in, solver); parse_dimacs(in, std::cerr, solver);
sat::model const & m = g_solver->get_model(); sat::model const & m = g_solver->get_model();
for (unsigned i = 1; i < m.size(); i++) { for (unsigned i = 1; i < m.size(); i++) {
@ -178,10 +178,10 @@ unsigned read_dimacs(char const * file_name) {
std::cerr << "(error \"failed to open file '" << file_name << "'\")" << std::endl; std::cerr << "(error \"failed to open file '" << file_name << "'\")" << std::endl;
exit(ERR_OPEN_FILE); exit(ERR_OPEN_FILE);
} }
parse_dimacs(in, solver); parse_dimacs(in, std::cerr, solver);
} }
else { else {
parse_dimacs(std::cin, solver); parse_dimacs(std::cin, std::cerr, solver);
} }
IF_VERBOSE(20, solver.display_status(verbose_stream());); IF_VERBOSE(20, solver.display_status(verbose_stream()););