00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef VCSN_TOOLS_DOT_FORMAT_HXX
00018 # define VCSN_TOOLS_DOT_FORMAT_HXX
00019
00020 # include <sstream>
00021 # include <map>
00022
00023 # include <vaucanson/tools/dot_format.hh>
00024 # include <vaucanson/automata/concept/handlers.hh>
00025 # include <vaucanson/misc/usual_macros.hh>
00026
00027 namespace vcsn
00028 {
00029 namespace tools
00030 {
00031 void
00032 name_escaper(std::ostream& out, const std::string& name)
00033 {
00034 for (std::string::const_iterator i = name.begin(); i != name.end(); ++i)
00035 {
00036 if (*i == '"')
00037 out << "\\";
00038 out << *i;
00039 }
00040 }
00041
00042 inline dot::dot(const std::string& name)
00043 {
00044 std::ostringstream os;
00045 name_escaper(os, name);
00046 name_ = std::string("\"") + os.str();
00047 }
00048
00049 template<typename Saver, typename Conv>
00050 void dot::operator()(std::ostream& out, const Saver& s,
00051 const Conv& conv) const
00052 {
00053 typedef typename Saver::automaton_t auto_t;
00054 typedef typename auto_t::hstate_t hstate_t;
00055
00056 const auto_t& a = s.automaton();
00057 unsigned count = 0;
00058 std::map<hstate_t, unsigned> state_map;
00059
00060 out << "digraph vcsn {" << std::endl
00061 << "label=\"" << name_.c_str() + 1 << ' ' << a << "\";" << std::endl
00062 << "node [shape=circle];" << std::endl;
00063
00064 for (typename auto_t::state_iterator i = a.states().begin();
00065 i != a.states().end();
00066 ++i)
00067 {
00068 unsigned c = state_map[*i] = count++;
00069 if (a.is_initial(*i))
00070 {
00071 out << name_ << count
00072 << "\" [style=invis,label=\"\",width=.01,height=.01];"
00073 << std::endl
00074 << name_ << count << "\" -> " << name_ << c
00075 << "\" [label=\"" << conv(a.structure(), a.get_initial(*i))
00076 << "\"];" << std::endl;
00077 ++count;
00078 }
00079 if (a.is_final(*i))
00080 {
00081 out << name_ << count
00082 << "\" [style=invis,label=\"\",width=.01,height=.01];"
00083 << std::endl
00084 << name_ << c << "\" -> " << name_ << count
00085 << "\" [label=\""<< conv(a.structure(), a.get_final(*i))
00086 <<"\"];" << std::endl;
00087 ++count;
00088 }
00089 out << name_ << c << "\" [label=\"" << *i << "\"];" << std::endl;
00090 }
00091 for (typename auto_t::transition_iterator i = a.transitions().begin();
00092 i != a.transitions().end();
00093 ++i)
00094 {
00095 out << name_ << state_map[a.src_of(*i)]
00096 << "\" -> "
00097 << name_ << state_map[a.dst_of(*i)];
00098 out << "\" [label=\"" << conv(a.structure(), a.series_of(*i))
00099 << "\"];" << std::endl;
00100 }
00101 out << "}" << std::endl;
00102 }
00103
00104 inline transducer_dot::transducer_dot(const std::string& name)
00105 {
00106 std::ostringstream os;
00107 name_escaper(os, name);
00108 name_ = std::string("\"") + os.str();
00109 }
00110
00111 template<typename Saver, typename Conv>
00112 void transducer_dot::operator()(std::ostream& out, const Saver& s,
00113 const Conv& conv) const
00114 {
00115 typedef typename Saver::automaton_t auto_t;
00116 AUTOMATON_TYPES(auto_t);
00117 const auto_t& a = s.automaton();
00118 unsigned count = 0;
00119 std::map<hstate_t, unsigned> state_map;
00120
00121 out << "digraph vcsn {" << std::endl
00122 << "label=\"" << name_.c_str() + 1 << ' ' << a << "\";" << std::endl
00123 << "node [shape=circle];" << std::endl;
00124
00125 for (typename auto_t::state_iterator i = a.states().begin();
00126 i != a.states().end();
00127 ++i)
00128 {
00129 unsigned c = state_map[*i] = count++;
00130 if (a.is_initial(*i))
00131 {
00132 out << name_ << count
00133 << "\" [style=invis,label=\"\",width=.01,height=.01];"
00134 << std::endl
00135 << name_ << count << "\" -> " << name_ << c << '"';
00136 std::ostringstream o;
00137 series_set_elt_t ss = a.get_initial(*i);
00138 if (ss.supp().begin() == ss.supp().end())
00139 o << ss;
00140 for_all_const_(series_set_elt_t::support_t, s, ss.supp())
00141 {
00142 monoid_elt_t x(a.structure().series().monoid(), *s);
00143 o << conv(a.structure(), x) << "|" << ss.get(x) << " ";
00144 }
00145 out << "[label=\"" << o.str() << "\"];"
00146 << std::endl;
00147 ++count;
00148 }
00149 if (a.is_final(*i))
00150 {
00151 out << name_ << count
00152 << "\" [style=invis,label=\"\",width=.01,height=.01];"
00153 << std::endl
00154 << name_ << c << "\" -> " << name_ << count << '"';
00155 std::ostringstream o;
00156 series_set_elt_t ss = a.get_final(*i);
00157 if (ss.supp().begin() == ss.supp().end())
00158 o << ss;
00159 for_all_const_(series_set_elt_t::support_t, s, ss.supp())
00160 {
00161 monoid_elt_t x(a.structure().series().monoid(), *s);
00162 o << conv(a.structure(), x) << "|" << ss.get(x) << " ";
00163 }
00164 out << "[label=\"" << o.str() << "\"];"
00165 << std::endl;
00166 ++count;
00167 }
00168 out << name_ << c << "\" [label=\"" << *i << "\"];" << std::endl;
00169 }
00170 for (typename auto_t::transition_iterator i = a.transitions().begin();
00171 i != a.transitions().end();
00172 ++i)
00173 {
00174 out << name_ << state_map[a.src_of(*i)]
00175 << "\" -> "
00176 << name_ << state_map[a.dst_of(*i)] << '"';
00177 std::ostringstream o;
00178 series_set_elt_t ss = a.series_of(*i);
00179 if (ss.supp().begin() == ss.supp().end())
00180 o << ss;
00181 for_all_const_(series_set_elt_t::support_t, s, ss.supp())
00182 {
00183 monoid_elt_t x(a.structure().series().monoid(), *s);
00184 o << conv(a.structure(), x) << "|" << ss.get(x) << " ";
00185 }
00186 out << "[label=\"" << o.str() << "\"];"
00187 << std::endl;
00188 }
00189 out << "}" << std::endl;
00190 }
00191
00192 }
00193
00194 }
00195
00196 #endif // ! VCSN_TOOLS_DOT_FORMAT_HXX