00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef VCSN_XML_HANDLERS_HXX
00019 # define VCSN_XML_HANDLERS_HXX
00020
00021 # include <xercesc/util/XMLString.hpp>
00022
00023 # include <vaucanson/xml/tools.hh>
00024
00025 namespace vcsn
00026 {
00027 namespace xml
00028 {
00029
00030
00031
00032 template <typename T>
00033 DocRegExpHandler<T>::DocRegExpHandler (xercesc::SAX2XMLReader* parser,
00034 xercesc::DefaultHandler& root,
00035 T& regexp,
00036 XMLEq& eq)
00037 : Handler(parser, root, eq),
00038 regexp_(regexp),
00039 regexph_(parser, *this, regexp)
00040 {
00041 }
00042
00043 template <typename T>
00044 void
00045 DocRegExpHandler<T>::start (const XMLCh* const,
00046 const XMLCh* const localname,
00047 const XMLCh* const,
00048 const xercesc::Attributes&)
00049 {
00050 using namespace xercesc;
00051 if (XMLString::equals(eq_.fsmxml, localname))
00052 {
00053
00054
00055 parser_->setContentHandler(®exph_);
00056 }
00057 else
00058 error::token(localname);
00059 }
00060
00061 template <typename T>
00062 void
00063 DocRegExpHandler<T>::end (const XMLCh* const,
00064 const XMLCh* const,
00065 const XMLCh* const)
00066 {
00067 }
00068
00069
00070
00071
00072 template <typename T>
00073 DocAutHandler<T>::DocAutHandler (xercesc::SAX2XMLReader* parser,
00074 xercesc::DefaultHandler& root,
00075 T& aut,
00076 XMLEq& eq)
00077 : Handler(parser, root, eq),
00078 aut_(aut),
00079 auth_(parser, *this, aut)
00080 {
00081 }
00082
00083 template <typename T>
00084 void
00085 DocAutHandler<T>::start (const XMLCh* const,
00086 const XMLCh* const localname,
00087 const XMLCh* const,
00088 const xercesc::Attributes&)
00089 {
00090 using namespace xercesc;
00091 if (XMLString::equals(eq_.fsmxml, localname))
00092 {
00093
00094
00095 parser_->setContentHandler(&auth_);
00096 }
00097 else
00098 error::token(localname);
00099 }
00100
00101 template <typename T>
00102 void
00103 DocAutHandler<T>::end (const XMLCh* const,
00104 const XMLCh* const,
00105 const XMLCh* const)
00106 {
00107 }
00108
00112 template <typename T>
00113 RegExpHandler<T>::RegExpHandler (xercesc::SAX2XMLReader* parser,
00114 Handler& root,
00115 T& regexp)
00116 : Handler(parser, root),
00117 regexp_(regexp),
00118 typeh_(parser, *this, regexp),
00119 contenth_(parser, *this, regexp, eq_.typedRegExp),
00120 unsuph_(parser, *this)
00121 {
00122 }
00123
00124 template <typename T>
00125 void
00126 RegExpHandler<T>::start (const XMLCh* const uri,
00127 const XMLCh* const localname,
00128 const XMLCh* const,
00129 const xercesc::Attributes& attrs)
00130 {
00131 using namespace xercesc;
00132 if (XMLString::equals(eq_.regExp, localname))
00133 {
00134
00135 }
00136 else if (XMLString::equals(eq_.drawing, localname))
00137 parser_->setContentHandler(&unsuph_);
00138 else if (XMLString::equals(eq_.geometry, localname))
00139 parser_->setContentHandler(&unsuph_);
00140 else if (XMLString::equals(eq_.valueType, localname))
00141 parser_->setContentHandler(&typeh_);
00142 else if (XMLString::equals(eq_.typedRegExp, localname))
00143 {
00144 contenth_.series(regexp_);
00145 parser_->setContentHandler(&contenth_);
00146 }
00147 else
00148 error::token(localname);
00149 }
00150
00151 template <typename T>
00152 void
00153 RegExpHandler<T>::end (const XMLCh* const,
00154 const XMLCh* const localname,
00155 const XMLCh* const)
00156 {
00157 using namespace xercesc;
00158 if (XMLString::equals(eq_.regExp, localname))
00159 {
00160 parser_->setContentHandler(&root_);
00161 regexp_ = contenth_.series();
00162 }
00163 }
00164
00168 template <typename T>
00169 AutHandler<T>::AutHandler (xercesc::SAX2XMLReader* parser,
00170 Handler& root,
00171 T& aut)
00172 : Handler(parser, root),
00173 aut_(aut),
00174 typeh_(parser, *this, aut),
00175 contenth_(parser, *this, aut),
00176 unsuph_(parser, *this)
00177 {
00178 }
00179
00180 template <typename T>
00181 void
00182 AutHandler<T>::start (const XMLCh* const uri,
00183 const XMLCh* const localname,
00184 const XMLCh* const,
00185 const xercesc::Attributes& attrs)
00186 {
00187 using namespace xercesc;
00188 if (XMLString::equals(eq_.automaton, localname))
00189 {
00190 const XMLCh* autname = tools::get_attribute(attrs, "name", uri);
00191 if (autname != 0)
00192 aut_.geometry().name() = xmlstr(autname);
00193
00194 }
00195 else if (XMLString::equals(eq_.drawing, localname))
00196 parser_->setContentHandler(&unsuph_);
00197 else if (XMLString::equals(eq_.geometry, localname))
00198 parser_->setContentHandler(&unsuph_);
00199 else if (XMLString::equals(eq_.valueType, localname))
00200 parser_->setContentHandler(&typeh_);
00201 else if (XMLString::equals(eq_.content, localname))
00202 parser_->setContentHandler(&contenth_);
00203 else
00204 error::token(localname);
00205 }
00206
00207 template <typename T>
00208 void
00209 AutHandler<T>::end (const XMLCh* const,
00210 const XMLCh* const localname,
00211 const XMLCh* const)
00212 {
00213 using namespace xercesc;
00214 if (XMLString::equals(eq_.automaton, localname))
00215 parser_->setContentHandler(&root_);
00216 }
00217
00221 template <typename T>
00222 TypeHandler<T>::TypeHandler (xercesc::SAX2XMLReader* parser,
00223 Handler& root,
00224 T& param)
00225 : Handler(parser, root),
00226 monoid_(0),
00227 semiring_(0),
00228 rep_(0),
00229 param_(param),
00230 monoidh_(0),
00231 reph_(0),
00232 semiringh_(0),
00233 unsuph_(parser, *this)
00234 {
00235 }
00236
00237 template <typename T>
00238 void
00239 TypeHandler<T>::start(const XMLCh* const,
00240 const XMLCh* const localname,
00241 const XMLCh* const,
00242 const xercesc::Attributes& attrs)
00243 {
00244 using namespace xercesc;
00245
00246 if (XMLString::equals(eq_.semiring, localname))
00247 {
00248 semiring_ = builders::create_semiring(param_, localname, attrs);
00249 semiringh_ = builders::create_semiringh(*semiring_, attrs, parser_, *this);
00250 parser_->setContentHandler(semiringh_);
00251 }
00252 else if (XMLString::equals(eq_.monoid, localname))
00253 {
00254 monoid_ = builders::create_monoid(param_, localname, attrs, eq_);
00255 monoidh_ = builders::create_monoidh(*monoid_, attrs, parser_, *this);
00256 parser_->setContentHandler(monoidh_);
00257 }
00258 else if (XMLString::equals(eq_.writingData, localname))
00259 {
00260 rep_ = builders::create_series_representation(param_, localname, attrs, eq_);
00261 reph_ = builders::create_series_representationh(*rep_, attrs, parser_, *this, eq_);
00262 parser_->setContentHandler(reph_);
00263 }
00264 else
00265 error::token(localname);
00266 }
00267
00268 template <typename T>
00269 void
00270 TypeHandler<T>::end(const XMLCh* const,
00271 const XMLCh* const localname,
00272 const XMLCh* const)
00273 {
00274 using namespace xercesc;
00275
00276
00277
00278 if (rep_)
00279 {
00280 typename T::series_set_t series(*semiring_, *monoid_, *rep_);
00281 param_.attach(series);
00282 }
00283 else
00284 {
00285 typename T::series_set_t series(*semiring_, *monoid_);
00286 param_.attach(series);
00287 }
00288
00289 if (XMLString::equals(eq_.valueType, localname))
00290 parser_->setContentHandler(&root_);
00291
00292 delete monoid_;
00293 delete monoidh_;
00294 delete rep_;
00295 delete reph_;
00296 delete semiring_;
00297 delete semiringh_;
00298 }
00299
00303 template <typename T>
00304 ContHandler<T>::ContHandler (xercesc::SAX2XMLReader* parser,
00305 Handler& root,
00306 T& aut)
00307 : Handler(parser, root),
00308 aut_(aut),
00309 statesh_(parser, *this, aut, map_),
00310 transitionsh_(parser, *this, aut, map_)
00311 {
00312 }
00313
00314 template <typename T>
00315 void
00316 ContHandler<T>::start (const XMLCh* const,
00317 const XMLCh* const localname,
00318 const XMLCh* const,
00319 const xercesc::Attributes&)
00320 {
00321 using namespace xercesc;
00322 if (XMLString::equals(eq_.states, localname))
00323 parser_->setContentHandler(&statesh_);
00324 else if (XMLString::equals(eq_.transitions, localname))
00325 parser_->setContentHandler(&transitionsh_);
00326 else
00327 error::token(localname);
00328 }
00329
00330 template <typename T>
00331 void
00332 ContHandler<T>::end (const XMLCh* const,
00333 const XMLCh* const localname,
00334 const XMLCh* const)
00335 {
00336 using namespace xercesc;
00337 if (XMLString::equals(eq_.content, localname))
00338 parser_->setContentHandler(&root_);
00339 else
00340 error::token(localname);
00341 }
00342
00346 template <typename T>
00347 StatesHandler<T>::StatesHandler (xercesc::SAX2XMLReader* parser,
00348 Handler& root,
00349 T& aut,
00350 map_t& map)
00351 : Handler(parser, root),
00352 aut_(aut),
00353 map_(map),
00354 stateh_(0)
00355 {
00356 }
00357
00358 template <typename T>
00359 void
00360 StatesHandler<T>::start (const XMLCh* const,
00361 const XMLCh* const localname,
00362 const XMLCh* const,
00363 const xercesc::Attributes& attrs)
00364 {
00365 using namespace xercesc;
00366 if (XMLString::equals(eq_.state, localname))
00367 {
00368 hstate_t state = aut_.add_state();
00369 map_[xmlstr(tools::get_attribute(attrs, eq_.id))] = state;
00370 delete stateh_;
00371 stateh_ = new StateHandler<T>(parser_, *this, aut_, state);
00372 parser_->setContentHandler(stateh_);
00373 }
00374 else
00375 error::token(localname);
00376 }
00377
00378 template <typename T>
00379 void
00380 StatesHandler<T>::end (const XMLCh* const,
00381 const XMLCh* const localname,
00382 const XMLCh* const)
00383 {
00384 using namespace xercesc;
00385 if (XMLString::equals(eq_.states, localname))
00386 parser_->setContentHandler(&root_);
00387 else
00388 error::token(localname);
00389 delete stateh_;
00390 }
00391
00395 template <typename T>
00396 StateHandler<T>::StateHandler (xercesc::SAX2XMLReader* parser,
00397 Handler& root,
00398 T& aut,
00399 hstate_t state)
00400 : Handler(parser, root),
00401 aut_(aut),
00402 state_(state),
00403 geometryh_(parser, *this, aut, state),
00404 unsuph_(parser, *this)
00405 {
00406 }
00407
00408 template <typename T>
00409 void
00410 StateHandler<T>::start (const XMLCh* const,
00411 const XMLCh* const localname,
00412 const XMLCh* const,
00413 const xercesc::Attributes& attrs)
00414 {
00415 using namespace xercesc;
00416 if (XMLString::equals(eq_.drawing, localname))
00417 parser_->setContentHandler(&unsuph_);
00418 else if (XMLString::equals(eq_.geometry, localname))
00419 {
00420 typedef typename T::geometry_t::states_geometry_map_t gmap_t;
00421
00422 double y = 0;
00423 double x = 0;
00424 if (tools::has_attribute(attrs, eq_.x))
00425 {
00426 std::istringstream xstr(xmlstr(tools::get_attribute(attrs, eq_.x)));
00427 xstr >> x;
00428 }
00429 if (tools::has_attribute(attrs, eq_.y))
00430 {
00431 std::istringstream ystr(xmlstr(tools::get_attribute(attrs, eq_.y)));
00432 ystr >> y;
00433 }
00434 gmap_t& map = aut_.geometry().states();
00435 map[state_] = std::make_pair(x,y);
00436 parser_->setContentHandler(&geometryh_);
00437 }
00438 else
00439 error::token(localname);
00440 }
00441
00442 template <typename T>
00443 void
00444 StateHandler<T>::end (const XMLCh* const,
00445 const XMLCh* const localname,
00446 const XMLCh* const)
00447 {
00448 using namespace xercesc;
00449 if (XMLString::equals(eq_.state, localname))
00450 parser_->setContentHandler(&root_);
00451 else
00452 error::token(localname);
00453 }
00454
00458 template <typename T>
00459 TransitionsHandler<T>::TransitionsHandler (xercesc::SAX2XMLReader* parser,
00460 Handler& root,
00461 T& aut,
00462 map_t& map)
00463 : Handler(parser, root),
00464 aut_(aut),
00465 map_(map),
00466 transitionh_(0)
00467 {
00468 }
00469
00470 template <typename T>
00471 void
00472 TransitionsHandler<T>::start (const XMLCh* const,
00473 const XMLCh* const localname,
00474 const XMLCh* const,
00475 const xercesc::Attributes& attrs)
00476 {
00477 using namespace xercesc;
00478 if (XMLString::equals(eq_.transition, localname))
00479 {
00480 hstate_t src = map_[xmlstr(tools::get_attribute(attrs, eq_.source))];
00481 hstate_t dst = map_[xmlstr(tools::get_attribute(attrs, eq_.target))];
00482 delete transitionh_;
00483 transitionh_ = new TransitionHandler<T>(parser_, *this, aut_, src, dst);
00484 parser_->setContentHandler(transitionh_);
00485 }
00486 else if (XMLString::equals(eq_.final, localname))
00487 {
00488 hstate_t state = map_[xmlstr(tools::get_attribute(attrs, eq_.state))];
00489 delete transitionh_;
00490 transitionh_ = new InitFinalHandler<T>(parser_, *this, aut_, state, false);
00491 parser_->setContentHandler(transitionh_);
00492 }
00493 else if (XMLString::equals(eq_.initial, localname))
00494 {
00495 hstate_t state = map_[xmlstr(tools::get_attribute(attrs, eq_.state))];
00496 delete transitionh_;
00497 transitionh_ = new InitFinalHandler<T>(parser_, *this, aut_, state, true);
00498 parser_->setContentHandler(transitionh_);
00499 }
00500 else
00501 error::token(localname);
00502 }
00503
00504 template <typename T>
00505 void
00506 TransitionsHandler<T>::end (const XMLCh* const,
00507 const XMLCh* const localname,
00508 const XMLCh* const)
00509 {
00510 using namespace xercesc;
00511 if (XMLString::equals(eq_.transitions, localname))
00512 parser_->setContentHandler(&root_);
00513 else
00514 error::token(localname);
00515 delete transitionh_;
00516 }
00517
00521 template <typename T>
00522 TransitionHandler<T>::TransitionHandler (xercesc::SAX2XMLReader* parser,
00523 Handler& root,
00524 T& aut,
00525 hstate_t src,
00526 hstate_t dst)
00527 : Handler(parser, root),
00528 aut_(aut),
00529 src_(src),
00530 dst_(dst),
00531 s_(aut.series()),
00532 labelh_(parser, *this, s_, eq_.label),
00533 unsuph_(parser, *this)
00534 {
00535 }
00536
00537 template <typename T>
00538 void
00539 TransitionHandler<T>::start (const XMLCh* const,
00540 const XMLCh* const localname,
00541 const XMLCh* const,
00542 const xercesc::Attributes&)
00543 {
00544 using namespace xercesc;
00545 if (XMLString::equals(eq_.drawing, localname))
00546 parser_->setContentHandler(&unsuph_);
00547 else if (XMLString::equals(eq_.geometry, localname))
00548 parser_->setContentHandler(&unsuph_);
00549 else if (XMLString::equals(eq_.label, localname))
00550 parser_->setContentHandler(&labelh_);
00551 else
00552 error::token(localname);
00553 }
00554
00555 template <typename T>
00556 void
00557 TransitionHandler<T>::end (const XMLCh* const,
00558 const XMLCh* const localname,
00559 const XMLCh* const)
00560 {
00561 using namespace xercesc;
00562 if (XMLString::equals(eq_.transition, localname))
00563 {
00564 parser_->setContentHandler(&root_);
00565 aut_.add_series_transition(src_, dst_, labelh_.series());
00566 }
00567 else
00568 error::token(localname);
00569 }
00570
00574 template <typename T>
00575 InitFinalHandler<T>::InitFinalHandler (xercesc::SAX2XMLReader* parser,
00576 Handler& root,
00577 T& aut,
00578 hstate_t state,
00579 bool initial)
00580 : Handler(parser, root),
00581 aut_(aut),
00582 state_(state),
00583 initial_(initial),
00584 s_(aut.series().one_),
00585 labelh_(parser, *this, s_, eq_.label),
00586 unsuph_(parser, *this)
00587 {
00588 }
00589
00590 template <typename T>
00591 void
00592 InitFinalHandler<T>::start (const XMLCh* const,
00593 const XMLCh* const localname,
00594 const XMLCh* const,
00595 const xercesc::Attributes&)
00596 {
00597 using namespace xercesc;
00598 if (XMLString::equals(eq_.drawing, localname))
00599 parser_->setContentHandler(&unsuph_);
00600 else if (XMLString::equals(eq_.geometry, localname))
00601 parser_->setContentHandler(&unsuph_);
00602 else if (XMLString::equals(eq_.label, localname))
00603 parser_->setContentHandler(&labelh_);
00604 else
00605 error::token(localname);
00606 }
00607
00608 template <typename T>
00609 void
00610 InitFinalHandler<T>::end (const XMLCh* const,
00611 const XMLCh* const localname,
00612 const XMLCh* const)
00613 {
00614 using namespace xercesc;
00615 if (XMLString::equals(eq_.initial, localname) && initial_)
00616 {
00617 parser_->setContentHandler(&root_);
00618 aut_.set_initial(state_, labelh_.series());
00619 }
00620 else if (XMLString::equals(eq_.final, localname) && !initial_)
00621 {
00622 parser_->setContentHandler(&root_);
00623 aut_.set_final(state_, labelh_.series());
00624 }
00625 else
00626 error::token(localname);
00627 }
00628
00632 template <typename T>
00633 GeometryHandler<T>::GeometryHandler (xercesc::SAX2XMLReader* parser,
00634 Handler& root,
00635 T& aut,
00636 hstate_t state)
00637 : Handler(parser, root),
00638 aut_(aut),
00639 state_(state)
00640 {
00641 }
00642
00643 template <typename T>
00644 void
00645 GeometryHandler<T>::start (const XMLCh* const,
00646 const XMLCh* const localname,
00647 const XMLCh* const,
00648 const xercesc::Attributes&)
00649 {
00650 error::token(localname);
00651 }
00652
00653 template <typename T>
00654 void
00655 GeometryHandler<T>::end (const XMLCh* const,
00656 const XMLCh* const localname,
00657 const XMLCh* const)
00658 {
00659 using namespace xercesc;
00660 if (XMLString::equals(eq_.geometry, localname))
00661 parser_->setContentHandler(&root_);
00662 else
00663 error::token(localname);
00664 }
00665
00669 template <typename T>
00670 RegexpHandler<T>*
00671 RegexpHandler<T>::create (const XMLCh* const localname)
00672 {
00673 using namespace xercesc;
00674 if (XMLString::equals(eq_.monElmt, localname))
00675 return builders::create_monElmth(parser_, *this, algebra::identity_as<typename T::value_t>::of(param_.structure()));
00676 else if (XMLString::equals(eq_.star, localname))
00677 return new StarHandler<T>(parser_, *this, algebra::identity_as<typename T::value_t>::of(param_.structure()));
00678 else if (XMLString::equals(eq_.leftExtMul, localname))
00679 return new ExtMulHandler<T>(parser_, *this, algebra::identity_as<typename T::value_t>::of(param_.structure()), true);
00680 else if (XMLString::equals(eq_.rightExtMul, localname))
00681 return new ExtMulHandler<T>(parser_, *this, algebra::identity_as<typename T::value_t>::of(param_.structure()), false);
00682 else if (XMLString::equals(eq_.sum, localname))
00683 return new SumHandler<T>(parser_, *this, algebra::identity_as<typename T::value_t>::of(param_.structure()));
00684 else if (XMLString::equals(eq_.product, localname))
00685 return new ProductHandler<T>(parser_, *this, algebra::identity_as<typename T::value_t>::of(param_.structure()));
00686 else if (XMLString::equals(eq_.one, localname))
00687 return new AtomHandler<T>(parser_, *this, algebra::identity_as<typename T::value_t>::of(param_.structure()), eq_.one);
00688 else if (XMLString::equals(eq_.zero, localname))
00689 return new AtomHandler<T>(parser_, *this, algebra::zero_as<typename T::value_t>::of(param_.structure()), eq_.zero);
00690 else
00691 return 0;
00692 }
00693
00694 template <typename T>
00695 RegexpHandler<T>*
00696 RegexpHandler<T>::create_weight (const xercesc::Attributes& attrs)
00697 {
00698 using namespace xercesc;
00699 return builders::create_weighth(parser_, *this,
00700 algebra::identity_as<typename T::value_t>::of(param_.structure()), attrs);
00701 }
00702 }
00703 }
00704
00705 #endif // !VCSN_XML_HANDLERS_HXX