00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef VCSN_XML_CONTEXTS_RW_HXX
00019 # define VCSN_XML_CONTEXTS_RW_HXX
00020
00021 # include <vaucanson/xml/builders.hh>
00022
00023 namespace vcsn
00024 {
00025 namespace xml
00026 {
00030 template <typename T>
00031 SeriesSemiringHandler<T>::SeriesSemiringHandler (xercesc::SAX2XMLReader* parser,
00032 Handler& root,
00033 T& semiring)
00034 : Handler(parser, root),
00035 semiring_(semiring),
00036 ssemiringh_(0),
00037 monoidh_(0),
00038 unsuph_(parser, *this)
00039 {
00040 }
00041
00042 template <typename T>
00043 void
00044 SeriesSemiringHandler<T>::start (const XMLCh* const,
00045 const XMLCh* const localname,
00046 const XMLCh* const,
00047 const xercesc::Attributes& attrs)
00048 {
00049 if (xercesc::XMLString::equals(eq_.semiring, localname))
00050 {
00051 ssemiringh_ = builders::create_semiringh(semiring_.semiring(), attrs, parser_, *this);
00052 parser_->setContentHandler(ssemiringh_);
00053 }
00054 else if (xercesc::XMLString::equals(eq_.monoid, localname))
00055 {
00056 monoidh_ = builders::create_monoidh(const_cast <typename T::monoid_t&>(semiring_.monoid()), attrs, parser_, *this);
00057 parser_->setContentHandler(monoidh_);
00058 }
00059 else
00060 error::token(localname);
00061 }
00062
00063 template <typename T>
00064 void
00065 SeriesSemiringHandler<T>::end (const XMLCh* const,
00066 const XMLCh* const localname,
00067 const XMLCh* const)
00068 {
00069 if (xercesc::XMLString::equals(eq_.semiring, localname))
00070 parser_->setContentHandler(&root_);
00071 else
00072 error::token(localname);
00073 delete ssemiringh_;
00074 delete monoidh_;
00075 }
00076
00077 namespace builders
00078 {
00079 template <typename S, typename K, typename T>
00080 typename TRANStype::semiring_t*
00081 create_semiring (TRANStype&,
00082 const XMLCh* const,
00083 const xercesc::Attributes&)
00084 {
00085 typename TRANStype::semiring_t::monoid_t::alphabet_t at;
00086 typename TRANStype::semiring_t::monoid_t md(at);
00087 typename TRANStype::semiring_t::semiring_t ssg;
00088 typedef typename TRANStype::semiring_t semiring_t;
00089 semiring_t* semiring = new semiring_t(ssg, md);
00090
00091 return semiring;
00092 }
00093
00094 template <typename S, typename T>
00095 Handler*
00096 create_semiringh(TRANSsemiring& semiring,
00097 const xercesc::Attributes&,
00098 xercesc::SAX2XMLReader* parser,
00099 Handler& root)
00100 {
00101 return new SeriesSemiringHandler<TRANSsemiring >(parser, root, semiring);
00102 }
00103
00104 }
00105
00109 namespace builders
00110 {
00111 template <typename S, typename T>
00112 const char* get_semiring_operations(const vcsn::algebra::Series<S, T>&)
00113 {
00114 return "SHOULD not append";
00115 }
00116 }
00117
00118 namespace builders
00119 {
00120 template <typename S, typename K, typename T>
00121 void
00122 create_semiring_node(const TRANStype& aut,
00123 xercesc::DOMDocument* doc,
00124 xercesc::DOMElement* root)
00125 {
00126 xercesc::DOMElement* node = tools::create_element(doc, "semiring");
00127 tools::set_attribute(node, "type", "series");
00128 xercesc::DOMElement* semiringn = tools::create_element(doc, "semiring");
00129 xercesc::DOMElement* monoid = tools::create_element(doc, "monoid");
00130
00131 typedef typename TRANStype::semiring_elt_t::semiring_elt_t semiring_elt_t;
00132 semiring_elt_t semiring;
00133 tools::set_attribute(semiringn, "type", "numerical");
00134 tools::set_attribute(semiringn, "set", get_semiring_set(semiring.value()));
00135 tools::set_attribute(semiringn, "operations", get_semiring_operations(semiring.structure()));
00136
00137 tools::set_attribute(monoid, "type", "free");
00138 tools::set_attribute(monoid, "genDescrip", "enum");
00139 tools::set_attribute(monoid, "genKind", algebra::letter_traits<typename TRANStype::semiring_t::monoid_t::alphabet_t::letter_t>::kind());
00140 typedef typename TRANStype::semiring_t::monoid_t::alphabet_t::const_iterator alphabet_iterator;
00141 for_all_letters(l, aut.series().semiring().monoid().alphabet())
00142 {
00143 std::ostringstream letter;
00144 xercesc::DOMElement* gen = tools::create_element(doc, "monGen");
00145 letter << *l;
00146 tools::set_attribute(gen, "value", letter.str());
00147 monoid->appendChild(gen);
00148 }
00149 tools::set_attribute(monoid, "genSort", get_monoid_gen_sort(*(aut.series().semiring().monoid().alphabet().begin())));
00150 node->appendChild(semiringn);
00151 node->appendChild(monoid);
00152 root->appendChild(node);
00153 }
00154 }
00155
00160 SParamTRANS
00161 WeightHandler<TRANSseries >::WeightHandler (xercesc::SAX2XMLReader* parser,
00162 Handler& root,
00163 TRANSseries param)
00164 : RegexpHandler<TRANSseries >(parser, root, param),
00165 weighth_(0)
00166 {
00167 end_ = eq_.weight;
00168 }
00169
00170 SParamTRANS
00171 void
00172 WeightHandler<TRANSseries >::start (const XMLCh* const,
00173 const XMLCh* const localname,
00174 const XMLCh* const,
00175 const xercesc::Attributes&)
00176 {
00177
00178
00179 if (!(weighth_ = create_weighth(localname)))
00180 error::token(localname);
00181 else
00182 parser_->setContentHandler(weighth_);
00183 }
00184
00185 SParamTRANS
00186 void
00187 WeightHandler<TRANSseries >::end (const XMLCh* const,
00188 const XMLCh* const localname,
00189 const XMLCh* const)
00190 {
00191
00192 using namespace xercesc;
00193 if (XMLString::equals(end_, localname))
00194 {
00195 TRANSseries s = algebra::identity_as<typename TRANSseries::value_t>::of(param_.structure());
00196 typename TRANSseries::semiring_elt_t w(weighth_->series());
00197 param_ = param_ * w;
00198
00199 parser_->setContentHandler(&root_);
00200 delete weighth_;
00201 }
00202 else
00203 error::token(localname);
00204 }
00205
00206 SParamTRANS
00207 RegexpHandler<typename WeightHandler<TRANSseries >::series_set_elt_t>*
00208 WeightHandler<TRANSseries >::create_weighth (const XMLCh* const localname)
00209 {
00210 using namespace xercesc;
00211 series_set_elt_t elt(param_.structure().semiring());
00212
00213 if (XMLString::equals(eq_.monElmt, localname))
00214 return builders::create_monElmth(parser_, *this, algebra::identity_as<typename series_set_elt_t::value_t>::of(elt.structure()));
00215 else if (XMLString::equals(eq_.star, localname))
00216 return new StarHandler<series_set_elt_t>(parser_, *this, algebra::identity_as<typename series_set_elt_t::value_t>::of(elt.structure()));
00217 else if (XMLString::equals(eq_.leftExtMul, localname))
00218 return new ExtMulHandler<series_set_elt_t>(parser_, *this, algebra::identity_as<typename series_set_elt_t::value_t>::of(elt.structure()), true);
00219 else if (XMLString::equals(eq_.rightExtMul, localname))
00220 return new ExtMulHandler<series_set_elt_t>(parser_, *this, algebra::identity_as<typename series_set_elt_t::value_t>::of(elt.structure()), false);
00221 else if (XMLString::equals(eq_.sum, localname))
00222 return new SumHandler<series_set_elt_t>(parser_, *this, algebra::identity_as<typename series_set_elt_t::value_t>::of(elt.structure()));
00223 else if (XMLString::equals(eq_.product, localname))
00224 return new ProductHandler<series_set_elt_t>(parser_, *this, algebra::identity_as<typename series_set_elt_t::value_t>::of(elt.structure()));
00225 else if (XMLString::equals(eq_.one, localname))
00226 return new AtomHandler<series_set_elt_t>(parser_, *this, algebra::identity_as<typename series_set_elt_t::value_t>::of(elt.structure()), eq_.one);
00227 else if (XMLString::equals(eq_.zero, localname))
00228 return new AtomHandler<series_set_elt_t>(parser_, *this, algebra::zero_as<typename series_set_elt_t::value_t>::of(elt.structure()), eq_.zero);
00229 else
00230 return 0;
00231 }
00232
00233 namespace builders
00234 {
00235 SParamTRANS
00236 RegexpHandler<TRANSseries >*
00237 create_weighth(xercesc::SAX2XMLReader* parser,
00238 RegexpHandler<TRANSseries >& root,
00239 TRANSseries param,
00240 const xercesc::Attributes&)
00241 {
00242 return new WeightHandler<TRANSseries >(parser, root, param);
00243 }
00244 }
00245 }
00246 }
00247
00248 #endif // !VCSN_XML_CONTEXTS_RW_HXX