00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef VCSN_TOOLS_IO_HH
00018 # define VCSN_TOOLS_IO_HH
00019
00020 # include <vaucanson/automata/concept/handlers.hh>
00021 # include <vaucanson/automata/concept/automata_base.hh>
00022 # include <vaucanson/automata/concept/transducer_base.hh>
00023 # include <iostream>
00024 # include <string>
00025 # include <map>
00026
00027 namespace vcsn
00028 {
00029
00030 namespace tools
00031 {
00032
00033
00034
00035
00036
00037 template <typename Auto, typename TransitionConverter, typename Format>
00038 struct automaton_saver_
00039 {
00040 typedef Auto automaton_t;
00041 typedef TransitionConverter transition_converter_t;
00042 typedef Format format_t;
00043
00044 automaton_saver_(const Auto&,
00045 const TransitionConverter&,
00046 const Format&);
00047
00048 automaton_t& automaton();
00049 const automaton_t& automaton() const;
00050
00051 protected:
00052 const automaton_t& a_;
00053 transition_converter_t conv_;
00054 format_t format_;
00055
00056 template<typename A, typename E, typename F>
00057 friend std::ostream&
00058 operator<<(std::ostream&, const automaton_saver_<A, E, F>&);
00059 };
00060
00061
00062 template <typename Auto, typename TransitionConverter, typename Format>
00063 std::ostream&
00064 operator<<(std::ostream&,
00065 const automaton_saver_<Auto, TransitionConverter, Format>&);
00066
00067 struct string_out
00068 {
00069 std::string check_empty_word(const std::string&) const;
00070
00071 template<typename S, typename T>
00072 std::string operator()(const AutomataBase<S>&, const T&) const;
00073
00074 template<typename S, typename T>
00075 std::string operator()(const TransducerBase<S>&, const T&) const;
00076
00077 };
00078
00079 }
00080
00081 template <typename Auto, typename TransitionConverter, typename Format>
00082 tools::automaton_saver_<Auto, TransitionConverter, Format>
00083 automaton_saver(const Auto&,
00084 const TransitionConverter& e = TransitionConverter(),
00085 const Format& f = Format());
00086
00087
00088 namespace tools
00089 {
00090
00091
00092
00093
00094
00095 template <typename RE, typename TransitionConverter, typename Format>
00096 struct regexp_saver_
00097 {
00098 typedef RE rat_exp_t;
00099 typedef TransitionConverter transition_converter_t;
00100 typedef Format format_t;
00101
00102 regexp_saver_(const RE&,
00103 const TransitionConverter&,
00104 const Format&);
00105
00106 rat_exp_t& rat_exp();
00107 const rat_exp_t& rat_exp() const;
00108
00109 protected:
00110 const rat_exp_t& r_;
00111 transition_converter_t conv_;
00112 format_t format_;
00113
00114 template<typename A, typename E, typename F>
00115 friend std::ostream&
00116 operator<<(std::ostream&, const regexp_saver_<A, E, F>&);
00117 };
00118
00119
00120 template <typename RE, typename TransitionConverter, typename Format>
00121 std::ostream&
00122 operator<<(std::ostream&,
00123 const regexp_saver_<RE, TransitionConverter, Format>&);
00124
00125 }
00126
00127 template <typename RE, typename TransitionConverter, typename Format>
00128 tools::regexp_saver_<RE, TransitionConverter, Format>
00129 regexp_saver(const RE&,
00130 const TransitionConverter& e = TransitionConverter(),
00131 const Format& f = Format());
00132
00133
00134 namespace tools
00135 {
00136
00137
00138
00139
00140 template <typename Auto, typename TransitionConverter, typename Format>
00141 struct automaton_loader_
00142 {
00143 typedef Auto automaton_t;
00144 typedef typename Auto::hstate_t hstate_t;
00145 typedef typename Auto::htransition_t htransition_t;
00146 typedef TransitionConverter transition_converter_t;
00147 typedef Format format_t;
00148
00149 automaton_loader_(automaton_t& a,
00150 const transition_converter_t& conv,
00151 const format_t& format,
00152 bool merge_states);
00153
00154 automaton_t& automaton();
00155 const automaton_t& automaton() const;
00156
00157 hstate_t add_state(unsigned);
00158 void set_initial(unsigned, const std::string&);
00159 void set_final(unsigned, const std::string&);
00160 void add_transition(unsigned, unsigned, const std::string&);
00161 void add_spontaneous(unsigned, unsigned);
00162
00163 protected:
00164 automaton_t& a_;
00165 transition_converter_t conv_;
00166 format_t format_;
00167 unsigned scount_;
00168 std::map<unsigned, hstate_t> smap_;
00169 bool merge_states_;
00170
00171 template<typename A, typename E, typename F>
00172 friend std::istream&
00173 operator>>(std::istream&, automaton_loader_<A, E, F>);
00174 };
00175
00176 template <typename Auto, typename TransitionConverter, typename Format>
00177 std::istream&
00178 operator>>(std::istream&, automaton_loader_<Auto, TransitionConverter, Format>);
00179
00180
00181 }
00182
00183
00184 template <typename Auto, typename TransitionConverter, typename Format>
00185 tools::automaton_loader_<Auto, TransitionConverter, Format>
00186 automaton_loader(Auto& a,
00187 const TransitionConverter& e = TransitionConverter(),
00188 const Format& f = Format(),
00189 bool merge_states = false);
00190
00191 namespace tools
00192 {
00193 template <typename RE, typename TransitionConverter, typename Format>
00194 struct regexp_loader_
00195 {
00196 typedef RE rat_exp_t;
00197 typedef TransitionConverter transition_converter_t;
00198 typedef Format format_t;
00199
00200 regexp_loader_(rat_exp_t& r,
00201 const transition_converter_t& conv,
00202 const format_t& format);
00203
00204 rat_exp_t& rat_exp();
00205 const rat_exp_t& rat_exp() const;
00206
00207 protected:
00208 rat_exp_t& r_;
00209 transition_converter_t conv_;
00210 format_t format_;
00211
00212 template <typename R, typename T, typename F>
00213 friend std::istream&
00214 operator>>(std::istream&, regexp_loader_<R, T, F>);
00215 };
00216
00217 template <typename RE, typename TransitionConverter, typename Format>
00218 std::istream&
00219 operator>>(std::istream&, regexp_loader_<RE, TransitionConverter, Format>);
00220 }
00221
00222 template <typename RE, typename TransitionConverter, typename Format>
00223 tools::regexp_loader_<RE, TransitionConverter, Format>
00224 regexp_loader(RE& r,
00225 const TransitionConverter& e = TransitionConverter(),
00226 const Format& f = Format());
00227 }
00228
00229
00230 # if !defined VCSN_USE_INTERFACE_ONLY || defined VCSN_USE_LIB
00231 # include <vaucanson/tools/io.hxx>
00232 #endif // VCSN_USE_INTERFACE_ONLY
00233
00234
00235 #endif // ! VCSN_TOOLS_IO_HH