18 #ifndef VCSN_XML_CONTEXTS_RW_HXX
19 # define VCSN_XML_CONTEXTS_RW_HXX
34 : Handler(parser, root),
38 unsuph_(parser, *this)
45 const XMLCh*
const localname,
47 const xercesc::Attributes& attrs)
49 if (xercesc::XMLString::equals(eq_.semiring, localname))
51 ssemiringh_ = builders::create_semiringh(semiring_.semiring(), attrs, parser_, *
this);
52 parser_->setContentHandler(ssemiringh_);
54 else if (xercesc::XMLString::equals(eq_.monoid, localname))
56 monoidh_ = builders::create_monoidh(const_cast <typename T::monoid_t&>(semiring_.monoid()), attrs, parser_, *
this);
57 parser_->setContentHandler(monoidh_);
60 error::token(localname);
65 SeriesSemiringHandler<T>::end (
const XMLCh*
const,
66 const XMLCh*
const localname,
69 if (xercesc::XMLString::equals(eq_.semiring, localname))
70 parser_->setContentHandler(&root_);
72 error::token(localname);
79 template <
typename S,
typename K,
typename T>
80 typename TRANStype::semiring_t*
81 create_semiring (TRANStype&,
83 const xercesc::Attributes&)
85 typename TRANStype::semiring_t::monoid_t::alphabet_t at;
86 typename TRANStype::semiring_t::monoid_t md(at);
87 typename TRANStype::semiring_t::semiring_t ssg;
88 typedef typename TRANStype::semiring_t semiring_t;
89 semiring_t* semiring =
new semiring_t(ssg, md);
94 template <
typename S,
typename T>
96 create_semiringh(TRANSsemiring& semiring,
97 const xercesc::Attributes&,
98 xercesc::SAX2XMLReader* parser,
101 return new SeriesSemiringHandler<TRANSsemiring >(parser, root, semiring);
111 template <
typename S,
typename T>
114 return "SHOULD not append";
120 template <
typename S,
typename K,
typename T>
122 create_semiring_node(
const TRANStype& aut,
123 xercesc::DOMDocument* doc,
124 xercesc::DOMElement* root)
126 xercesc::DOMElement* node = tools::create_element(doc,
"semiring");
127 tools::set_attribute(node,
"type",
"series");
128 xercesc::DOMElement* semiringn = tools::create_element(doc,
"semiring");
129 xercesc::DOMElement* monoid = tools::create_element(doc,
"monoid");
131 typedef typename TRANStype::semiring_elt_t::semiring_elt_t semiring_elt_t;
132 semiring_elt_t semiring;
133 tools::set_attribute(semiringn,
"type",
"numerical");
134 tools::set_attribute(semiringn,
"set", get_semiring_set(semiring.value()));
135 tools::set_attribute(semiringn,
"operations", get_semiring_operations(semiring.structure()));
137 tools::set_attribute(monoid,
"type",
"free");
138 tools::set_attribute(monoid,
"genDescrip",
"enum");
139 tools::set_attribute(monoid,
"genKind", algebra::letter_traits<typename TRANStype::semiring_t::monoid_t::alphabet_t::letter_t>::kind());
140 typedef typename TRANStype::semiring_t::monoid_t::alphabet_t::const_iterator alphabet_iterator;
141 for_all_letters(l, aut.series().semiring().monoid().alphabet())
143 std::ostringstream letter;
144 xercesc::DOMElement* gen = tools::create_element(doc,
"monGen");
146 tools::set_attribute(gen,
"value", letter.str());
147 monoid->appendChild(gen);
149 tools::set_attribute(monoid,
"genSort", get_monoid_gen_sort(*(aut.series().semiring().monoid().alphabet().begin())));
150 node->appendChild(semiringn);
151 node->appendChild(monoid);
152 root->appendChild(node);
161 WeightHandler<TRANSseries >::WeightHandler (xercesc::SAX2XMLReader* parser,
164 : RegexpHandler<TRANSseries >(parser, root, param),
172 WeightHandler<TRANSseries >::start (
const XMLCh*
const,
173 const XMLCh*
const localname,
175 const xercesc::Attributes&)
179 if (!(weighth_ = create_weighth(localname)))
180 error::token(localname);
182 parser_->setContentHandler(weighth_);
187 WeightHandler<TRANSseries >::end (
const XMLCh*
const,
188 const XMLCh*
const localname,
192 using namespace xercesc;
193 if (XMLString::equals(end_, localname))
195 TRANSseries s = algebra::identity_as<typename TRANSseries::value_t>::of(param_.structure());
196 typename TRANSseries::semiring_elt_t w(weighth_->series());
199 parser_->setContentHandler(&root_);
203 error::token(localname);
207 RegexpHandler<typename WeightHandler<TRANSseries >::series_set_elt_t>*
208 WeightHandler<TRANSseries >::create_weighth (
const XMLCh*
const localname)
210 using namespace xercesc;
211 series_set_elt_t elt(param_.structure().semiring());
213 if (XMLString::equals(eq_.monElmt, localname))
214 return builders::create_monElmth(parser_, *
this, algebra::identity_as<typename series_set_elt_t::value_t>::of(elt.structure()));
215 else if (XMLString::equals(eq_.star, localname))
216 return new StarHandler<series_set_elt_t>(parser_, *
this, algebra::identity_as<typename series_set_elt_t::value_t>::of(elt.structure()));
217 else if (XMLString::equals(eq_.leftExtMul, localname))
218 return new ExtMulHandler<series_set_elt_t>(parser_, *
this, algebra::identity_as<typename series_set_elt_t::value_t>::of(elt.structure()),
true);
219 else if (XMLString::equals(eq_.rightExtMul, localname))
220 return new ExtMulHandler<series_set_elt_t>(parser_, *
this, algebra::identity_as<typename series_set_elt_t::value_t>::of(elt.structure()),
false);
221 else if (XMLString::equals(eq_.sum, localname))
222 return new SumHandler<series_set_elt_t>(parser_, *
this, algebra::identity_as<typename series_set_elt_t::value_t>::of(elt.structure()));
223 else if (XMLString::equals(eq_.product, localname))
224 return new ProductHandler<series_set_elt_t>(parser_, *
this, algebra::identity_as<typename series_set_elt_t::value_t>::of(elt.structure()));
225 else if (XMLString::equals(eq_.one, localname))
226 return new AtomHandler<series_set_elt_t>(parser_, *
this, algebra::identity_as<typename series_set_elt_t::value_t>::of(elt.structure()), eq_.one);
227 else if (XMLString::equals(eq_.zero, localname))
228 return new AtomHandler<series_set_elt_t>(parser_, *
this, algebra::zero_as<typename series_set_elt_t::value_t>::of(elt.structure()), eq_.zero);
236 RegexpHandler<TRANSseries >*
237 create_weighth(xercesc::SAX2XMLReader* parser,
238 RegexpHandler<TRANSseries >& root,
240 const xercesc::Attributes&)
242 return new WeightHandler<TRANSseries >(parser, root, param);
248 #endif // !VCSN_XML_CONTEXTS_RW_HXX