Vaucanson 1.4
|
00001 // builders.hh: this file is part of the Vaucanson project. 00002 // 00003 // Vaucanson, a generic library for finite state machines. 00004 // 00005 // Copyright (C) 2007, 2008, 2009 The Vaucanson Group. 00006 // 00007 // This program is free software; you can redistribute it and/or 00008 // modify it under the terms of the GNU General Public License 00009 // as published by the Free Software Foundation; either version 2 00010 // of the License, or (at your option) any later version. 00011 // 00012 // The complete GNU General Public Licence Notice can be found as the 00013 // `COPYING' file in the root directory. 00014 // 00015 // The Vaucanson Group consists of people listed in the `AUTHORS' file. 00016 // 00017 00018 #ifndef VCSN_XML_BUILDERS_HH 00019 # define VCSN_XML_BUILDERS_HH 00020 00031 # include <string> 00032 00033 // These includes are here to satisfy sanity checks, but we need a way 00034 // to force the inclusion of the XML related headers after the automaton 00035 // type is fully constructed (no undefined_type), and improve sanity 00036 // checks. 00037 # include <vaucanson/algebra/implementation/monoid/free_monoid.hh> 00038 # include <vaucanson/algebra/implementation/series/series.hh> 00039 00040 # include <xercesc/sax2/Attributes.hpp> 00041 # include <xercesc/util/XMLString.hpp> 00042 # include <xercesc/dom/DOM.hpp> 00043 00044 # include <vaucanson/xml/handlers_base.hh> 00045 00046 namespace vcsn 00047 { 00048 namespace xml 00049 { 00053 template <typename T> 00054 class monGenAction 00055 { 00056 public: 00057 monGenAction(const T&); 00058 }; 00059 00060 // An action on a free monoid (insert monGen inside its alphabet) 00061 template <typename T> 00062 class monGenAction<vcsn::algebra::FreeMonoid<T> > 00063 { 00064 public: 00065 typedef vcsn::algebra::FreeMonoid<T> monoid_t; 00066 typedef typename monoid_t::alphabet_t alphabet_t; 00067 00068 monGenAction(monoid_t&); 00069 void operator () (const std::string&); 00070 private: 00071 alphabet_t& alphabet_; 00072 }; 00073 00074 // An action on a series element (multiply it by monGen) 00075 template <typename T, typename U, typename V> 00076 class monGenAction<vcsn::Element<vcsn::algebra::Series<T, U>, V> > 00077 { 00078 public: 00079 typedef vcsn::Element<vcsn::algebra::Series<T, U>, V> series_t; 00080 typedef typename series_t::set_t::monoid_t monoid_t; 00081 typedef typename monoid_t::alphabet_t alphabet_t; 00082 typedef typename alphabet_t::letter_t letter_t; 00083 00084 monGenAction(series_t&); 00085 void operator () (const std::string&); 00086 private: 00087 series_t& s_; 00088 }; 00089 00096 template <typename T, typename U> 00097 class monGenHandler : public Handler 00098 { 00099 public: 00100 monGenHandler (xercesc::SAX2XMLReader* parser, 00101 Handler& root, 00102 const monGenAction<U>& action, 00103 const XMLCh* value = 0); 00104 00105 void 00106 start (const XMLCh* const uri, 00107 const XMLCh* const localname, 00108 const XMLCh* const qname, 00109 const xercesc::Attributes& attrs); 00110 void 00111 end (const XMLCh* const uri, 00112 const XMLCh* const localname, 00113 const XMLCh* const qname); 00114 private: 00115 const XMLCh* value_; 00116 00117 // What to do with value_. 00118 monGenAction<U> action_; 00119 }; 00120 00127 template <typename T, typename U> 00128 class monGenTupleHandler : public Handler 00129 { 00130 public: 00131 monGenTupleHandler (xercesc::SAX2XMLReader* parser, 00132 Handler& root, 00133 const monGenAction<U>& action); 00134 00135 void 00136 start (const XMLCh* const uri, 00137 const XMLCh* const localname, 00138 const XMLCh* const qname, 00139 const xercesc::Attributes& attrs); 00140 void 00141 end (const XMLCh* const uri, 00142 const XMLCh* const localname, 00143 const XMLCh* const qname); 00144 private: 00145 std::string value_; 00146 bool wait_begin_; 00147 int count_; 00148 00149 // What to do with value_. 00150 monGenAction<U> action_; 00151 }; 00152 00156 template <typename T> 00157 class FreeMonoidHandler : public Handler 00158 { 00159 public: 00160 FreeMonoidHandler (xercesc::SAX2XMLReader* parser, 00161 Handler& root, 00162 T& monoid); 00163 00164 void 00165 start (const XMLCh* const uri, 00166 const XMLCh* const localname, 00167 const XMLCh* const qname, 00168 const xercesc::Attributes& attrs); 00169 void 00170 end (const XMLCh* const uri, 00171 const XMLCh* const localname, 00172 const XMLCh* const qname); 00173 private: 00174 T& monoid_; 00175 bool user_rep_; 00176 00177 Handler* mongenh_; 00178 UnsupHandler unsuph_; 00179 }; 00180 00184 template <typename T> 00185 class SeriesRepresentationHandler : public Handler 00186 { 00187 public: 00188 SeriesRepresentationHandler(xercesc::SAX2XMLReader* parser, 00189 Handler& root, 00190 T& srep); 00191 00192 void start(const XMLCh* const uri, 00193 const XMLCh* const localname, 00194 const XMLCh* const qname, 00195 const xercesc::Attributes& attrs); 00196 00197 void end(const XMLCh* const uri, 00198 const XMLCh* const localname, 00199 const XMLCh* const qname); 00200 00201 private: 00202 T& rep_; 00203 00204 UnsupHandler unsuph_; 00205 }; 00206 00207 namespace builders 00208 { 00209 template <typename T> 00210 typename T::monoid_t* 00211 create_monoid (T&, 00212 const XMLCh* const localname, 00213 const xercesc::Attributes& attrs, 00214 XMLEq&); 00215 00216 template <typename T> 00217 Handler* 00218 create_monoidh (T& monoid, 00219 const xercesc::Attributes& attrs, 00220 xercesc::SAX2XMLReader* parser, 00221 Handler& root); 00222 00223 template <typename T> 00224 typename T::series_set_t::series_rep_t* 00225 create_series_representation(T&, 00226 const XMLCh* const localname, 00227 const xercesc::Attributes& attrs, 00228 XMLEq&); 00229 00230 template <typename T> 00231 Handler* 00232 create_series_representationh(T& srep, 00233 const xercesc::Attributes& attrs, 00234 xercesc::SAX2XMLReader* parser, 00235 Handler& root, 00236 XMLEq&); 00237 00238 } // ! builders 00239 00243 template <typename T> 00244 class NumSemiringHandler : public Handler 00245 { 00246 public: 00247 NumSemiringHandler (xercesc::SAX2XMLReader* parser, 00248 Handler& root, 00249 T& semiring); 00250 00251 void 00252 start (const XMLCh* const uri, 00253 const XMLCh* const localname, 00254 const XMLCh* const qname, 00255 const xercesc::Attributes& attrs); 00256 void 00257 end (const XMLCh* const uri, 00258 const XMLCh* const localname, 00259 const XMLCh* const qname); 00260 private: 00261 T& semiring_; 00262 00263 UnsupHandler unsuph_; 00264 }; 00265 00266 namespace builders 00267 { 00268 template <typename T> 00269 typename T::semiring_t* 00270 create_semiring (T&, 00271 const XMLCh* const localname, 00272 const xercesc::Attributes& attrs); 00273 00274 template <typename T> 00275 Handler* 00276 create_semiringh (T& semiring, 00277 const xercesc::Attributes& attrs, 00278 xercesc::SAX2XMLReader* parser, 00279 Handler& root); 00280 00281 } // !builders 00282 00286 template <typename T> 00287 class RegexpHandler; 00288 00289 namespace builders 00290 { 00291 00292 template <typename S, typename T> 00293 RegexpHandler<S>* 00294 create_monElmth(xercesc::SAX2XMLReader* parser, 00295 RegexpHandler<T>& root, 00296 S param); 00297 00298 template <typename T> 00299 RegexpHandler<T>* 00300 create_weight(xercesc::SAX2XMLReader* parser, 00301 RegexpHandler<T>& root, 00302 T param, 00303 const xercesc::Attributes& attrs); 00304 } // !builders 00305 00309 namespace builders 00310 { 00311 template <typename T> 00312 void 00313 check_monoid_consistency (T& param, 00314 const XMLCh* const localname, 00315 const xercesc::Attributes& attrs, 00316 XMLEq&); 00317 00318 template <typename T> 00319 void 00320 check_semiring_consistency (T& param, 00321 const XMLCh* const localname, 00322 const xercesc::Attributes& attrs); 00323 } // !builders 00324 00328 namespace builders 00329 { 00330 template <typename T> 00331 void 00332 create_semiring_node(const T& semiring, 00333 xercesc::DOMDocument* doc, 00334 xercesc::DOMElement* root); 00335 00336 template <typename T> 00337 void 00338 create_monoid_node(const T& monoid, 00339 xercesc::DOMDocument* doc, 00340 xercesc::DOMElement* root); 00341 00342 template <typename T> 00343 void 00344 create_regexp_node(const T&, 00345 xercesc::DOMDocument* doc, 00346 xercesc::DOMElement* root, 00347 const char* root_name = "label"); 00348 00349 template <typename T> 00350 void 00351 create_monElmt_node(const T&, 00352 xercesc::DOMDocument* doc, 00353 xercesc::DOMElement* root); 00354 00355 template <typename T> 00356 void 00357 create_type_writingData_node(const T&, 00358 xercesc::DOMDocument* doc, 00359 xercesc::DOMElement* root); 00360 00361 // Functor to allow partial specialization. 00362 template <typename T> 00363 struct 00364 create_monGen_node; 00365 00366 } // ! builders 00367 00368 } // ! xml 00369 00370 } // ! vcsn 00371 00372 # if !defined VCSN_USE_INTERFACE_ONLY || defined VCSN_USE_LIB 00373 # include <vaucanson/xml/builders.hxx> 00374 # endif // VCSN_USE_INTERFACE_ONLY || !VCSN_USE_LIB 00375 00376 #endif // !VCSN_XML_BUILDERS_HH