00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 #ifndef VCSN_ALGEBRA_IMPLEMENTATION_SERIES_RAT_XML_EXP_VISITOR_HXX
00018 # define VCSN_ALGEBRA_IMPLEMENTATION_SERIES_RAT_XML_EXP_VISITOR_HXX
00019 
00020 # include <vaucanson/algebra/implementation/series/rat/xml_exp_visitor.hh>
00021 
00022 # include <algorithm>
00023 # include <sstream>
00024 # include <vaucanson/xml/strings.hh>
00025 
00026 namespace vcsn {
00027 
00028   namespace rat {
00029 
00030     using xml::transcode;
00031 
00032     template<typename M_, typename W_>
00033     XmlExpVisitor<M_,W_>::XmlExpVisitor(xercesc::DOMDocument* doc, const char* node_name) :
00034       doc_(doc),
00035       label_(doc_->createElement(transcode(node_name))),
00036       current_(label_)
00037     {}
00038 
00039 
00040     template<typename M_, typename W_>
00041     void
00042     XmlExpVisitor<M_,W_>::sum_or_product(const Node<M_, W_>* left_,
00043                                          const Node<M_, W_>* right_)
00044     {
00045       left_->accept(*this);
00046       right_->accept(*this);
00047     }
00048 
00049     template<typename M_, typename W_>
00050     void
00051     XmlExpVisitor<M_, W_>::weight_or_star(const Node<M_, W_>* node)
00052     {
00053       node->accept(*this);
00054     }
00055 
00056     template<typename M_, typename W_>
00057     void
00058     XmlExpVisitor<M_, W_>::product(const Node<M_, W_>* left_,
00059                                    const Node<M_, W_>* right_)
00060     {
00061       xercesc::DOMElement* tmp = current_;
00062       current_ = doc_->createElement(transcode("product"));
00063       sum_or_product(left_, right_);
00064       tmp->appendChild(current_);
00065       current_ = tmp;
00066     }
00067 
00068     template<typename M_, typename W_>
00069     void
00070     XmlExpVisitor<M_, W_>::sum(const Node<M_, W_>* left_,
00071                                const Node<M_, W_>* right_)
00072     {
00073       xercesc::DOMElement* tmp = current_;
00074       current_ = doc_->createElement(transcode("sum"));
00075       sum_or_product(left_, right_);
00076       tmp->appendChild(current_);
00077       current_ = tmp;
00078     }
00079 
00080     template<typename M_, typename W_>
00081     void
00082     XmlExpVisitor<M_, W_>::star(const Node<M_, W_>* node)
00083     {
00084       xercesc::DOMElement* tmp = current_;
00085       current_ = doc_->createElement(transcode("star"));
00086       weight_or_star(node);
00087       tmp->appendChild(current_);
00088       current_ = tmp;
00089     }
00090 
00091     template<typename M_, typename W_>
00092     void
00093     XmlExpVisitor<M_, W_>::left_weight(const W_& w, const Node<M_, W_>* node)
00094     {
00095       std::stringstream ss;
00096       ss << w;
00097       weight_ = ss.str();
00098       weight_or_star(node);
00099     }
00100 
00101     template<typename M_, typename W_>
00102     void
00103     XmlExpVisitor<M_, W_>::right_weight(const W_& w, const Node<M_, W_>* node)
00104     {
00105       std::stringstream ss;
00106       ss << w;
00107       weight_or_star(node);
00108     }
00109 
00110     template<typename M_, typename W_>
00111     void
00112     XmlExpVisitor<M_, W_>::constant(const M_& m)
00113     {
00114       std::stringstream ss;
00115       ss << m;
00116       xercesc::DOMElement* word = doc_->createElement(transcode("word"));
00117       word->setAttribute(transcode("value"), transcode(ss.str()));
00118       if (weight_.size())
00119       {
00120         word->setAttribute(transcode("weight"), transcode(weight_));
00121         weight_ = "";
00122       }
00123       current_->appendChild(word);
00124     }
00125 
00126     template<typename M_, typename W_>
00127     void XmlExpVisitor<M_, W_>::zero()
00128     {
00129       xercesc::DOMElement* zero = doc_->createElement(transcode("zero"));
00130       current_->appendChild(zero);
00131     }
00132 
00133     template<typename M_, typename W_>
00134     void XmlExpVisitor<M_, W_>::one()
00135     {
00136       xercesc::DOMElement* identity = doc_->createElement(transcode("identity"));
00137       current_->appendChild(identity);
00138       if (weight_.size())
00139       {
00140         identity->setAttribute(transcode("weight"), transcode(weight_));
00141         weight_ = "";
00142       }
00143     }
00144 
00145     template<typename M_, typename W_>
00146     xercesc::DOMElement*
00147     XmlExpVisitor<M_, W_>::get() const
00148     {
00149       return label_;
00150     }
00151 
00152     template<typename M_, typename W_>
00153     xercesc::DOMDocument*
00154     XmlExpVisitor<M_, W_>::set(xercesc::DOMDocument* v)
00155     {
00156       this->doc_ = v;
00157       return this->doc_;
00158     }
00159 
00160 
00161   } 
00162 
00163 } 
00164 
00165 
00166 
00167 #endif // ! VCSN_ALGEBRA_IMPLEMENTATION_SERIES_RAT_XML_EXP_VISITOR_HXX