* 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>
|
||||
|
||||
* 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
|
||||
(to_string_visitor::visit(const atomic_prop*)): Quote propositions
|
||||
that start with F, G, or X.
|
||||
|
|
|
|||
|
|
@ -19,7 +19,6 @@
|
|||
// Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
// 02111-1307, USA.
|
||||
|
||||
#include <sstream>
|
||||
#include <cstring>
|
||||
#include <map>
|
||||
#include <cassert>
|
||||
|
|
@ -422,7 +421,6 @@ namespace spot
|
|||
{
|
||||
const state_gspn_eesrg* s = dynamic_cast<const state_gspn_eesrg*>(state);
|
||||
assert(s);
|
||||
std::ostringstream os;
|
||||
char* str;
|
||||
State gs = s->left();
|
||||
if (gs)
|
||||
|
|
@ -430,30 +428,19 @@ namespace spot
|
|||
int err = print_state(gs, &str);
|
||||
if (err)
|
||||
throw gspn_exeption("print_state()", err);
|
||||
// Strip trailing \n...
|
||||
unsigned len = strlen(str);
|
||||
while (str[--len] == '\n')
|
||||
str[len] = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
str = strdup("-1");
|
||||
}
|
||||
|
||||
// Rewrite all new lines as \\\n.
|
||||
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;
|
||||
}
|
||||
std::string res(str);
|
||||
free(str);
|
||||
return os.str() + " * " + data_->operand->format_state(s->right());
|
||||
return res + " * " + data_->operand->format_state(s->right());
|
||||
}
|
||||
|
||||
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
|
||||
// et Marie Curie.
|
||||
//
|
||||
|
|
@ -19,7 +19,6 @@
|
|||
// Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
// 02111-1307, USA.
|
||||
|
||||
#include <sstream>
|
||||
#include <map>
|
||||
#include <cassert>
|
||||
#include "gspn.hh"
|
||||
|
|
@ -366,30 +365,17 @@ namespace spot
|
|||
{
|
||||
const state_gspn* s = dynamic_cast<const state_gspn*>(state);
|
||||
assert(s);
|
||||
std::ostringstream os;
|
||||
char* str;
|
||||
int err = print_state(s->get_state(), &str);
|
||||
if (err)
|
||||
throw gspn_exeption("print_state()", err);
|
||||
|
||||
// Rewrite all new lines as \\\n.
|
||||
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;
|
||||
}
|
||||
// Strip trailing \n...
|
||||
unsigned len = strlen(str);
|
||||
while (str[--len] == '\n')
|
||||
str[len] = 0;
|
||||
std::string res(str);
|
||||
free(str);
|
||||
return os.str();
|
||||
return res;
|
||||
}
|
||||
|
||||
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
|
||||
## et Marie Curie.
|
||||
##
|
||||
|
|
@ -27,6 +27,7 @@ miscdir = $(pkgincludedir)/misc
|
|||
misc_HEADERS = \
|
||||
bddalloc.hh \
|
||||
bddlt.hh \
|
||||
escape.hh \
|
||||
hash.hh \
|
||||
minato.hh \
|
||||
version.hh
|
||||
|
|
@ -34,5 +35,6 @@ misc_HEADERS = \
|
|||
noinst_LTLIBRARIES = libmisc.la
|
||||
libmisc_la_SOURCES = \
|
||||
bddalloc.cc \
|
||||
escape.cc \
|
||||
minato.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
|
||||
// et Marie Curie.
|
||||
//
|
||||
|
|
@ -160,6 +160,14 @@ namespace spot
|
|||
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
|
||||
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
|
||||
// et Marie Curie.
|
||||
//
|
||||
|
|
@ -67,6 +67,15 @@ namespace spot
|
|||
std::ostream& bdd_print_accset(std::ostream& os,
|
||||
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.
|
||||
/// \param os The output stream.
|
||||
/// \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
|
||||
// et Marie Curie.
|
||||
//
|
||||
|
|
@ -23,6 +23,7 @@
|
|||
#include "dotty.hh"
|
||||
#include "tgba/bddprint.hh"
|
||||
#include "reachiter.hh"
|
||||
#include "misc/escape.hh"
|
||||
|
||||
namespace spot
|
||||
{
|
||||
|
|
@ -52,19 +53,20 @@ namespace spot
|
|||
void
|
||||
process_state(const state* s, int n, tgba_succ_iterator*)
|
||||
{
|
||||
os_ << " " << n << " [label=\""
|
||||
<< automata_->format_state(s) << "\"]" << std::endl;
|
||||
os_ << " " << n << " [label=\"";
|
||||
escape_str(os_, automata_->format_state(s)) << "\"]" << std::endl;
|
||||
}
|
||||
|
||||
void
|
||||
process_link(int in, int out, const tgba_succ_iterator* si)
|
||||
{
|
||||
os_ << " " << in << " -> " << out << " [label=\"";
|
||||
bdd_print_formula(os_, automata_->get_dict(),
|
||||
si->current_condition()) << "\\n";
|
||||
bdd_print_accset(os_, automata_->get_dict(),
|
||||
si->current_acceptance_conditions()) << "\"]"
|
||||
<< std::endl;
|
||||
escape_str(os_, bdd_format_formula(automata_->get_dict(),
|
||||
si->current_condition())) << "\\n";
|
||||
escape_str(os_,
|
||||
bdd_format_accset(automata_->get_dict(),
|
||||
si->current_acceptance_conditions()))
|
||||
<< "\"]" << std::endl;
|
||||
}
|
||||
|
||||
private:
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@
|
|||
#include "tgba/bddprint.hh"
|
||||
#include "ltlvisit/tostring.hh"
|
||||
#include "reachiter.hh"
|
||||
#include "misc/escape.hh"
|
||||
|
||||
namespace spot
|
||||
{
|
||||
|
|
@ -39,10 +40,34 @@ namespace spot
|
|||
void
|
||||
start()
|
||||
{
|
||||
const bdd_dict* d = automata_->get_dict();
|
||||
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)
|
||||
{
|
||||
bdd cube = bdd_satone(acc);
|
||||
|
|
@ -59,50 +84,14 @@ namespace spot
|
|||
d->acc_formula_map.find(v);
|
||||
assert(vi != d->acc_formula_map.end());
|
||||
os_ << " \"";
|
||||
ltl::to_string(vi->second, os_) << "\"";
|
||||
escape_str(os_, ltl::to_string(vi->second)) << "\"";
|
||||
break;
|
||||
}
|
||||
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