17 #ifndef VCSN_XML_BUILDERS_HXX
18 # define VCSN_XML_BUILDERS_HXX
22 # include <vaucanson/algebra/concept/letter.hh>
23 # include <vaucanson/algebra/implementation/series/rat/exp.hh>
26 # include <vaucanson/algebra/concept/monoid_base.hh>
27 # include <vaucanson/algebra/implementation/monoid/monoid_rep.hh>
28 # include <vaucanson/algebra/concept/tropical_semiring.hh>
30 # include <vaucanson/algebra/implementation/semiring/cyclic_semiring.hh>
42 static_error(need_to_specialize_monGenAction_for_T)
48 : alphabet_(monoid.alphabet())
52 template <
typename T,
typename U,
typename V>
53 monGenAction<vcsn::Element<vcsn::algebra::Series<T, U>, V> >::
54 monGenAction(series_t& s)
62 monGenAction<vcsn::algebra::FreeMonoid<T> >::
63 operator () (
const std::string& str)
65 alphabet_.insert(str);
69 template <
typename T,
typename U,
typename V>
71 monGenAction<vcsn::Element<vcsn::algebra::Series<T, U>, V> >::
72 operator () (
const std::string& str)
74 std::pair<bool, letter_t> res =
79 typename series_t::monoid_elt_t m(s_.structure().monoid(),
81 series_t tmp(s_.structure(), m);
85 error::notletter(str);
91 template <
typename T,
typename U>
96 : Handler(parser, root),
102 template <
typename T,
typename U>
105 const XMLCh*
const localname,
107 const xercesc::Attributes&)
109 error::token(localname);
112 template <
typename T,
typename U>
114 monGenHandler<T, U>::end (
const XMLCh*
const,
115 const XMLCh*
const localname,
118 if (xercesc::XMLString::equals(eq_.monGen, localname))
122 std::string letter = xmlstr(value_);
124 parser_->setContentHandler(&root_);
128 error::missattrs(localname,
"value");
132 error::token(localname);
138 template <
typename T,
typename U>
142 : Handler(parser, root),
150 template <
typename T,
typename U>
153 const XMLCh*
const localname,
155 const xercesc::Attributes& attrs)
157 if (xercesc::XMLString::equals(eq_.monCompGen, localname) && wait_begin_)
160 const XMLCh* attr = tools::get_attribute(attrs, eq_.value);
162 error::missattrs(localname,
"value");
163 value_ += xmlstr(attr);
164 if (count_ == algebra::letter_traits<typename T::alphabet_t::letter_t>::dim() - 2)
168 error::token(localname);
171 template <
typename T,
typename U>
173 monGenTupleHandler<T, U>::end (
const XMLCh*
const,
174 const XMLCh*
const localname,
177 int dim = algebra::letter_traits<typename T::alphabet_t::letter_t>::
180 if (xercesc::XMLString::equals(eq_.monGen, localname)
185 parser_->setContentHandler(&root_);
187 else if (xercesc::XMLString::equals(eq_.monCompGen, localname)
188 && !wait_begin_ && count_ < dim)
194 error::token(localname);
200 template <
typename T>
204 : Handler(parser, root),
208 unsuph_(parser, *this)
212 template <
typename T>
215 const XMLCh*
const localname,
217 const xercesc::Attributes& attrs)
219 using namespace xercesc;
221 if (XMLString::equals(eq_.monGen, localname))
230 if (algebra::letter_traits<typename T::alphabet_t::letter_t>::kind() ==
"simple")
232 const XMLCh* value = tools::get_attribute(attrs, eq_.value);
236 mongenh_ =
new monGenTupleHandler<T, T>(parser_, *
this, action);
239 parser_->setContentHandler(mongenh_);
241 else if (XMLString::equals(eq_.genSort, localname))
244 parser_->setContentHandler(&unsuph_);
246 else if (XMLString::equals(eq_.writingData, localname))
248 algebra::MonoidRep<T> rep;
249 if (tools::has_attribute(attrs, eq_.identitySymbol))
250 rep.empty = xmlstr(tools::get_attribute(attrs, eq_.identitySymbol));
251 if (tools::has_attribute(attrs, eq_.concat))
252 rep.concat = xmlstr(tools::get_attribute(attrs, eq_.concat));
253 monoid_.set_representation(rep);
255 parser_->setContentHandler(&unsuph_);
258 error::token(localname);
261 template <
typename T>
263 FreeMonoidHandler<T>::end (
const XMLCh*
const,
264 const XMLCh*
const localname,
267 using namespace xercesc;
269 if (XMLString::equals(eq_.monoid, localname))
275 T new_monoid(monoid_.alphabet());
279 new_monoid.set_representation(*(monoid_.representation()));
281 monoid_ = new_monoid;
284 parser_->setContentHandler(&root_);
286 else if (!XMLString::equals(eq_.monGen, localname))
287 error::token(localname);
293 template <
typename T>
297 : Handler(parser, root),
299 unsuph_(parser, *this)
303 template <
typename T>
306 const XMLCh*
const localname,
308 const xercesc::Attributes& attrs)
310 error::token(localname);
313 template <
typename T>
315 SeriesRepresentationHandler<T>::end(
const XMLCh*
const,
316 const XMLCh*
const localname,
319 using namespace xercesc;
321 if (XMLString::equals(eq_.writingData, localname))
324 parser_->setContentHandler(&root_);
327 error::token(localname);
332 template <
typename T>
333 typename T::monoid_t*
334 create_monoid(T& param,
335 const XMLCh*
const localname,
336 const xercesc::Attributes& attrs,
340 typename T::monoid_t::alphabet_t at;
341 typedef typename T::monoid_t monoid_t;
343 monoid_t* monoid =
new monoid_t(at);
344 builders::check_monoid_consistency(param, localname, attrs, eq);
349 template <
typename T>
351 create_monoidh (T& monoid,
352 const xercesc::Attributes&,
353 xercesc::SAX2XMLReader* parser,
359 template <
typename T>
360 typename T::series_set_t::series_rep_t*
361 create_series_representation(T& param,
362 const XMLCh*
const localname,
363 const xercesc::Attributes& attrs,
367 typedef typename T::series_set_t::series_rep_t series_rep_t;
369 return new series_rep_t();
372 template <
typename T>
374 create_series_representationh(T& srep,
375 const xercesc::Attributes& attrs,
376 xercesc::SAX2XMLReader* parser,
380 if (tools::has_attribute(attrs, eq.openPar))
381 srep.open_par = xmlstr(tools::get_attribute(attrs, eq.openPar));
382 if (tools::has_attribute(attrs, eq.closePar))
383 srep.close_par = xmlstr(tools::get_attribute(attrs, eq.closePar));
384 if (tools::has_attribute(attrs, eq.plusSym))
385 srep.plus = xmlstr(tools::get_attribute(attrs, eq.plusSym));
386 if (tools::has_attribute(attrs, eq.timesSym))
387 srep.times = xmlstr(tools::get_attribute(attrs, eq.timesSym));
388 if (tools::has_attribute(attrs, eq.starSym))
389 srep.star = xmlstr(tools::get_attribute(attrs, eq.starSym));
390 if (tools::has_attribute(attrs, eq.zeroSym))
391 srep.zero = xmlstr(tools::get_attribute(attrs, eq.zeroSym));
392 if (tools::has_attribute(attrs, eq.openWeight))
393 srep.open_weight = xmlstr(tools::get_attribute(attrs, eq.openWeight));
394 if (tools::has_attribute(attrs, eq.closeWeight))
395 srep.close_weight = xmlstr(tools::get_attribute(attrs, eq.closeWeight));
396 if (tools::has_attribute(attrs, eq.spacesSym))
399 srep.spaces.push_back(xmlstr(tools::get_attribute(attrs, eq.spacesSym)));
402 return new SeriesRepresentationHandler<T>(parser, root, srep);
410 template <
typename T>
414 : Handler(parser, root),
416 unsuph_(parser, *this)
420 template <
typename T>
423 const XMLCh*
const localname,
425 const xercesc::Attributes&)
427 if (xercesc::XMLString::equals(eq_.writingData, localname))
428 parser_->setContentHandler(&unsuph_);
430 error::token(localname);
433 template <
typename T>
435 NumSemiringHandler<T>::end (
const XMLCh*
const,
436 const XMLCh*
const localname,
439 if (xercesc::XMLString::equals(eq_.semiring, localname))
440 parser_->setContentHandler(&root_);
442 error::token(localname);
447 template <
typename T>
448 typename T::semiring_t*
450 const XMLCh*
const localname,
451 const xercesc::Attributes& attrs)
453 typedef typename T::semiring_t semiring_t;
454 semiring_t* semiring =
new semiring_t();
456 typedef typename T::semiring_elt_t semiring_elt_t;
458 builders::check_semiring_consistency(elt, localname, attrs);
463 template <
typename T>
465 create_semiringh(T& semiring,
466 const xercesc::Attributes&,
467 xercesc::SAX2XMLReader* parser,
470 return new NumSemiringHandler<T>(parser, root, semiring);
478 template <
typename T>
479 class MonElmtHandler;
481 template <
typename T>
487 template <
typename S,
typename T>
489 create_monElmth(xercesc::SAX2XMLReader* parser,
490 RegexpHandler<T>& root,
493 return new MonElmtHandler<S>(parser, root, param);
496 template <
typename T>
498 create_weighth(xercesc::SAX2XMLReader* parser,
499 RegexpHandler<T>& root,
501 const xercesc::Attributes& attrs)
503 typename T::monoid_elt_value_t m =
504 vcsn::algebra::identity_as<typename T::monoid_elt_value_t>::of(param.structure().monoid()).value();
505 const std::string val(xmlstr(tools::get_attribute(attrs, root.eq().value)));
506 std::string::const_iterator i = val.begin();
507 typename T::semiring_elt_t w(param.structure().semiring());
509 error::attrs(tools::get_attribute(attrs,
"localname"),
"value", val);
510 param.assoc(m, w.value());
511 return new WeightHandler<T>(parser, root, param);
522 const char* get_semiring_set(
const T&)
523 {
return "undefined"; }
525 # define GET_SEMIRING_SET(T, Value) \
526 const char* get_semiring_set(const T&) \
530 GET_SEMIRING_SET(
bool,
"B")
531 GET_SEMIRING_SET(
double, "R")
532 GET_SEMIRING_SET(
float, "R")
533 GET_SEMIRING_SET(
int, "Z")
534 GET_SEMIRING_SET(vcsn::algebra::RationalNumber, "Q")
535 # undef GET_SEMIRING_SET
538 const char* get_semiring_operations(
const S&)
539 {
return "classical"; }
543 get_semiring_operations(
const algebra::TropicalSemiring<algebra::TropicalMin>&)
544 {
return "minPlus"; }
548 get_semiring_operations(
const algebra::TropicalSemiring<algebra::TropicalMax>&)
549 {
return "maxPlus"; }
553 template <
unsigned int n>
555 get_semiring_operations(
const algebra::CyclicSemiring<n>&)
558 template <
typename T>
560 check_monoid_consistency(T&,
561 const XMLCh*
const localname,
562 const xercesc::Attributes& attrs,
565 const XMLCh* val = tools::get_attribute(attrs, eq.type);
566 if (!xercesc::XMLString::equals(val, eq.free))
567 error::attrs(localname, xmlstr(eq.type), xmlstr(val));
570 template <
typename T>
572 check_semiring_consistency (T& param,
573 const XMLCh*
const localname,
574 const xercesc::Attributes& attrs)
576 std::string
set(xmlstr(tools::get_attribute(attrs,
"set")));
577 if (builders::get_semiring_set(param.value()) !=
set)
578 error::attrs(localname,
"set",
set);
579 std::string op(xmlstr(tools::get_attribute(attrs,
"operations")));
580 if (builders::get_semiring_operations(param.structure()) != op)
581 error::attrs(localname,
"operations", op);
585 const char* get_monoid_gen_sort(
const T&)
586 {
return "undefined"; }
587 # define GET_MONOID_GEN_SORT(T, Value) \
588 const char* get_monoid_gen_sort(const T&) \
591 GET_MONOID_GEN_SORT(
char,
"letters")
592 GET_MONOID_GEN_SORT(
int, "integers")
593 # undef GET_MONOID_GEN_SORT
596 const char* get_monoid_gen_sort(
const T&,
int)
597 {
return "undefined"; }
599 template <
class U,
class V>
600 const char* get_monoid_gen_sort(
const std::pair<U,V>& a,
int i)
602 return i ? get_monoid_gen_sort(a.second) : get_monoid_gen_sort(a.first);
608 template <
typename T>
610 create_semiring_node(
const T& aut,
611 xercesc::DOMDocument* doc,
612 xercesc::DOMElement* root)
614 typedef typename T::semiring_elt_t semiring_elt_t;
615 semiring_elt_t semiring(aut.series().semiring());
616 xercesc::DOMElement* node = tools::create_element(doc,
"semiring");
617 tools::set_attribute(node,
"type",
"numerical");
618 tools::set_attribute(node,
"set", get_semiring_set(semiring.value()));
619 tools::set_attribute(node,
"operations", get_semiring_operations(semiring.structure()));
620 root->appendChild(node);
622 template <
typename T>
624 create_monoid_node(
const T& aut,
625 xercesc::DOMDocument* doc,
626 xercesc::DOMElement* root)
628 std::string letter_kind = algebra::letter_traits<typename T::monoid_t::alphabet_t::letter_t>::kind();
629 xercesc::DOMElement* node = tools::create_element(doc,
"monoid");
630 tools::set_attribute(node,
"type",
"free");
631 tools::set_attribute(node,
"genDescrip",
"enum");
632 tools::set_attribute(node,
"genKind", letter_kind);
633 root->appendChild(node);
635 xercesc::DOMElement* writingData = tools::create_element(doc,
"writingData");
636 tools::set_attribute(writingData,
"identitySym", aut.series().monoid().representation()->empty);
637 tools::set_attribute(writingData,
"timesSym", aut.series().monoid().representation()->concat);
638 node->appendChild(writingData);
640 typedef typename T::monoid_t::alphabet_t::const_iterator alphabet_iterator;
642 if (letter_kind ==
"simple")
643 tools::set_attribute(node,
"genSort", get_monoid_gen_sort(*(aut.series().monoid().alphabet().begin())));
646 std::stringstream genDim;
647 int dim = algebra::letter_traits<typename T::monoid_t::alphabet_t::letter_t>::dim();
649 tools::set_attribute(node,
"genDim", genDim.str());
650 xercesc::DOMElement* genSort = tools::create_element(doc,
"genSort");
651 node->appendChild(genSort);
652 xercesc::DOMElement* genCompSort;
653 for (
int i = 0; i != dim; i++)
655 genCompSort = tools::create_element(doc,
"genCompSort");
656 tools::set_attribute(genCompSort,
"value", get_monoid_gen_sort(*(aut.series().monoid().alphabet().begin()), i));
657 genSort->appendChild(genCompSort);
661 create_monGen_node<typename T::monoid_t::alphabet_t::letter_t> monGen_maker;
662 for_all_letters(l, aut.series().monoid().alphabet())
663 monGen_maker(*l, doc, node);
667 template <
typename T>
669 create_regexp_node(
const T& e,
670 xercesc::DOMDocument* doc,
671 xercesc::DOMElement* root,
672 const char* root_name)
674 typedef typename T::value_t::monoid_elt_value_t monoid_elt_value_t;
675 typedef typename T::value_t::semiring_elt_value_t semiring_elt_value_t;
676 typedef typename rat::exp<monoid_elt_value_t, semiring_elt_value_t> krat_exp_impl_t;
678 typedef Element<typename T::set_t, krat_exp_impl_t > krat_exp_t;
681 rat::XmlExpVisitor<monoid_elt_value_t, semiring_elt_value_t> v(doc, root_name);
682 res.value().accept(v);
683 root->appendChild(v.get());
686 template <
typename U>
688 create_monElmt_node(
const U& word,
689 xercesc::DOMDocument* doc,
690 xercesc::DOMElement* root)
692 xercesc::DOMElement* node;
695 node = tools::create_element(doc,
"one");
698 node = tools::create_element(doc,
"monElmt");
699 create_monGen_node<typename U::value_type> monGen_maker;
700 for (
typename U::const_iterator i = word.begin(); i != word.end(); ++i)
701 monGen_maker(*i, doc, node);
703 root->appendChild(node);
706 template <
typename T>
708 create_type_writingData_node(
const T& aut,
709 xercesc::DOMDocument* doc,
710 xercesc::DOMElement* root)
712 xercesc::DOMElement* writingData = tools::create_element(doc,
"writingData");
715 tools::set_attribute(writingData,
"plusSym", aut.series().representation()->plus);
716 tools::set_attribute(writingData,
"timesSym", aut.series().representation()->times);
717 tools::set_attribute(writingData,
"starSym", aut.series().representation()->star);
718 tools::set_attribute(writingData,
"zeroSym", aut.series().representation()->zero);
719 tools::set_attribute(writingData,
"weightOpening", aut.series().representation()->open_weight);
720 tools::set_attribute(writingData,
"weightClosing", aut.series().representation()->close_weight);
721 tools::set_attribute(writingData,
"openPar", aut.series().representation()->open_par);
722 tools::set_attribute(writingData,
"closePar", aut.series().representation()->close_par);
723 tools::set_attribute(writingData,
"spacesSym", aut.series().representation()->spaces.front());
725 root->appendChild(writingData);
730 template <
typename U>
731 struct create_monGen_node
734 operator()(
const U& letter,
735 xercesc::DOMDocument* doc,
736 xercesc::DOMElement* root)
738 xercesc::DOMElement* gen = tools::create_element(doc,
"monGen");
740 tools::set_attribute(gen,
"value",
741 algebra::letter_traits<U>::
742 letter_to_literal(letter));
744 root->appendChild(gen);
751 template <
typename U,
typename V>
752 struct create_monGen_node<std::pair<U, V> >
755 operator()(
const std::pair<U, V>& letter,
756 xercesc::DOMDocument* doc,
757 xercesc::DOMElement* root)
759 xercesc::DOMElement* gen = tools::create_element(doc,
"monGen");
761 std::stringstream sstr_first;
762 std::stringstream sstr_second;
763 xercesc::DOMElement* first = tools::create_element(doc,
"monCompGen");
764 xercesc::DOMElement* second = tools::create_element(doc,
"monCompGen");
765 sstr_first << letter.first;
766 sstr_second << letter.second;
767 tools::set_attribute(first,
"value", sstr_first.str());
768 tools::set_attribute(second,
"value", sstr_second.str());
769 gen->appendChild(first);
770 gen->appendChild(second);
772 root->appendChild(gen);
782 #endif // ! VCSN_XML_BUILDERS_HXX