18 #ifndef VCSN_ALGEBRA_IMPLEMENTATION_SERIES_KRAT_EXP_PARSER_HXX
19 # define VCSN_ALGEBRA_IMPLEMENTATION_SERIES_KRAT_EXP_PARSER_HXX
24 # include <vaucanson/algebra/concept/monoid_base.hh>
25 # include <vaucanson/algebra/implementation/series/krat_exp_parser_private.hh>
32 template <
class S,
class T>
36 typedef typename Element<S, T>::monoid_elt_t monoid_elt_t;
37 typedef typename Element<S, T>::semiring_elt_t semiring_elt_t;
38 typedef typename Element<S, T>::set_t::shared_series_rep_t
41 Lexer(
const std::string& from,
43 vcsnyy::krat_exp_parser& parser,
49 lex_trace_(lex_trace),
56 const shared_series_rep_t& rep = e.structure().representation();
58 token_tab_[0] = rep->open_par;
59 token_tab_[1] = rep->close_par;
60 token_tab_[2] = rep->plus;
61 token_tab_[3] = rep->times;
62 token_tab_[4] = rep->star;
63 token_tab_[5] = rep->zero;
64 token_tab_[6] = rep->open_weight;
65 close_weight_ = rep->close_weight;
68 token_tab_.insert(token_tab_.end(), rep->spaces.begin(), rep->spaces.end());
70 std::string::const_iterator sit;
71 semiring_elt_t ww(e_.structure().semiring());
72 sit = close_weight_.begin();
74 error_ +=
"Warning : the token '" + close_weight_ +
75 +
"' is already defined as a weight.\n";
76 sit = token_tab_[7].begin();
78 error_ +=
"Warning : the token '" + token_tab_[7]
79 +
"' is already defined as a weight.\n";
80 for (
unsigned i = 0; i < token_tab_.size(); i++)
82 monoid_elt_t w(e_.structure().monoid());
84 error_ +=
"Warning : the token '" + token_tab_[i]
85 +
"' is already defined as a word.\n";
93 size_t size = from_.size();
98 monoid_elt_t w(e_.structure().monoid());
99 std::pair<bool, int> res =
parse_word(w, from_.substr(it));
106 assertion(it + res.second == size);
114 for (i = 0; i < token_tab_.size(); i++)
116 if (!from_.compare(it, token_tab_[i].size(), token_tab_[i]))
120 if (!insert_weight(it))
127 it += token_tab_[i].size();
132 if (i >= token_tab_.size())
134 error_ +=
"Lexer error, unrecognized characters: "
135 + from_.substr(it) +
"\n";
144 insert_word(monoid_elt_t& w)
146 Element<S, T> ww = (w.value().empty() ?
147 identity_as<T>::of(e_.structure()) :
148 Element<S, T>(e_.structure(), w.value()));
150 krat_exp_proxy<S, T>* rexp =
new krat_exp_proxy<S, T>(ww);
151 parser_.insert_word(rexp);
155 insert_weight(
size_t& it)
157 it += token_tab_[7].size();
159 size_t size = from_.size();
161 for (; it < size; it++)
163 if (!from_.compare(it, token_tab_[7].size(), token_tab_[7]))
166 if (!from_.compare(it, close_weight_.size(), close_weight_))
170 semiring_elt_t w(e_.structure().semiring());
171 std::string s = from_.substr(bg, it - bg);
172 std::string::const_iterator sit = s.begin();
175 semiring_proxy<S, T>* sem =
new semiring_proxy<S, T>(w);
176 parser_.insert_weight(sem);
180 error_ +=
"Lexer error : " + s +
" is not a weight\n";
183 it += close_weight_.size();
190 error_ +=
"Lexer error : Expected " + close_weight_
191 +
"instead of END\n";
200 Element<S, T> w = zero_as<T>::of(e_.structure());
201 krat_exp_proxy<S, T>* rexp =
new krat_exp_proxy<S, T>(w);
202 parser_.insert_zero(rexp);
206 std::string* str =
new std::string(token_tab_[i]);
207 parser_.insert_token(i, str);
211 const std::string& from_;
213 vcsnyy::krat_exp_parser& parser_;
215 std::string close_weight_;
216 std::vector<std::string> token_tab_;
220 template <
class S,
class T>
221 std::pair<bool, std::string>
223 bool lex_trace,
bool parse_trace)
225 parse_trace = parse_trace;
227 vcsnyy::krat_exp_parser parser;
228 Lexer<S, T> lex(from, exp, parser, lex_trace, error);
230 return std::make_pair(
true, error);
232 if (parser.parse(rexp, error))
233 return std::make_pair(
true, error);
235 return std::make_pair(
false, error);
242 #endif // ! VCSN_ALGEBRA_IMPLEMENTATION_SERIES_KRAT_EXP_PARSER_HXX