* iface/gspn/eesrg.cc (format_state): Do not rewrite n's,
just strip the last one. Escaping must be done at output. * iface/gspn/gspm.cc (format_state): Likewise. * src/misc/escape.hh, src/misc/escape.cc: New files. * src/misc/Makefile.am: Add them. * src/tgba/bddprint.cc (bdd_format_accset): New function. * src/tgba/bddprint.hh (bdd_format_accset): New function. * src/tgbaalgos/dotty.cc (dotty_bfs::process_state): Escape the state name using escape_str(). (dotty_bfs::process_link): Escape conditions and acceptance conditions using escape_str(). * src/tgbaalgos/save.cc (save_bfs::start): Call print_acc(). (save_bfs::print_acc): New function extracted from save_bfs::start(). Escape each acceptance condition. (save_bfs::process_state): Use escape_str() and print_acc()
This commit is contained in:
parent
8008deeddd
commit
9297d6dd9f
10 changed files with 182 additions and 91 deletions
16
ChangeLog
16
ChangeLog
|
|
@ -1,5 +1,21 @@
|
||||||
2004-01-06 Alexandre Duret-Lutz <adl@src.lip6.fr>
|
2004-01-06 Alexandre Duret-Lutz <adl@src.lip6.fr>
|
||||||
|
|
||||||
|
* iface/gspn/eesrg.cc (format_state): Do not rewrite \n's,
|
||||||
|
just strip the last one. Escaping must be done at output.
|
||||||
|
* iface/gspn/gspm.cc (format_state): Likewise.
|
||||||
|
* src/misc/escape.hh, src/misc/escape.cc: New files.
|
||||||
|
* src/misc/Makefile.am: Add them.
|
||||||
|
* src/tgba/bddprint.cc (bdd_format_accset): New function.
|
||||||
|
* src/tgba/bddprint.hh (bdd_format_accset): New function.
|
||||||
|
* src/tgbaalgos/dotty.cc (dotty_bfs::process_state):
|
||||||
|
Escape the state name using escape_str().
|
||||||
|
(dotty_bfs::process_link): Escape conditions and acceptance
|
||||||
|
conditions using escape_str().
|
||||||
|
* src/tgbaalgos/save.cc (save_bfs::start): Call print_acc().
|
||||||
|
(save_bfs::print_acc): New function extracted from save_bfs::start().
|
||||||
|
Escape each acceptance condition.
|
||||||
|
(save_bfs::process_state): Use escape_str() and print_acc()
|
||||||
|
|
||||||
* src/ltlvisit/tostring.cc
|
* src/ltlvisit/tostring.cc
|
||||||
(to_string_visitor::visit(const atomic_prop*)): Quote propositions
|
(to_string_visitor::visit(const atomic_prop*)): Quote propositions
|
||||||
that start with F, G, or X.
|
that start with F, G, or X.
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,6 @@
|
||||||
// Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
// Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
// 02111-1307, USA.
|
// 02111-1307, USA.
|
||||||
|
|
||||||
#include <sstream>
|
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
@ -422,7 +421,6 @@ namespace spot
|
||||||
{
|
{
|
||||||
const state_gspn_eesrg* s = dynamic_cast<const state_gspn_eesrg*>(state);
|
const state_gspn_eesrg* s = dynamic_cast<const state_gspn_eesrg*>(state);
|
||||||
assert(s);
|
assert(s);
|
||||||
std::ostringstream os;
|
|
||||||
char* str;
|
char* str;
|
||||||
State gs = s->left();
|
State gs = s->left();
|
||||||
if (gs)
|
if (gs)
|
||||||
|
|
@ -430,30 +428,19 @@ namespace spot
|
||||||
int err = print_state(gs, &str);
|
int err = print_state(gs, &str);
|
||||||
if (err)
|
if (err)
|
||||||
throw gspn_exeption("print_state()", err);
|
throw gspn_exeption("print_state()", err);
|
||||||
|
// Strip trailing \n...
|
||||||
|
unsigned len = strlen(str);
|
||||||
|
while (str[--len] == '\n')
|
||||||
|
str[len] = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
str = strdup("-1");
|
str = strdup("-1");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Rewrite all new lines as \\\n.
|
std::string res(str);
|
||||||
const char* pos = str;
|
|
||||||
while (*pos)
|
|
||||||
{
|
|
||||||
switch (*pos)
|
|
||||||
{
|
|
||||||
// Rewrite all new lines as \\n, and strip the last one.
|
|
||||||
case '\n':
|
|
||||||
if (pos[1])
|
|
||||||
os << "\\n";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
os << *pos;
|
|
||||||
}
|
|
||||||
++pos;
|
|
||||||
}
|
|
||||||
free(str);
|
free(str);
|
||||||
return os.str() + " * " + data_->operand->format_state(s->right());
|
return res + " * " + data_->operand->format_state(s->right());
|
||||||
}
|
}
|
||||||
|
|
||||||
state*
|
state*
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
// Copyright (C) 2003 Laboratoire d'Informatique de Paris 6 (LIP6),
|
// Copyright (C) 2003, 2004 Laboratoire d'Informatique de Paris 6 (LIP6),
|
||||||
// département Systèmes Répartis Coopératifs (SRC), Université Pierre
|
// département Systèmes Répartis Coopératifs (SRC), Université Pierre
|
||||||
// et Marie Curie.
|
// et Marie Curie.
|
||||||
//
|
//
|
||||||
|
|
@ -19,7 +19,6 @@
|
||||||
// Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
// Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
// 02111-1307, USA.
|
// 02111-1307, USA.
|
||||||
|
|
||||||
#include <sstream>
|
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include "gspn.hh"
|
#include "gspn.hh"
|
||||||
|
|
@ -366,30 +365,17 @@ namespace spot
|
||||||
{
|
{
|
||||||
const state_gspn* s = dynamic_cast<const state_gspn*>(state);
|
const state_gspn* s = dynamic_cast<const state_gspn*>(state);
|
||||||
assert(s);
|
assert(s);
|
||||||
std::ostringstream os;
|
|
||||||
char* str;
|
char* str;
|
||||||
int err = print_state(s->get_state(), &str);
|
int err = print_state(s->get_state(), &str);
|
||||||
if (err)
|
if (err)
|
||||||
throw gspn_exeption("print_state()", err);
|
throw gspn_exeption("print_state()", err);
|
||||||
|
// Strip trailing \n...
|
||||||
// Rewrite all new lines as \\\n.
|
unsigned len = strlen(str);
|
||||||
const char* pos = str;
|
while (str[--len] == '\n')
|
||||||
while (*pos)
|
str[len] = 0;
|
||||||
{
|
std::string res(str);
|
||||||
switch (*pos)
|
|
||||||
{
|
|
||||||
// Rewrite all new lines as \\n, and strip the last one.
|
|
||||||
case '\n':
|
|
||||||
if (pos[1])
|
|
||||||
os << "\\n";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
os << *pos;
|
|
||||||
}
|
|
||||||
++pos;
|
|
||||||
}
|
|
||||||
free(str);
|
free(str);
|
||||||
return os.str();
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
bdd
|
bdd
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
## Copyright (C) 2003 Laboratoire d'Informatique de Paris 6 (LIP6),
|
## Copyright (C) 2003, 2004 Laboratoire d'Informatique de Paris 6 (LIP6),
|
||||||
## département Systèmes Répartis Coopératifs (SRC), Université Pierre
|
## département Systèmes Répartis Coopératifs (SRC), Université Pierre
|
||||||
## et Marie Curie.
|
## et Marie Curie.
|
||||||
##
|
##
|
||||||
|
|
@ -27,6 +27,7 @@ miscdir = $(pkgincludedir)/misc
|
||||||
misc_HEADERS = \
|
misc_HEADERS = \
|
||||||
bddalloc.hh \
|
bddalloc.hh \
|
||||||
bddlt.hh \
|
bddlt.hh \
|
||||||
|
escape.hh \
|
||||||
hash.hh \
|
hash.hh \
|
||||||
minato.hh \
|
minato.hh \
|
||||||
version.hh
|
version.hh
|
||||||
|
|
@ -34,5 +35,6 @@ misc_HEADERS = \
|
||||||
noinst_LTLIBRARIES = libmisc.la
|
noinst_LTLIBRARIES = libmisc.la
|
||||||
libmisc_la_SOURCES = \
|
libmisc_la_SOURCES = \
|
||||||
bddalloc.cc \
|
bddalloc.cc \
|
||||||
|
escape.cc \
|
||||||
minato.cc \
|
minato.cc \
|
||||||
version.cc
|
version.cc
|
||||||
|
|
|
||||||
56
src/misc/escape.cc
Normal file
56
src/misc/escape.cc
Normal file
|
|
@ -0,0 +1,56 @@
|
||||||
|
// Copyright (C) 2004 Laboratoire d'Informatique de Paris 6 (LIP6),
|
||||||
|
// département Systèmes Répartis Coopératifs (SRC), Université Pierre
|
||||||
|
// et Marie Curie.
|
||||||
|
//
|
||||||
|
// This file is part of Spot, a model checking library.
|
||||||
|
//
|
||||||
|
// Spot is free software; you can redistribute it and/or modify it
|
||||||
|
// under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation; either version 2 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// Spot is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||||
|
// License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with Spot; see the file COPYING. If not, write to the Free
|
||||||
|
// Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
// 02111-1307, USA.
|
||||||
|
|
||||||
|
#include <sstream>
|
||||||
|
#include "escape.hh"
|
||||||
|
|
||||||
|
namespace spot
|
||||||
|
{
|
||||||
|
std::ostream&
|
||||||
|
escape_str(std::ostream& os, const std::string& str)
|
||||||
|
{
|
||||||
|
for (std::string::const_iterator i = str.begin(); i != str.end(); ++i)
|
||||||
|
switch (*i)
|
||||||
|
{
|
||||||
|
case '\\':
|
||||||
|
os << "\\\\";
|
||||||
|
break;
|
||||||
|
case '"':
|
||||||
|
os << "\\\"";
|
||||||
|
break;
|
||||||
|
case '\n':
|
||||||
|
os << "\\n";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
os << *i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return os;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string
|
||||||
|
escape_str(const std::string& str)
|
||||||
|
{
|
||||||
|
std::ostringstream os;
|
||||||
|
escape_str(os, str);
|
||||||
|
return os.str();
|
||||||
|
}
|
||||||
|
}
|
||||||
36
src/misc/escape.hh
Normal file
36
src/misc/escape.hh
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
// Copyright (C) 2004 Laboratoire d'Informatique de Paris 6 (LIP6),
|
||||||
|
// département Systèmes Répartis Coopératifs (SRC), Université Pierre
|
||||||
|
// et Marie Curie.
|
||||||
|
//
|
||||||
|
// This file is part of Spot, a model checking library.
|
||||||
|
//
|
||||||
|
// Spot is free software; you can redistribute it and/or modify it
|
||||||
|
// under the terms of the GNU General Public License as published by
|
||||||
|
// the Free Software Foundation; either version 2 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// Spot is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
||||||
|
// License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with Spot; see the file COPYING. If not, write to the Free
|
||||||
|
// Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
// 02111-1307, USA.
|
||||||
|
|
||||||
|
#ifndef SPOT_MISC_ESCAPE_HH
|
||||||
|
# define SPOT_MISC_ESCAPE_HH
|
||||||
|
|
||||||
|
# include <iostream>
|
||||||
|
# include <string>
|
||||||
|
|
||||||
|
namespace spot
|
||||||
|
{
|
||||||
|
/// Escape " and \ characters in \a str.
|
||||||
|
std::ostream& escape_str(std::ostream& os, const std::string& str);
|
||||||
|
/// Escape " and \ characters in \a str.
|
||||||
|
std::string escape_str(const std::string& str);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // SPOT_MISC_ESCAPE_HH
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
// Copyright (C) 2003 Laboratoire d'Informatique de Paris 6 (LIP6),
|
// Copyright (C) 2003, 2004 Laboratoire d'Informatique de Paris 6 (LIP6),
|
||||||
// département Systèmes Répartis Coopératifs (SRC), Université Pierre
|
// département Systèmes Répartis Coopératifs (SRC), Université Pierre
|
||||||
// et Marie Curie.
|
// et Marie Curie.
|
||||||
//
|
//
|
||||||
|
|
@ -160,6 +160,14 @@ namespace spot
|
||||||
return os;
|
return os;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string
|
||||||
|
bdd_format_accset(const bdd_dict* d, bdd b)
|
||||||
|
{
|
||||||
|
std::ostringstream os;
|
||||||
|
bdd_print_accset(os, d, b);
|
||||||
|
return os.str();
|
||||||
|
}
|
||||||
|
|
||||||
std::string
|
std::string
|
||||||
bdd_format_sat(const bdd_dict* d, bdd b)
|
bdd_format_sat(const bdd_dict* d, bdd b)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
// Copyright (C) 2003 Laboratoire d'Informatique de Paris 6 (LIP6),
|
// Copyright (C) 2003, 2004 Laboratoire d'Informatique de Paris 6 (LIP6),
|
||||||
// département Systèmes Répartis Coopératifs (SRC), Université Pierre
|
// département Systèmes Répartis Coopératifs (SRC), Université Pierre
|
||||||
// et Marie Curie.
|
// et Marie Curie.
|
||||||
//
|
//
|
||||||
|
|
@ -67,6 +67,15 @@ namespace spot
|
||||||
std::ostream& bdd_print_accset(std::ostream& os,
|
std::ostream& bdd_print_accset(std::ostream& os,
|
||||||
const bdd_dict* dict, bdd b);
|
const bdd_dict* dict, bdd b);
|
||||||
|
|
||||||
|
/// \brief Format a BDD as a set of acceptance conditions.
|
||||||
|
///
|
||||||
|
/// This is used when saving a TGBA.
|
||||||
|
/// \param os The output stream.
|
||||||
|
/// \param dict The dictionary to use, to lookup variables.
|
||||||
|
/// \param b The BDD to print.
|
||||||
|
/// \return The BDD formated as a string.
|
||||||
|
std::string bdd_format_accset(const bdd_dict* dict, bdd b);
|
||||||
|
|
||||||
/// \brief Print a BDD as a set.
|
/// \brief Print a BDD as a set.
|
||||||
/// \param os The output stream.
|
/// \param os The output stream.
|
||||||
/// \param dict The dictionary to use, to lookup variables.
|
/// \param dict The dictionary to use, to lookup variables.
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
// Copyright (C) 2003 Laboratoire d'Informatique de Paris 6 (LIP6),
|
// Copyright (C) 2003, 2004 Laboratoire d'Informatique de Paris 6 (LIP6),
|
||||||
// département Systèmes Répartis Coopératifs (SRC), Université Pierre
|
// département Systèmes Répartis Coopératifs (SRC), Université Pierre
|
||||||
// et Marie Curie.
|
// et Marie Curie.
|
||||||
//
|
//
|
||||||
|
|
@ -23,6 +23,7 @@
|
||||||
#include "dotty.hh"
|
#include "dotty.hh"
|
||||||
#include "tgba/bddprint.hh"
|
#include "tgba/bddprint.hh"
|
||||||
#include "reachiter.hh"
|
#include "reachiter.hh"
|
||||||
|
#include "misc/escape.hh"
|
||||||
|
|
||||||
namespace spot
|
namespace spot
|
||||||
{
|
{
|
||||||
|
|
@ -52,19 +53,20 @@ namespace spot
|
||||||
void
|
void
|
||||||
process_state(const state* s, int n, tgba_succ_iterator*)
|
process_state(const state* s, int n, tgba_succ_iterator*)
|
||||||
{
|
{
|
||||||
os_ << " " << n << " [label=\""
|
os_ << " " << n << " [label=\"";
|
||||||
<< automata_->format_state(s) << "\"]" << std::endl;
|
escape_str(os_, automata_->format_state(s)) << "\"]" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
process_link(int in, int out, const tgba_succ_iterator* si)
|
process_link(int in, int out, const tgba_succ_iterator* si)
|
||||||
{
|
{
|
||||||
os_ << " " << in << " -> " << out << " [label=\"";
|
os_ << " " << in << " -> " << out << " [label=\"";
|
||||||
bdd_print_formula(os_, automata_->get_dict(),
|
escape_str(os_, bdd_format_formula(automata_->get_dict(),
|
||||||
si->current_condition()) << "\\n";
|
si->current_condition())) << "\\n";
|
||||||
bdd_print_accset(os_, automata_->get_dict(),
|
escape_str(os_,
|
||||||
si->current_acceptance_conditions()) << "\"]"
|
bdd_format_accset(automata_->get_dict(),
|
||||||
<< std::endl;
|
si->current_acceptance_conditions()))
|
||||||
|
<< "\"]" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@
|
||||||
#include "tgba/bddprint.hh"
|
#include "tgba/bddprint.hh"
|
||||||
#include "ltlvisit/tostring.hh"
|
#include "ltlvisit/tostring.hh"
|
||||||
#include "reachiter.hh"
|
#include "reachiter.hh"
|
||||||
|
#include "misc/escape.hh"
|
||||||
|
|
||||||
namespace spot
|
namespace spot
|
||||||
{
|
{
|
||||||
|
|
@ -39,10 +40,34 @@ namespace spot
|
||||||
void
|
void
|
||||||
start()
|
start()
|
||||||
{
|
{
|
||||||
const bdd_dict* d = automata_->get_dict();
|
|
||||||
os_ << "acc =";
|
os_ << "acc =";
|
||||||
|
print_acc(automata_->all_acceptance_conditions()) << ";" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
bdd acc = automata_->all_acceptance_conditions();
|
void
|
||||||
|
process_state(const state* s, int, tgba_succ_iterator* si)
|
||||||
|
{
|
||||||
|
const bdd_dict* d = automata_->get_dict();
|
||||||
|
std::string cur = automata_->format_state(s);
|
||||||
|
for (si->first(); !si->done(); si->next())
|
||||||
|
{
|
||||||
|
state* dest = si->current_state();
|
||||||
|
os_ << "\"" << cur << "\", \""
|
||||||
|
<< automata_->format_state(dest) << "\", \"";
|
||||||
|
escape_str(os_, bdd_format_formula(d, si->current_condition()));
|
||||||
|
os_ << "\",";
|
||||||
|
print_acc(si->current_acceptance_conditions()) << ";" << std::endl;
|
||||||
|
delete dest;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::ostream& os_;
|
||||||
|
|
||||||
|
std::ostream&
|
||||||
|
print_acc(bdd acc)
|
||||||
|
{
|
||||||
|
const bdd_dict* d = automata_->get_dict();
|
||||||
while (acc != bddfalse)
|
while (acc != bddfalse)
|
||||||
{
|
{
|
||||||
bdd cube = bdd_satone(acc);
|
bdd cube = bdd_satone(acc);
|
||||||
|
|
@ -59,50 +84,14 @@ namespace spot
|
||||||
d->acc_formula_map.find(v);
|
d->acc_formula_map.find(v);
|
||||||
assert(vi != d->acc_formula_map.end());
|
assert(vi != d->acc_formula_map.end());
|
||||||
os_ << " \"";
|
os_ << " \"";
|
||||||
ltl::to_string(vi->second, os_) << "\"";
|
escape_str(os_, ltl::to_string(vi->second)) << "\"";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
cube = bdd_low(cube);
|
cube = bdd_low(cube);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
os_ << ";" << std::endl;
|
return os_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
process_state(const state* s, int, tgba_succ_iterator* si)
|
|
||||||
{
|
|
||||||
const bdd_dict* d = automata_->get_dict();
|
|
||||||
std::string cur = automata_->format_state(s);
|
|
||||||
for (si->first(); !si->done(); si->next())
|
|
||||||
{
|
|
||||||
state* dest = si->current_state();
|
|
||||||
os_ << "\"" << cur << "\", \""
|
|
||||||
<< automata_->format_state(dest) << "\", \"";
|
|
||||||
std::string s = bdd_format_formula(d, si->current_condition());
|
|
||||||
// Escape " and \ characters in s.
|
|
||||||
for (std::string::const_iterator i = s.begin();
|
|
||||||
i != s.end(); ++i)
|
|
||||||
switch (*i)
|
|
||||||
{
|
|
||||||
case '\\':
|
|
||||||
os_ << "\\\\";
|
|
||||||
break;
|
|
||||||
case '"':
|
|
||||||
os_ << "\\\"";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
os_ << *i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
os_ << "\",";
|
|
||||||
bdd_print_acc(os_, d, si->current_acceptance_conditions());
|
|
||||||
os_ << ";" << std::endl;
|
|
||||||
delete dest;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::ostream& os_;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue