18 #ifndef VCSN_XML_REGEXP_HXX
19 # define VCSN_XML_REGEXP_HXX
23 # include <xercesc/util/XMLString.hpp>
25 # include <vaucanson/algebra/concept/monoid_base.hh>
26 # include <vaucanson/algebra/concept/freemonoid_base.hh>
38 RegexpHandler<T>::RegexpHandler (xercesc::SAX2XMLReader* parser,
41 : Handler(parser, root),
42 end_(eq_.typedRegExp),
49 RegexpHandler<T>::RegexpHandler (xercesc::SAX2XMLReader* parser,
53 : Handler(parser, root),
61 RegexpHandler<T>::~RegexpHandler()
68 RegexpHandler<T>::start (
const XMLCh*
const,
69 const XMLCh*
const localname,
71 const xercesc::Attributes&)
73 if (!(lefth_ = create(localname)))
74 error::token(localname);
76 parser_->setContentHandler(lefth_);
81 RegexpHandler<T>::end (
const XMLCh*
const,
82 const XMLCh*
const localname,
85 using namespace xercesc;
86 if (XMLString::equals(end_, localname))
88 param_ = lefth_->series();
89 parser_->setContentHandler(&root_);
92 error::token(localname);
97 RegexpHandler<T>::series()
102 template <
typename T>
104 RegexpHandler<T>::series(T& param)
113 template <
typename T>
114 StarHandler<T>::StarHandler (xercesc::SAX2XMLReader* parser,
117 : RegexpHandler<T>(parser, root, param),
123 template <
typename T>
125 StarHandler<T>::start (
const XMLCh*
const,
126 const XMLCh*
const localname,
128 const xercesc::Attributes&)
130 using namespace xercesc;
132 if (in_ == 1 && (lefth_ = create(localname)))
133 parser_->setContentHandler(lefth_);
135 error::token(localname);
138 template <
typename T>
140 StarHandler<T>::end (
const XMLCh*
const,
141 const XMLCh*
const localname,
144 using namespace xercesc;
145 if (XMLString::equals(end_, localname))
147 param_ = lefth_->series().star();
148 parser_->setContentHandler(&root_);
151 error::token(localname);
157 template <
typename T>
158 AtomHandler<T>::AtomHandler (xercesc::SAX2XMLReader* parser,
162 : RegexpHandler<T>(parser, root, param, end)
166 template <
typename T>
168 AtomHandler<T>::start (
const XMLCh*
const,
169 const XMLCh*
const localname,
171 const xercesc::Attributes&)
173 error::token(localname);
176 template <
typename T>
178 AtomHandler<T>::end (
const XMLCh*
const,
179 const XMLCh*
const localname,
182 using namespace xercesc;
183 if (XMLString::equals(end_, localname))
184 parser_->setContentHandler(&root_);
186 error::token(localname);
192 template <
typename T>
193 WeightHandler<T>::WeightHandler (xercesc::SAX2XMLReader* parser,
196 : RegexpHandler<T>(parser, root, param)
201 template <
typename T>
203 WeightHandler<T>::start (
const XMLCh*
const,
204 const XMLCh*
const localname,
206 const xercesc::Attributes&)
208 error::token(localname);
211 template <
typename T>
213 WeightHandler<T>::end (
const XMLCh*
const,
214 const XMLCh*
const localname,
217 using namespace xercesc;
218 if (XMLString::equals(end_, localname))
219 parser_->setContentHandler(&root_);
221 error::token(localname);
227 template <
typename T>
228 ExtMulHandler<T>::ExtMulHandler (xercesc::SAX2XMLReader* parser,
232 : RegexpHandler<T>(parser, root, param),
237 end_ = eq_.leftExtMul;
239 end_ = eq_.rightExtMul;
242 template <
typename T>
243 ExtMulHandler<T>::~ExtMulHandler ()
248 template <
typename T>
250 ExtMulHandler<T>::start (
const XMLCh*
const,
251 const XMLCh*
const localname,
253 const xercesc::Attributes& attrs)
255 using namespace xercesc;
256 if (XMLString::equals(eq_.weight, localname) &&
257 (lefth_ = create_weight(attrs)))
258 parser_->setContentHandler(lefth_);
259 else if ((righth_ = create(localname)))
260 parser_->setContentHandler(righth_);
262 error::token(localname);
265 template <
typename T>
267 ExtMulHandler<T>::end (
const XMLCh*
const,
268 const XMLCh*
const localname,
271 using namespace xercesc;
272 if (XMLString::equals(end_, localname))
275 param_ = lefth_->series() * righth_->series();
277 param_ = righth_->series() * lefth_->series();
278 parser_->setContentHandler(&root_);
281 error::token(localname);
288 template <
typename T>
289 ProductHandler<T>::ProductHandler (xercesc::SAX2XMLReader* parser,
292 : RegexpHandler<T>(parser, root, param),
299 template <
typename T>
300 ProductHandler<T>::~ProductHandler()
305 template <
typename T>
307 ProductHandler<T>::start (
const XMLCh*
const,
308 const XMLCh*
const localname,
310 const xercesc::Attributes&)
312 using namespace xercesc;
313 if (in_ == 1 && (lefth_ = create(localname)))
314 parser_->setContentHandler(lefth_);
315 else if (in_ == 2 && (righth_ = create(localname)))
316 parser_->setContentHandler(righth_);
318 error::token(localname);
322 template <
typename T>
324 ProductHandler<T>::end (
const XMLCh*
const,
325 const XMLCh*
const localname,
328 using namespace xercesc;
329 if (XMLString::equals(end_, localname))
331 param_ = lefth_->series() * righth_->series();
332 parser_->setContentHandler(&root_);
334 else if (!XMLString::equals(eq_.monGen, localname))
335 error::token(localname);
340 template <
typename T>
341 SumHandler<T>::SumHandler (xercesc::SAX2XMLReader* parser,
344 : RegexpHandler<T>(parser, root, param),
351 template <
typename T>
352 SumHandler<T>::~SumHandler ()
357 template <
typename T>
359 SumHandler<T>::start (
const XMLCh*
const,
360 const XMLCh*
const localname,
362 const xercesc::Attributes&)
364 using namespace xercesc;
366 if (in_ == 1 && (lefth_ = create(localname)))
367 parser_->setContentHandler(lefth_);
368 else if (in_ == 2 && (righth_ = create(localname)))
369 parser_->setContentHandler(righth_);
371 error::token(localname);
376 template <
typename T>
378 SumHandler<T>::end (
const XMLCh*
const,
379 const XMLCh*
const localname,
382 using namespace xercesc;
384 if (XMLString::equals(end_, localname))
386 param_ = lefth_->series() + righth_->series();
387 parser_->setContentHandler(&root_);
389 else if (!XMLString::equals(eq_.monGen, localname))
390 error::token(localname);
396 template <
typename T>
397 MonElmtHandler<T>::MonElmtHandler (xercesc::SAX2XMLReader* parser,
400 : RegexpHandler<T>(parser, root, param),
406 template <
typename T>
408 MonElmtHandler<T>::start (
const XMLCh*
const,
409 const XMLCh*
const localname,
411 const xercesc::Attributes& attrs)
417 using namespace xercesc;
419 if (XMLString::equals(eq_.monGen, localname))
421 typedef typename T::set_t::monoid_t monoid_t;
425 monGenAction<actee_t> action(param_);
431 if (algebra::letter_traits<typename monoid_t::alphabet_t::letter_t>::kind() ==
"simple")
433 const XMLCh* value = tools::get_attribute(attrs,
"value");
434 mongenh_ =
new monGenHandler<monoid_t, actee_t>(parser_, *
this, action, value);
437 mongenh_ =
new monGenTupleHandler<monoid_t, actee_t>(parser_, *
this, action);
440 parser_->setContentHandler(mongenh_);
443 error::token(localname);
446 template <
typename T>
448 MonElmtHandler<T>::end (
const XMLCh*
const,
449 const XMLCh*
const localname,
452 using namespace xercesc;
454 if (XMLString::equals(end_, localname))
460 parser_->setContentHandler(&root_);
462 else if (!XMLString::equals(eq_.monGen, localname))
463 error::token(localname);
469 #endif // !VCSN_XML_REGEXP_HXX