00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef VCSN_XML_CONTEXTS_FMP_HXX
00019 # define VCSN_XML_CONTEXTS_FMP_HXX
00020
00021 # include <vaucanson/xml/builders.hh>
00022
00023 namespace vcsn
00024 {
00025 namespace xml
00026 {
00030 template <typename T>
00031 FreeMonoidProductHandler<T>::FreeMonoidProductHandler (xercesc::SAX2XMLReader* parser,
00032 Handler& root,
00033 T& monoid)
00034 : Handler(parser, root),
00035 monoid_(monoid),
00036 unsuph_(parser, *this),
00037 first_(true)
00038 {
00039 }
00040
00041 template <typename T>
00042 void
00043 FreeMonoidProductHandler<T>::start (const XMLCh* const,
00044 const XMLCh* const localname,
00045 const XMLCh* const,
00046 const xercesc::Attributes& attrs)
00047 {
00048 if (xercesc::XMLString::equals(eq_.monoid, localname))
00049 {
00050 if (first_)
00051 {
00052 monoidh_ = builders::create_monoidh(monoid_.first_monoid(), attrs, parser_, *this);
00053 first_ = false;
00054 }
00055 else
00056 {
00057 delete monoidh_;
00058 monoidh_ = builders::create_monoidh(monoid_.second_monoid(), attrs, parser_, *this);
00059 }
00060 parser_->setContentHandler(monoidh_);
00061 }
00062 else if (xercesc::XMLString::equals(eq_.writingData, localname))
00063 {
00064 algebra::MonoidRep<T> rep;
00065 if (tools::has_attribute(attrs, eq_.identitySymbol))
00066 rep.empty = xmlstr(tools::get_attribute(attrs, eq_.identitySymbol));
00067 if (tools::has_attribute(attrs, eq_.concat))
00068 rep.concat = xmlstr(tools::get_attribute(attrs, eq_.concat));
00069 monoid_.set_representation(rep);
00070 parser_->setContentHandler(&unsuph_);
00071 }
00072 else
00073 error::token(localname);
00074 }
00075
00076 template <typename T>
00077 void
00078 FreeMonoidProductHandler<T>::end (const XMLCh* const,
00079 const XMLCh* const localname,
00080 const XMLCh* const)
00081 {
00082 delete monoidh_;
00083 if (xercesc::XMLString::equals(eq_.monoid, localname))
00084 parser_->setContentHandler(&root_);
00085 else
00086 error::token(localname);
00087 }
00088
00092 template <typename S, typename M1, typename M2>
00093 SeriesRepresentationHandler<FMPsreptype>::
00094 SeriesRepresentationHandler(xercesc::SAX2XMLReader* parser,
00095 Handler& root,
00096 FMPsreptype& srep)
00097 : Handler(parser, root),
00098 rep_(srep),
00099 reph_(0),
00100 unsuph_(parser, *this),
00101 first_(true)
00102 {
00103 }
00104
00105 template <typename S, typename M1, typename M2>
00106 void
00107 SeriesRepresentationHandler<FMPsreptype>::start(const XMLCh* const,
00108 const XMLCh* const localname,
00109 const XMLCh* const,
00110 const xercesc::Attributes& attrs)
00111 {
00112 if (xercesc::XMLString::equals(eq_.writingData, localname))
00113 {
00114 if (first_)
00115 {
00116 reph_ = builders::create_series_representationh(rep_.first_representation(), attrs, parser_, *this, eq_);
00117 first_ = false;
00118 }
00119 else
00120 {
00121 delete reph_;
00122 reph_ = builders::create_series_representationh(rep_.second_representation(), attrs, parser_, *this, eq_);
00123 }
00124 parser_->setContentHandler(reph_);
00125 }
00126 else
00127 error::token(localname);
00128 }
00129
00130 template <typename S, typename M1, typename M2>
00131 void
00132 SeriesRepresentationHandler<FMPsreptype>::end(const XMLCh* const,
00133 const XMLCh* const localname,
00134 const XMLCh* const)
00135 {
00136 using namespace xercesc;
00137
00138 delete reph_;
00139 if (XMLString::equals(eq_.writingData, localname))
00140 parser_->setContentHandler(&root_);
00141 else
00142 error::token(localname);
00143 }
00144
00145 namespace builders
00146 {
00147 TParamFMP
00148 typename FMPtype::monoid_t*
00149 create_monoid (FMPtype& param,
00150 const XMLCh* const localname,
00151 const xercesc::Attributes& attrs,
00152 XMLEq& eq)
00153 {
00154 typename FMPtype::monoid_t::first_monoid_t::alphabet_t at1;
00155 typename FMPtype::monoid_t::second_monoid_t::alphabet_t at2;
00156 typename FMPtype::monoid_t::first_monoid_t md1(at1);
00157 typename FMPtype::monoid_t::second_monoid_t md2(at2);
00158 typedef typename FMPtype::monoid_t monoid_t;
00159
00160 monoid_t* monoid = new monoid_t(md1, md2);
00161 builders::check_monoid_consistency(param, localname, attrs, eq);
00162 return monoid;
00163 }
00164
00165 template <typename M1, typename M2>
00166 Handler*
00167 create_monoidh (vcsn::algebra::FreeMonoidProduct<M1, M2>& monoid,
00168 const xercesc::Attributes&,
00169 xercesc::SAX2XMLReader* parser,
00170 Handler& root)
00171 {
00172 typedef typename vcsn::algebra::FreeMonoidProduct<M1, M2> monoid_t;
00173 return new FreeMonoidProductHandler<monoid_t>(parser, root, monoid);
00174 }
00175 }
00176
00177
00178
00179
00180 template <typename T>
00181 ProdMonElmtHandler<T>::ProdMonElmtHandler (xercesc::SAX2XMLReader* parser,
00182 Handler& root,
00183 T param)
00184 : RegexpHandler<T>(parser, root, param),
00185 in_(1),
00186 count_(1),
00187 m1_(param.structure().monoid().first_monoid()),
00188 m2_(param.structure().monoid().second_monoid())
00189 {
00190 end_ = eq_.monElmt;
00191 }
00192
00193 template <typename T>
00194 void
00195 ProdMonElmtHandler<T>::start(const XMLCh* const,
00196 const XMLCh* const localname,
00197 const XMLCh* const,
00198 const xercesc::Attributes& attrs)
00199 {
00200 using namespace xercesc;
00201
00202 typedef typename T::set_t::monoid_t monoid_t;
00203 typedef typename monoid_t::first_monoid_t first_monoid_t;
00204 typedef typename monoid_t::second_monoid_t second_monoid_t;
00205 typedef typename first_monoid_t::alphabet_t first_alphabet_t;
00206 typedef typename second_monoid_t::alphabet_t second_alphabet_t;
00207 typedef typename first_alphabet_t::letter_t first_letter_t;
00208 typedef typename second_alphabet_t::letter_t second_letter_t;
00209
00210 if (XMLString::equals(eq_.monElmt, localname))
00211 {
00212 in_++;
00213 count_++;
00214 if (in_ > 2)
00215 error::token(localname);
00216 }
00217 else if (XMLString::equals(eq_.one, localname) && (in_ == 1))
00218 {
00219 in_++;
00220 count_++;
00221 if (count_ == 2)
00222 m1_ = algebra::identity_as<typename T::monoid_elt_t::first_monoid_elt_value_t>
00223 ::of(param_.structure().monoid().first_monoid());
00224 else if (count_ == 3)
00225 m2_ = algebra::identity_as<typename T::monoid_elt_t::second_monoid_elt_value_t>
00226 ::of(param_.structure().monoid().second_monoid());
00227 else
00228 error::token(localname);
00229 }
00230 else if (XMLString::equals(eq_.monGen, localname))
00231 {
00232 const std::string val(xmlstr(tools::get_attribute(attrs, "value")));
00233 if (in_ == 2 && count_ == 2)
00234 {
00235 std::pair<bool, first_letter_t> tmp =
00236 parse_letter(m1_.structure().alphabet(), val);
00237 if (tmp.first)
00238 m1_ *= tmp.second;
00239 else
00240 error::attrs(localname, "value", val);
00241 }
00242 else if (in_ == 2 && count_ == 3)
00243 {
00244 std::pair<bool, second_letter_t> tmp =
00245 parse_letter(m2_.structure().alphabet(), val);
00246 if (tmp.first)
00247 m2_ *= tmp.second;
00248 else
00249 error::attrs(localname, "value", val);
00250 }
00251 else
00252 error::token(localname);
00253 }
00254 else
00255 error::token(localname);
00256 }
00257
00258 template <typename T>
00259 void
00260 ProdMonElmtHandler<T>::end (const XMLCh* const,
00261 const XMLCh* const localname,
00262 const XMLCh* const)
00263 {
00264 using namespace xercesc;
00265 if (XMLString::equals(end_, localname))
00266 {
00267 if (in_ == 1 && count_ == 3)
00268 {
00269
00270 typename T::monoid_elt_value_t m(m1_.value(), m2_.value());
00271 typename T::semiring_elt_value_t w =
00272 algebra::identity_as<typename T::semiring_elt_value_t>::of(param_.structure().semiring()).value();
00273 param_.assoc(m, w);
00274 parser_->setContentHandler(&root_);
00275 }
00276 in_--;
00277 }
00278 else if (XMLString::equals(eq_.one, localname))
00279 in_--;
00280 else if (!XMLString::equals(eq_.monGen, localname))
00281 error::token(localname);
00282 }
00283
00284
00285 namespace builders
00286 {
00287 SParamFMP
00288 RegexpHandler<FMPseries >*
00289 create_monElmth(xercesc::SAX2XMLReader* parser,
00290 RegexpHandler<FMPseries >& root,
00291 FMPseries param)
00292 {
00293 return new ProdMonElmtHandler<FMPseries >(parser, root,
00294 algebra::zero_as<typename FMPseries::value_t>::of(param.structure()));
00295 }
00296 }
00297
00301 namespace builders
00302 {
00303 TParamFMP
00304 void
00305 check_monoid_consistency (FMPtype&,
00306 const XMLCh* const localname,
00307 const xercesc::Attributes& attrs,
00308 XMLEq&)
00309 {
00310 std::string val(xmlstr(tools::get_attribute(attrs, "type")));
00311 if (val != "product")
00312 error::attrs(localname, "type", val);
00313 val = xmlstr(tools::get_attribute(attrs, "prodDim"));
00314 if (val != "2")
00315 error::attrs(localname, "prodDim", val);
00316 };
00317 }
00318
00322 namespace builders
00323 {
00324
00325
00326 template <typename S>
00327 void
00328 do_create_type_writingData_node(const S& s,
00329 xercesc::DOMDocument* doc,
00330 xercesc::DOMElement* root)
00331 {
00332 xercesc::DOMElement* writingData = tools::create_element(doc, "writingData");
00333 tools::set_attribute(writingData, "plusSym", s.representation()->plus);
00334 tools::set_attribute(writingData, "timesSym", s.representation()->times);
00335 tools::set_attribute(writingData, "starSym", s.representation()->star);
00336 tools::set_attribute(writingData, "zeroSym", s.representation()->zero);
00337 tools::set_attribute(writingData, "weightOpening", s.representation()->open_weight);
00338 tools::set_attribute(writingData, "weightClosing", s.representation()->close_weight);
00339 tools::set_attribute(writingData, "openPar", s.representation()->open_par);
00340 tools::set_attribute(writingData, "closePar", s.representation()->close_par);
00341 tools::set_attribute(writingData, "spacesSym", s.representation()->spaces.front());
00342
00343 xercesc::DOMElement* firstWritingData = tools::create_element(doc, "writingData");
00344 tools::set_attribute(firstWritingData, "plusSym",
00345 s.representation()->first_representation().plus);
00346 tools::set_attribute(firstWritingData, "timesSym",
00347 s.representation()->first_representation().times);
00348 tools::set_attribute(firstWritingData, "starSym",
00349 s.representation()->first_representation().star);
00350 tools::set_attribute(firstWritingData, "zeroSym",
00351 s.representation()->first_representation().zero);
00352 tools::set_attribute(firstWritingData, "weightOpening",
00353 s.representation()->first_representation().open_weight);
00354 tools::set_attribute(firstWritingData, "weightClosing",
00355 s.representation()->first_representation().close_weight);
00356 tools::set_attribute(firstWritingData, "openPar",
00357 s.representation()->first_representation().open_par);
00358 tools::set_attribute(firstWritingData, "closePar",
00359 s.representation()->first_representation().close_par);
00360 tools::set_attribute(firstWritingData, "spacesSym",
00361 s.representation()->first_representation().spaces.front());
00362 writingData->appendChild(firstWritingData);
00363
00364 xercesc::DOMElement* secondWritingData = tools::create_element(doc, "writingData");
00365 tools::set_attribute(secondWritingData, "plusSym",
00366 s.representation()->second_representation().plus);
00367 tools::set_attribute(secondWritingData, "timesSym",
00368 s.representation()->second_representation().times);
00369 tools::set_attribute(secondWritingData, "starSym",
00370 s.representation()->second_representation().star);
00371 tools::set_attribute(secondWritingData, "zeroSym",
00372 s.representation()->second_representation().zero);
00373 tools::set_attribute(secondWritingData, "weightOpening",
00374 s.representation()->second_representation().open_weight);
00375 tools::set_attribute(secondWritingData, "weightClosing",
00376 s.representation()->second_representation().close_weight);
00377 tools::set_attribute(secondWritingData, "openPar",
00378 s.representation()->second_representation().open_par);
00379 tools::set_attribute(secondWritingData, "closePar",
00380 s.representation()->second_representation().close_par);
00381 tools::set_attribute(secondWritingData, "spacesSym",
00382 s.representation()->second_representation().spaces.front());
00383 writingData->appendChild(secondWritingData);
00384
00385 root->appendChild(writingData);
00386 }
00387
00388 TParamFMP
00389 void
00390 create_type_writingData_node(const FMPtype& aut,
00391 xercesc::DOMDocument* doc,
00392 xercesc::DOMElement* root)
00393 {
00394 do_create_type_writingData_node(aut.series(), doc, root);
00395 }
00396
00397 TParamFMP
00398 void
00399 create_type_writingData_node(const FMPseries& s,
00400 xercesc::DOMDocument* doc,
00401 xercesc::DOMElement* root)
00402 {
00403 do_create_type_writingData_node(s.series(), doc, root);
00404 }
00405
00406 TParamFMP
00407 void
00408 do_create_monoid_node(const vcsn::algebra::Series<S, vcsn::algebra::FreeMonoidProduct<M1, M2> >& s,
00409 xercesc::DOMDocument* doc,
00410 xercesc::DOMElement* root)
00411 {
00412 xercesc::DOMElement* node = tools::create_element(doc, "monoid");
00413 tools::set_attribute(node, "type", "product");
00414 tools::set_attribute(node, "prodDim", "2");
00415 root->appendChild(node);
00416
00417 xercesc::DOMElement* writingData = tools::create_element(doc, "writingData");
00418 tools::set_attribute(writingData, "identitySym", s.monoid().representation()->empty);
00419 tools::set_attribute(writingData, "timesSym", s.monoid().representation()->concat);
00420 node->appendChild(writingData);
00421
00422 xercesc::DOMElement* first = tools::create_element(doc, "monoid");
00423 tools::set_attribute(first, "type", "free");
00424 tools::set_attribute(first, "genDescrip", "enum");
00425 tools::set_attribute(first, "genKind", algebra::letter_traits<typename M1::alphabet_t::letter_t>::kind());
00426 node->appendChild(first);
00427
00428 xercesc::DOMElement* writingData1 = tools::create_element(doc, "writingData");
00429 tools::set_attribute(writingData1, "identitySym", s.monoid().first_monoid().representation()->empty);
00430 tools::set_attribute(writingData1, "timesSym", s.monoid().first_monoid().representation()->concat);
00431 first->appendChild(writingData1);
00432
00433 typedef typename M1::alphabet_t::const_iterator first_alphabet_iterator;
00434 for_all_letters_(first_, l, s.monoid().first_monoid().alphabet())
00435 {
00436 std::ostringstream letter;
00437 xercesc::DOMElement* gen = tools::create_element(doc, "monGen");
00438 letter << *l;
00439 tools::set_attribute(gen, "value", letter.str());
00440 first->appendChild(gen);
00441 }
00442 tools::set_attribute(first, "genSort", get_monoid_gen_sort(*(s.monoid().first_monoid().alphabet().begin())));
00443 xercesc::DOMElement* second = tools::create_element(doc, "monoid");
00444 tools::set_attribute(second, "type", "free");
00445 tools::set_attribute(second, "genDescrip", "enum");
00446 tools::set_attribute(second, "genKind", algebra::letter_traits<typename M2::alphabet_t::letter_t>::kind());
00447 node->appendChild(second);
00448
00449 xercesc::DOMElement* writingData2 = tools::create_element(doc, "writingData");
00450 tools::set_attribute(writingData2, "identitySym", s.monoid().second_monoid().representation()->empty);
00451 tools::set_attribute(writingData2, "timesSym", s.monoid().second_monoid().representation()->concat);
00452 second->appendChild(writingData2);
00453
00454 typedef typename M2::alphabet_t::const_iterator second_alphabet_iterator;
00455 for_all_letters_(second_, l, s.monoid().second_monoid().alphabet())
00456 {
00457 std::ostringstream letter;
00458 xercesc::DOMElement* gen = tools::create_element(doc, "monGen");
00459 letter << *l;
00460 tools::set_attribute(gen, "value", letter.str());
00461 second->appendChild(gen);
00462 }
00463 tools::set_attribute(second, "genSort", get_monoid_gen_sort(*(s.monoid().second_monoid().alphabet().begin())));
00464 }
00465
00466 TParamFMP
00467 void
00468 create_monoid_node(const FMPtype& aut,
00469 xercesc::DOMDocument* doc,
00470 xercesc::DOMElement* root)
00471 {
00472 do_create_monoid_node<S,T,M1,M2>(aut.series(), doc, root);
00473 }
00474
00475 TParamFMP
00476 void
00477 create_monoid_node(const FMPseries& s,
00478 xercesc::DOMDocument* doc,
00479 xercesc::DOMElement* root)
00480 {
00481 do_create_monoid_node<S,T,M1,M2>(s.series(), doc, root);
00482 }
00483
00484
00485
00486
00487
00488
00489 template <>
00490 void
00491 create_monElmt_node(const std::pair<std::string, std::string>& m,
00492 xercesc::DOMDocument* doc,
00493 xercesc::DOMElement* root)
00494 {
00495 xercesc::DOMElement* node;
00496 if (m.first.empty() && m.second.empty())
00497 node = tools::create_element(doc, "one");
00498 else
00499 {
00500 node = tools::create_element(doc, "monElmt");
00501 create_monElmt_node(m.first, doc, node);
00502 create_monElmt_node(m.second, doc, node);
00503 }
00504 root->appendChild(node);
00505 }
00506
00507 template <>
00508 void
00509 create_monElmt_node(const std::pair<std::basic_string<int>, std::basic_string<int> >& m,
00510 xercesc::DOMDocument* doc,
00511 xercesc::DOMElement* root)
00512 {
00513 xercesc::DOMElement* node;
00514 if (m.first.empty() && m.second.empty())
00515 node = tools::create_element(doc, "one");
00516 else
00517 {
00518 node = tools::create_element(doc, "monElmt");
00519 create_monElmt_node(m.first, doc, node);
00520 create_monElmt_node(m.second, doc, node);
00521 }
00522 root->appendChild(node);
00523 }
00524 }
00525 }
00526 }
00527
00528 #endif // !VCSN_XML_CONTEXTS_FMP_HXX