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