for ELTL. This is a new version of the work started in 2008 with LTL and ELTL formulae now sharing the same class hierarchy. * configure.ac: Adjust for src/eltlparse/ and src/eltltest/ directories, and call AX_BOOST_BASE. * m4/boost.m4: New file defining AX_BOOST_BASE([MINIMUM-VERSION]). * src/Makefile.am: Add eltlparse and eltltest. * src/eltlparse/: New directory. Contains the ELTL parser. * src/eltltest/: New directory. Contains tests related to ELTL (parser and AST). * src/ltlast/Makefile.am: Adjust for ELTL AST files. * src/ltlast/automatop.cc, src/ltlast/automatop.hh: New files. Represent automaton operators nodes used in ELTL ASTs. * src/ltlast/nfa.cc, src/ltlast/nfa.hh: New files. Represent simple NFAs used internally by automatop nodes. * src/ltlast/allnode.hh, src/ltlast/predecl.hh, src/ltlast/visitor.hh: Adjust for automatop. * src/ltlvisit/basicreduce.cc, src/ltlvisit/clone.cc, src/ltlvisit/clone.hh, src/ltlvisit/contain.cc, src/ltlvisit/dotty.cc, src/ltlvisit/nenoform.cc, src/ltlvisit/postfix.cc, src/ltlvisit/postfix.hh, src/ltlvisit/reduce.cc, src/ltlvisit/syntimpl.cc, src/ltlvisit/tostring.cc: Because LTL and ELTL formulae share the same class hierarchy, LTL visitors need to handle automatop nodes to compile. When it's meaningful the visitor applies on automatop nodes or simply assert(0) otherwise. * src/tgba/tgbabddconcretefactory.cc (create_anonymous_state), src/tgba/tgbabddconcretefactory.hh (create_anonymous_state): New function used by the LaCIM translation algorithm for ELTL. * src/tgbaalgos/Makefile.am: Adjust for eltl2tgba_lacim* files. * src/tgbaalgos/eltl2tgba_lacim.cc, src/tgbaalgos/eltl2tgba_lacim.hh: New files. Implementation of the LaCIM translation algorithm for ELTL. * src/tgbaalgos/ltl2tgba_fm.cc, src/tgbaalgos/ltl2tgba_lacim.cc: Handle automatop nodes in the translation by an assert(0). * src/tgbatest/Makefile.am: Adjust for eltl2tgba.* files. * src/src/tgbatest/eltl2tgba.cc, src/tgbatest/eltl2tgba.test: New files
148 lines
3.8 KiB
C++
148 lines
3.8 KiB
C++
// Copyright (C) 2008 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.
|
|
|
|
/// \file ltlast/nfa.hh
|
|
/// \brief NFA interface used by automatop
|
|
#ifndef SPOT_LTLAST_NFA_HH
|
|
# define SPOT_LTLAST_NFA_HH
|
|
|
|
# include "misc/hash.hh"
|
|
# include <boost/shared_ptr.hpp>
|
|
# include <list>
|
|
# include <set>
|
|
# include <map>
|
|
|
|
namespace spot
|
|
{
|
|
namespace ltl
|
|
{
|
|
/// Forward declaration. See below.
|
|
class succ_iterator;
|
|
|
|
/// \brief Nondeterministic Finite Automata used by automata operators.
|
|
///
|
|
/// States & labels are represented by integers.
|
|
/// Currently, only one initial state is possible.
|
|
class nfa
|
|
{
|
|
public:
|
|
struct transition;
|
|
typedef std::list<transition*> state;
|
|
/// Iterator over the successors of a state.
|
|
typedef succ_iterator iterator;
|
|
typedef boost::shared_ptr<nfa> ptr;
|
|
|
|
/// Explicit transitions.
|
|
struct transition
|
|
{
|
|
int label;
|
|
const state* dst;
|
|
};
|
|
|
|
nfa();
|
|
~nfa();
|
|
|
|
void add_transition(int src, int dst, int label);
|
|
void set_init_state(int name);
|
|
void set_final(int name);
|
|
|
|
/// \brief Get the initial state of the NFA.
|
|
const state* get_init_state();
|
|
|
|
/// \brief Tell whether the given state is final or not.
|
|
bool is_final(const state* s);
|
|
|
|
/// \brief Tell whether the NFA is `loop', i.e. without any final state.
|
|
bool is_loop();
|
|
|
|
/// \brief Get the `arity' i.e. max t.cost, for each transition t.
|
|
int arity();
|
|
|
|
/// \brief Return an iterator on the first succesor (if any) of \a state.
|
|
///
|
|
/// The usual way to do this with a \c for loop.
|
|
/// \code
|
|
/// for (nfa::iterator i = a.begin(s); i != a.end(s); ++i);
|
|
/// \endcode
|
|
iterator begin(const state* s) const;
|
|
|
|
/// \brief Return an iterator just past the last succesor of \a state.
|
|
iterator end(const state* s) const;
|
|
|
|
int format_state(const state* s) const;
|
|
|
|
const std::string& get_name() const;
|
|
void set_name(const std::string&);
|
|
|
|
private:
|
|
state* add_state(int name);
|
|
|
|
typedef Sgi::hash_map<int, state*, Sgi::hash<int> > is_map;
|
|
typedef Sgi::hash_map<const state*, int, ptr_hash<state> > si_map;
|
|
|
|
is_map is_;
|
|
si_map si_;
|
|
|
|
int arity_;
|
|
std::string name_; // FIXME.
|
|
|
|
state* init_;
|
|
std::set<int> finals_;
|
|
|
|
/// Explicitly disllow use of implicity generated member functions
|
|
/// we don't want.
|
|
nfa(const nfa& other);
|
|
nfa& operator=(const nfa& other);
|
|
};
|
|
|
|
class succ_iterator
|
|
{
|
|
public:
|
|
succ_iterator(const nfa::state::const_iterator s)
|
|
: i_(s)
|
|
{
|
|
}
|
|
|
|
void
|
|
operator++()
|
|
{
|
|
++i_;
|
|
}
|
|
|
|
bool
|
|
operator!=(const succ_iterator& rhs) const
|
|
{
|
|
return i_ != rhs.i_;
|
|
}
|
|
|
|
const nfa::transition* operator*() const
|
|
{
|
|
return *i_;
|
|
}
|
|
|
|
private:
|
|
nfa::state::const_iterator i_;
|
|
};
|
|
|
|
}
|
|
}
|
|
|
|
#endif // SPOT_LTLAST_NFA_HH_
|