00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef VCSN_XML_HANDLERS_HH
00019 # define VCSN_XML_HANDLERS_HH
00020
00031 # include <map>
00032 # include <string>
00033
00034 # include <xercesc/sax2/SAX2XMLReader.hpp>
00035 # include <xercesc/sax2/XMLReaderFactory.hpp>
00036 # include <xercesc/sax2/DefaultHandler.hpp>
00037 # include <xercesc/sax2/Attributes.hpp>
00038
00039 # include <xercesc/sax/SAXException.hpp>
00040 # include <xercesc/util/XMLString.hpp>
00041
00042 # include <vaucanson/xml/strings.hh>
00043 # include <vaucanson/xml/xmleq.hh>
00044
00045 # include <vaucanson/design_pattern/element.hh>
00046 # include <vaucanson/automata/concept/automata.hh>
00047 # include <vaucanson/automata/concept/transducer.hh>
00048 # include <vaucanson/algebra/implementation/series/series.hh>
00049 # include <vaucanson/algebra/concept/freemonoid_product.hh>
00050
00051
00052 namespace vcsn
00053 {
00054 namespace xml
00055 {
00056
00057
00058
00059 class Handler : public xercesc::DefaultHandler
00060 {
00061 public:
00062 Handler (xercesc::SAX2XMLReader* parser,
00063 XMLEq& eq,
00064 xercesc::DefaultHandler& root);
00065
00066 void
00067 startElement (const XMLCh* const uri,
00068 const XMLCh* const localname,
00069 const XMLCh* const qname,
00070 const xercesc::Attributes& attrs) = 0;
00071 void
00072 endElement (const XMLCh* const uri,
00073 const XMLCh* const localname,
00074 const XMLCh* const qname) = 0;
00075 protected:
00076
00077 xercesc::SAX2XMLReader* parser_;
00078 xercesc::DefaultHandler& root_;
00079
00080 XMLEq& eq_;
00081 };
00082
00083
00084
00085
00086 class ErrHandler : public xercesc::DefaultHandler
00087 {
00088 public:
00089 ErrHandler () : DefaultHandler() {}
00090
00091 void
00092 warning (const xercesc::SAXParseException& exc);
00093
00094 void
00095 error (const xercesc::SAXParseException& exc);
00096
00097 void
00098 fatalError (const xercesc::SAXParseException& exc);
00099
00100 void
00101 resetErrors () {}
00102
00103 };
00104
00105 # define HANDLER_DEF_FUN \
00106 void \
00107 startElement (const XMLCh* const uri, \
00108 const XMLCh* const localname, \
00109 const XMLCh* const qname, \
00110 const xercesc::Attributes& attrs); \
00111 void \
00112 endElement (const XMLCh* const uri, \
00113 const XMLCh* const localname, \
00114 const XMLCh* const qname);
00115
00116
00117
00118
00119 template <typename T>
00120 class ContHandler;
00121 template <typename T>
00122 class TypeHandler;
00123 template <typename T>
00124 class TransitionsHandler;
00125 template <typename T>
00126 class StatesHandler;
00127
00128
00129
00130
00131
00132 class UnsupHandler : public xercesc::DefaultHandler
00133 {
00134 public:
00135 UnsupHandler (xercesc::DefaultHandler& root,
00136 xercesc::SAX2XMLReader* parser);
00137
00138 void
00139 startElement (const XMLCh* const uri,
00140 const XMLCh* const localname,
00141 const XMLCh* const qname,
00142 const xercesc::Attributes& attrs);
00143 void
00144 endElement (const XMLCh* const uri,
00145 const XMLCh* const localname,
00146 const XMLCh* const qname);
00147 private:
00148 xercesc::SAX2XMLReader* parser_;
00149 xercesc::DefaultHandler& root_;
00150 int depth_;
00151 };
00152
00153
00154
00155
00156 template <typename T>
00157 class AutHandler : public xercesc::DefaultHandler
00158 {
00159 public:
00160 AutHandler (T& aut,
00161 xercesc::SAX2XMLReader* parser,
00162 XMLEq& eq);
00163
00164 void
00165 startElement (const XMLCh* const uri,
00166 const XMLCh* const localname,
00167 const XMLCh* const qname,
00168 const xercesc::Attributes& attrs);
00169 void
00170 endElement (const XMLCh* const uri,
00171 const XMLCh* const localname,
00172 const XMLCh* const qname);
00173
00174 bool
00175 end ();
00176
00177 private:
00178 xercesc::SAX2XMLReader* parser_;
00179 XMLEq& eq_;
00180
00181 T& aut_;
00182
00183 bool end_;
00184
00185
00186 UnsupHandler unsuph_;
00187 ContHandler<T> contenth_;
00188 TypeHandler<T> typeh_;
00189 };
00190
00191
00192
00193
00194 class MonoidHandler : public Handler
00195 {
00196 public:
00197 MonoidHandler (xercesc::DefaultHandler& father,
00198 xercesc::SAX2XMLReader* parser,
00199 XMLEq& eq);
00200
00201 void startElement (const XMLCh* const uri,
00202 const XMLCh* const localname,
00203 const XMLCh* const qname,
00204 const xercesc::Attributes& attrs) = 0;
00205 void endElement (const XMLCh* const uri,
00206 const XMLCh* const localname,
00207 const XMLCh* const qname) = 0;
00208 };
00209 template <typename T>
00210 class FreeMonoidHandler : public MonoidHandler
00211 {
00212 public:
00213 FreeMonoidHandler (xercesc::DefaultHandler& father,
00214 T& monoid,
00215 xercesc::SAX2XMLReader* parser,
00216 XMLEq& eq);
00217
00218 void startElement (const XMLCh* const uri,
00219 const XMLCh* const localname,
00220 const XMLCh* const qname,
00221 const xercesc::Attributes& attrs);
00222 void endElement (const XMLCh* const uri,
00223 const XMLCh* const localname,
00224 const XMLCh* const qname);
00225
00226 private:
00227 T& monoid_;
00228 };
00229 template <typename T>
00230 class ProdMonoidHandler : public MonoidHandler
00231 {
00232 public:
00233 ProdMonoidHandler (xercesc::DefaultHandler& father,
00234 T& monoid,
00235 xercesc::SAX2XMLReader* parser,
00236 XMLEq& eq);
00237
00238 void startElement (const XMLCh* const uri,
00239 const XMLCh* const localname,
00240 const XMLCh* const qname,
00241 const xercesc::Attributes& attrs);
00242 void endElement (const XMLCh* const uri,
00243 const XMLCh* const localname,
00244 const XMLCh* const qname);
00245
00246 private:
00247 T& monoid_;
00248 bool first_;
00249
00250 MonoidHandler* monoidh_;
00251 };
00252
00253
00254
00255
00256
00257 class SemiringHandler : public Handler
00258 {
00259 public:
00260 SemiringHandler (xercesc::DefaultHandler& father,
00261 xercesc::SAX2XMLReader* parser,
00262 XMLEq& eq);
00263 };
00264
00265
00266 template <typename T>
00267 class SeriesSemiringHandler : public SemiringHandler
00268 {
00269 public:
00270 SeriesSemiringHandler (xercesc::DefaultHandler& father,
00271 T& semiring,
00272 xercesc::SAX2XMLReader* parser,
00273 XMLEq& eq);
00274
00275 void startElement (const XMLCh* const uri,
00276 const XMLCh* const localname,
00277 const XMLCh* const qname,
00278 const xercesc::Attributes& attrs);
00279 void endElement (const XMLCh* const uri,
00280 const XMLCh* const localname,
00281 const XMLCh* const qname);
00282
00283 private:
00284 T& semiring_;
00285 SemiringHandler* semiringh_;
00286 MonoidHandler* monoidh_;
00287 };
00288
00289
00290 template <typename T>
00291 class NumSemiringHandler : public SemiringHandler
00292 {
00293 public:
00294 NumSemiringHandler (xercesc::DefaultHandler& father,
00295 T& semiring,
00296 xercesc::SAX2XMLReader* parser,
00297 XMLEq& eq);
00298
00299 void startElement (const XMLCh* const uri,
00300 const XMLCh* const localname,
00301 const XMLCh* const qname,
00302 const xercesc::Attributes& attrs);
00303 void endElement (const XMLCh* const uri,
00304 const XMLCh* const localname,
00305 const XMLCh* const qname);
00306
00307 private:
00308 T& semiring_;
00309 };
00310
00311
00312
00313
00314
00315 template <typename T>
00316 class TypeHandler : public Handler
00317 {
00318 public:
00319 TypeHandler (xercesc::DefaultHandler& father,
00320 T& aut,
00321 xercesc::SAX2XMLReader* parser,
00322 XMLEq& eq);
00323
00324 void startElement (const XMLCh* const uri,
00325 const XMLCh* const localname,
00326 const XMLCh* const qname,
00327 const xercesc::Attributes& attrs);
00328 void endElement (const XMLCh* const uri,
00329 const XMLCh* const localname,
00330 const XMLCh* const qname);
00331
00332 private:
00333 typedef typename T::monoid_t monoid_t;
00334 typedef typename T::semiring_t semiring_t;
00335 typedef typename T::series_set_t series_set_t;
00336
00337 monoid_t* monoid_;
00338 semiring_t* semiring_;
00339
00340 T& aut_;
00341
00342 SemiringHandler* semiringh_;
00343 MonoidHandler* monoidh_;
00344 };
00345
00346
00347
00348
00349
00350 template <typename T>
00351 class ContHandler : public Handler
00352 {
00353 public:
00354 ContHandler (xercesc::DefaultHandler& father,
00355 T& aut,
00356 xercesc::SAX2XMLReader* parser,
00357 XMLEq& eq);
00358
00359 void startElement (const XMLCh* const uri,
00360 const XMLCh* const localname,
00361 const XMLCh* const qname,
00362 const xercesc::Attributes& attrs);
00363 void endElement (const XMLCh* const uri,
00364 const XMLCh* const localname,
00365 const XMLCh* const qname);
00366
00367 private:
00368 typedef typename T::hstate_t hstate_t;
00369 typedef std::map<std::string, hstate_t> map_t;
00370
00371 T& aut_;
00372 TransitionsHandler<T> transh_;
00373 StatesHandler<T> statesh_;
00374
00375 map_t map_;
00376 };
00377
00378
00379
00380
00381
00382 template <typename HState>
00383 class StateHandler : public Handler
00384 {
00385 public:
00386 typedef HState hstate_t;
00387 typedef std::map<std::string, hstate_t> map_t;
00388
00389 StateHandler (xercesc::DefaultHandler& father,
00390 map_t& map,
00391 xercesc::SAX2XMLReader* parser,
00392 XMLEq& eq);
00393
00394 void startElement (const XMLCh* const uri,
00395 const XMLCh* const localname,
00396 const XMLCh* const qname,
00397 const xercesc::Attributes& attrs);
00398 void endElement (const XMLCh* const uri,
00399 const XMLCh* const localname,
00400 const XMLCh* const qname);
00401 void reset (hstate_t* state);
00402 private:
00403 map_t& map_;
00404
00405 hstate_t* state_;
00406 UnsupHandler unsuph_;
00407 };
00408
00409
00410
00411
00412 template <typename T>
00413 class StatesHandler : public Handler
00414 {
00415 public:
00416 typedef typename T::hstate_t hstate_t;
00417 typedef std::map<std::string, hstate_t> map_t;
00418
00419 StatesHandler (xercesc::DefaultHandler& father,
00420 T& aut,
00421 map_t& map,
00422 xercesc::SAX2XMLReader* parser,
00423 XMLEq& eq);
00424
00425 void startElement (const XMLCh* const uri,
00426 const XMLCh* const localname,
00427 const XMLCh* const qname,
00428 const xercesc::Attributes& attrs);
00429 void endElement (const XMLCh* const uri,
00430 const XMLCh* const localname,
00431 const XMLCh* const qname);
00432
00433 private:
00434 map_t& map_;
00435
00436 T& aut_;
00437 StateHandler<hstate_t> stateh_;
00438 };
00439
00440
00441
00442
00443 template <typename T>
00444 class RegExpHandler : public Handler
00445 {
00446 public:
00447 typedef typename T::series_set_elt_t series_set_elt_t;
00448
00449
00450
00451
00452
00453 RegExpHandler (xercesc::DefaultHandler& father,
00454 T& aut,
00455 xercesc::SAX2XMLReader* parser,
00456 XMLEq& eq);
00457
00458 void startElement (const XMLCh* const uri,
00459 const XMLCh* const localname,
00460 const XMLCh* const qname,
00461 const xercesc::Attributes& attrs) = 0;
00462 void endElement (const XMLCh* const uri,
00463 const XMLCh* const localname,
00464 const XMLCh* const qname) = 0;
00465
00466 series_set_elt_t
00467 get_series ();
00468 protected:
00469 T& aut_;
00470
00471 series_set_elt_t krat_exp_;
00472 };
00473
00474 template <typename T>
00475 class SumHandler : public RegExpHandler<T>
00476 {
00477 public:
00478 SumHandler (xercesc::DefaultHandler& father,
00479 T& aut,
00480 xercesc::SAX2XMLReader* parser,
00481 XMLEq& eq);
00482
00483 void startElement (const XMLCh* const uri,
00484 const XMLCh* const localname,
00485 const XMLCh* const qname,
00486 const xercesc::Attributes& attrs);
00487 void endElement (const XMLCh* const uri,
00488 const XMLCh* const localname,
00489 const XMLCh* const qname);
00490
00491 protected:
00492 bool first_;
00493 RegExpHandler<T>* lefth_;
00494 RegExpHandler<T>* righth_;
00495 };
00496
00497
00498 template <typename T>
00499 class ProdHandler : public RegExpHandler<T>
00500 {
00501 public:
00502 ProdHandler (xercesc::DefaultHandler& father,
00503 T& aut,
00504 xercesc::SAX2XMLReader* parser,
00505 XMLEq& eq);
00506
00507 void startElement (const XMLCh* const uri,
00508 const XMLCh* const localname,
00509 const XMLCh* const qname,
00510 const xercesc::Attributes& attrs);
00511 void endElement (const XMLCh* const uri,
00512 const XMLCh* const localname,
00513 const XMLCh* const qname);
00514
00515 protected:
00516 bool first_;
00517 RegExpHandler<T>* lefth_;
00518 RegExpHandler<T>* righth_;
00519 };
00520
00521
00522 template <typename T>
00523 class StarHandler : public RegExpHandler<T>
00524 {
00525 public:
00526 StarHandler (xercesc::DefaultHandler& father,
00527 T& aut,
00528 xercesc::SAX2XMLReader* parser,
00529 XMLEq& eq);
00530
00531 void startElement (const XMLCh* const uri,
00532 const XMLCh* const localname,
00533 const XMLCh* const qname,
00534 const xercesc::Attributes& attrs);
00535 void endElement (const XMLCh* const uri,
00536 const XMLCh* const localname,
00537 const XMLCh* const qname);
00538
00539 protected:
00540 RegExpHandler<T>* sonh_;
00541 };
00542
00543
00544 template <typename T>
00545 class WordHandler : public RegExpHandler<T>
00546 {
00547 public:
00548 WordHandler (xercesc::DefaultHandler& father,
00549 T& aut,
00550 xercesc::SAX2XMLReader* parser,
00551 XMLEq& eq,
00552 typename RegExpHandler<T>::series_set_elt_t val);
00553
00554 void startElement (const XMLCh* const uri,
00555 const XMLCh* const localname,
00556 const XMLCh* const qname,
00557 const xercesc::Attributes& attrs);
00558 void endElement (const XMLCh* const uri,
00559 const XMLCh* const localname,
00560 const XMLCh* const qname);
00561 };
00562
00563
00564
00565
00566 template <typename T>
00567 class LabelHandler : public RegExpHandler<T>
00568 {
00569 public:
00570 typedef typename T::series_set_elt_t series_set_elt_t;
00571 LabelHandler (xercesc::DefaultHandler& father,
00572 T& aut,
00573 xercesc::SAX2XMLReader* parser,
00574 XMLEq& eq);
00575
00576 void startElement (const XMLCh* const uri,
00577 const XMLCh* const localname,
00578 const XMLCh* const qname,
00579 const xercesc::Attributes& attrs);
00580 void endElement (const XMLCh* const uri,
00581 const XMLCh* const localname,
00582 const XMLCh* const qname);
00583 bool used ();
00584 void reset ();
00585 series_set_elt_t
00586 value();
00587 protected:
00588 RegExpHandler<T>* sonh_;
00589 bool used_;
00590 };
00591
00592
00593
00594
00595 template <typename T>
00596 class TransitionHandler : public Handler
00597 {
00598 public:
00599 typedef typename T::hstate_t hstate_t;
00600 typedef std::map<std::string, hstate_t> map_t;
00601 typedef std::map<std::string, std::string> curattrs_t;
00602
00603 TransitionHandler (xercesc::DefaultHandler& father,
00604 T& aut,
00605 map_t& map,
00606 curattrs_t& attrs,
00607 xercesc::SAX2XMLReader* parser,
00608 XMLEq& eq);
00609 ~TransitionHandler();
00610
00611 void startElement (const XMLCh* const uri,
00612 const XMLCh* const localname,
00613 const XMLCh* const qname,
00614 const xercesc::Attributes& attrs);
00615 void endElement (const XMLCh* const uri,
00616 const XMLCh* const localname,
00617 const XMLCh* const qname);
00618 private:
00619 typedef typename T::series_set_elt_t series_set_elt_t;
00620
00621 curattrs_t& attrs_;
00622 map_t& map_;
00623
00624 T& aut_;
00625 UnsupHandler unsuph_;
00626 LabelHandler<T> labelh_;
00627 };
00628
00629
00630
00631
00632 template <typename T>
00633 class TransitionsHandler : public Handler
00634 {
00635 public:
00636 typedef typename T::hstate_t hstate_t;
00637 typedef std::map<std::string, hstate_t> map_t;
00638
00639 TransitionsHandler (xercesc::DefaultHandler& father,
00640 T& aut,
00641 map_t& map,
00642 xercesc::SAX2XMLReader* parser,
00643 XMLEq& eq);
00644 ~TransitionsHandler();
00645
00646 void startElement (const XMLCh* const uri,
00647 const XMLCh* const localname,
00648 const XMLCh* const qname,
00649 const xercesc::Attributes& attrs);
00650 void endElement (const XMLCh* const uri,
00651 const XMLCh* const localname,
00652 const XMLCh* const qname);
00653 private:
00654 typedef typename T::series_set_elt_t series_set_elt_t;
00655 typedef std::map<std::string, std::string> curattrs_t;
00656
00657 curattrs_t curattrs_;
00658
00659 map_t& map_;
00660
00661 T& aut_;
00662
00663 TransitionHandler<T> transh_;
00664 };
00665
00666 # undef HANDLER_DEF_FUN
00667 }
00668 }
00669
00670 # if ! defined VCSN_USE_INTERFACE_ONLY || defined VCSN_USE_LIB
00671 # include <vaucanson/xml/handlers.hxx>
00672 # endif // !VCSN_USE_INTERFACE_ONLY || VCSN_USE_LIB
00673
00674 #endif // !VCSN_XML_HANDLERS_HH