00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef VCSN_ALGEBRA_IMPLEMENTATION_SERIES_KRAT_EXP_PARSER_HXX
00019 # define VCSN_ALGEBRA_IMPLEMENTATION_SERIES_KRAT_EXP_PARSER_HXX
00020 # include <map>
00021 # include <queue>
00022 # include <set>
00023 # include <vaucanson/algebra/implementation/series/krat_exp_parser.hh>
00024 # include <vaucanson/algebra/implementation/series/krat_exp_proxy.hh>
00025 # include <vaucanson/algebra/concept/monoid_base.hh>
00026
00027
00028 namespace yy
00029 {
00030 struct token_queue;
00031
00032
00033
00034
00035 struct krat_exp_parser
00036 {
00037 krat_exp_parser();
00038 ~krat_exp_parser();
00039 void insert_word(vcsn::algebra::krat_exp_virtual* rexp);
00040 void insert_weight(vcsn::algebra::semiring_virtual* sem);
00041 void insert_zero(vcsn::algebra::krat_exp_virtual* rexp);
00042 void insert_token(int i, std::string* str);
00043 int parse(vcsn::algebra::krat_exp_virtual& rexp, std::string& error);
00044
00045
00046 token_queue* tok_q_;
00047 };
00048 }
00049
00050 namespace vcsn
00051 {
00052 namespace algebra
00053 {
00054
00055 template <class S, class T>
00056 struct Lexer
00057 {
00058
00059 typedef typename Element<S, T>::monoid_elt_t monoid_elt_t;
00060 typedef typename Element<S, T>::semiring_elt_t semiring_elt_t;
00061 typedef typename Element<S, T>::set_t::shared_series_rep_t
00062 shared_series_rep_t;
00063
00064 Lexer(const std::string& from,
00065 Element<S, T>& e,
00066 yy::krat_exp_parser& parser,
00067 bool lex_trace,
00068 std::string& error) :
00069 from_(from),
00070 e_(e),
00071 parser_(parser),
00072 lex_trace_(lex_trace),
00073 close_weight_("}"),
00074 token_tab_(8),
00075 error_(error)
00076 {
00077
00078 const shared_series_rep_t& rep = e.structure().representation();
00079
00080 token_tab_[0] = rep->open_par;
00081 token_tab_[1] = rep->close_par;
00082 token_tab_[2] = rep->plus;
00083 token_tab_[3] = rep->times;
00084 token_tab_[4] = rep->star;
00085 token_tab_[5] = rep->zero;
00086 token_tab_[6] = rep->open_weight;
00087 close_weight_ = rep->close_weight;
00088 for (unsigned i = 0; i < rep->spaces.size(); i++)
00089 {
00090 token_tab_[7 + i] = rep->spaces[i];
00091 }
00092
00093 std::string::const_iterator sit;
00094 semiring_elt_t ww(e_.structure().semiring());
00095 sit = close_weight_.begin();
00096 if (parse_weight(ww, close_weight_, sit))
00097 error_ += "Warning : the token '" + close_weight_ +
00098 + "' is already defined as a weight.\n";
00099 sit = token_tab_[7].begin();
00100 if (parse_weight(ww, token_tab_[7], sit))
00101 error_ += "Warning : the token '" + token_tab_[7]
00102 + "' is already defined as a weight.\n";
00103 for (unsigned i = 0; i < token_tab_.size(); i++)
00104 {
00105 monoid_elt_t w(e_.structure().monoid());
00106 if (parse_word(w, token_tab_[i]))
00107 error_ += "Warning : the token '" + token_tab_[i]
00108 + "' is already defined as a word.\n";
00109 }
00110
00111 }
00112
00113 bool
00114 lex()
00115 {
00116 size_t curr = 0;
00117 size_t size = from_.size();
00118 size_t it = curr;
00119 while (it < size)
00120 {
00121 for (size_t i = 0; i < token_tab_.size(); i++)
00122 {
00123 if (!from_.compare(it, token_tab_[i].size(), token_tab_[i]))
00124 {
00125 if (curr != it)
00126 if (!insert_word(curr, it))
00127 return false;
00128 if (i == 6)
00129 {
00130 if (!insert_weight(it))
00131 return false;
00132 }
00133 else
00134 {
00135 if (i < 6)
00136 insert_token(i);
00137 it += token_tab_[i].size();
00138 }
00139 curr = it--;
00140 break;
00141 }
00142 }
00143 it++;
00144 }
00145 if (curr != it)
00146 if (!insert_word(curr, it))
00147 return false;
00148 return true;
00149 }
00150
00151 private:
00152 bool
00153 insert_word(size_t curr, size_t it)
00154 {
00155 monoid_elt_t w(e_.structure().monoid());
00156 std::string s = from_.substr(curr, it - curr);
00157 if (parse_word(w, s))
00158 {
00159 Element<S, T> ww = (w.value().empty() ?
00160 identity_as<T>::of(e_.structure()) :
00161 Element<S, T>(e_.structure(), w.value()));
00162
00163 krat_exp_proxy<S, T>* rexp = new krat_exp_proxy<S, T>(ww);
00164 parser_.insert_word(rexp);
00165 }
00166 else
00167 {
00168 error_ += "Lexer error : " + s
00169 + " some characters are not part of the alphabet\n";
00170 return false;
00171 }
00172 return true;
00173 }
00174
00175 bool
00176 insert_weight(size_t& it)
00177 {
00178 it += token_tab_[7].size();
00179 size_t bg = it;
00180 size_t size = from_.size();
00181 unsigned cpt = 1;
00182 for (; it < size; it++)
00183 {
00184 if (!from_.compare(it, token_tab_[7].size(), token_tab_[7]))
00185 cpt++;
00186 else
00187 if (!from_.compare(it, close_weight_.size(), close_weight_))
00188 {
00189 if (cpt == 1)
00190 {
00191 semiring_elt_t w(e_.structure().semiring());
00192 std::string s = from_.substr(bg, it - bg);
00193 std::string::const_iterator sit = s.begin();
00194 if (parse_weight(w, s, sit))
00195 {
00196 semiring_proxy<S, T>* sem = new semiring_proxy<S, T>(w);
00197 parser_.insert_weight(sem);
00198 }
00199 else
00200 {
00201 error_ += "Lexer error : " + s + " is not a weight\n";
00202 return false;
00203 }
00204 it += close_weight_.size();
00205 return true;
00206 }
00207 else
00208 cpt--;
00209 }
00210 }
00211 error_ += "Lexer error : Expected " + close_weight_
00212 + "instead of END\n";
00213 return false;
00214 }
00215
00216 void
00217 insert_token(int i)
00218 {
00219 if (i == 5)
00220 {
00221 Element<S, T> w = zero_as<T>::of(e_.structure());
00222 krat_exp_proxy<S, T>* rexp = new krat_exp_proxy<S, T>(w);
00223 parser_.insert_zero(rexp);
00224 }
00225 else
00226 {
00227 std::string* str = new std::string(token_tab_[i]);
00228 parser_.insert_token(i, str);
00229 }
00230 }
00231
00232 const std::string& from_;
00233 Element<S, T>& e_;
00234 yy::krat_exp_parser& parser_;
00235 bool lex_trace_;
00236 std::string close_weight_;
00237 std::vector<std::string> token_tab_;
00238 std::string& error_;
00239 };
00240
00241 template <class S, class T>
00242 std::pair<bool, std::string>
00243 parse(const std::string& from,
00244 Element<S, T>& exp,
00245 bool lex_trace = false,
00246 bool parse_trace = false)
00247 {
00248 parse_trace = parse_trace;
00249 std::string error;
00250 yy::krat_exp_parser parser;
00251 Lexer<S, T> lex(from, exp, parser, lex_trace, error);
00252 if (!lex.lex())
00253 return std::make_pair(true, error);
00254 krat_exp_proxy<S, T> rexp(exp);
00255 if (parser.parse(rexp, error))
00256 return std::make_pair(true, error);
00257 exp = rexp.self;
00258 return std::make_pair(false, error);
00259 }
00260
00261 }
00262
00263 }
00264
00265 #endif // ! VCSN_ALGEBRA_IMPLEMENTATION_SERIES_KRAT_EXP_PARSER_HXX