20 template<
class STATE,
class INPUT,
class OUTPUT>
24 FA_base(
const std::set<STATE>& states,
const std::set<INPUT>& inputs, STATE start, STATE deflt);
27 typedef std::map<INPUT, OUTPUT> Transitions;
29 const std::set<STATE>& states()
const;
30 const std::set<INPUT>& inputs()
const;
31 const Transitions& transitions(STATE s)
const;
32 const STATE start()
const;
33 const OUTPUT deflt()
const;
34 const OUTPUT next(STATE from, INPUT input)
const;
36 void addState(STATE newState);
37 void addInput(INPUT newInput);
38 void setTransition(STATE from, INPUT input, OUTPUT to);
41 std::set<STATE> states_;
42 std::set<INPUT> inputs_;
43 std::map<STATE, Transitions> transitions_;
44 const Transitions noTransitions;
49 template<
class STATE,
class INPUT,
class OUTPUT>
55 template<
class STATE,
class INPUT,
class OUTPUT>
56 FA_base<STATE, INPUT, OUTPUT>::FA_base(
const std::set<STATE>& states,
const std::set<INPUT>& inputs, STATE start, STATE deflt) : states_(states), inputs_(inputs), transitions_(), noTransitions(), start_(start), default_(deflt)
58 if (states_.find(start) == states_.end())
59 states_.insert(start);
62 template<
class STATE,
class INPUT,
class OUTPUT>
63 const std::set<STATE>& FA_base<STATE, INPUT, OUTPUT>::states()
const
68 template<
class STATE,
class INPUT,
class OUTPUT>
69 const std::set<INPUT>& FA_base<STATE, INPUT, OUTPUT>::inputs()
const
74 template<
class STATE,
class INPUT,
class OUTPUT>
75 const STATE FA_base<STATE, INPUT, OUTPUT>::start()
const
80 template<
class STATE,
class INPUT,
class OUTPUT>
81 const OUTPUT FA_base<STATE, INPUT, OUTPUT>::deflt()
const
86 template<
class STATE,
class INPUT>
90 DFA(
const std::set<STATE>& states,
const std::set<INPUT>& inputs, STATE start, STATE deflt)
95 template<
class STATE,
class INPUT>
96 class NFA :
public FA_base<STATE, INPUT, std::set<STATE> > {
99 NFA(std::set<STATE>& states, std::set<INPUT>& inputs, STATE start, std::set<STATE> deflt)
102 void addTransition(STATE from, INPUT input, STATE to);
123 template<
class NSTATE,
class XXX>
127 std::map<std::set<STATE>, NSTATE> newStates;
129 std::set<STATE> startSet;
130 startSet.insert(
FA_base<STATE,INPUT,std::set<STATE> >::start_);
131 NSTATE nstart = createState(startSet);
132 newStates[startSet] = nstart;
134 NSTATE deflt = createState(
FA_base<STATE,INPUT,std::set<STATE> >::default_);
138 result->addState(deflt);
140 std::deque<std::set<STATE> > todo;
141 todo.push_back(startSet);
143 while (todo.size() > 0)
145 const std::set<STATE> from = todo.front();
147 std::map<INPUT,std::set<STATE> > ntrans;
149 typename std::set<STATE>::const_iterator s_it;
150 typename std::map<INPUT, std::set<STATE> >::iterator tr_it;
151 for (s_it=from.begin(); s_it != from.end(); ++s_it)
155 trans(
FA_base<STATE,INPUT,std::set<STATE> >::transitions_[*s_it]);
156 for (tr_it = trans.begin(); tr_it != trans.end(); ++tr_it)
158 ntrans[tr_it->first].insert(tr_it->second.begin(), tr_it->second.end());
162 const NSTATE nfrom = newStates[from];
163 for (tr_it = ntrans.begin(); tr_it != ntrans.end(); ++tr_it)
165 std::set<STATE> & state(tr_it->second);
168 if ( newStates.find(state) == newStates.end() ) {
169 nstate = createState(state);
170 result->addState(nstate);
171 newStates[state] = nstate;
173 todo.push_back(state);
176 nstate = newStates[state];
178 result->setTransition(nfrom, tr_it->first, nstate);
181 const std::set<INPUT>& inp(
FA_base<STATE, INPUT, std::set<STATE> >::inputs());
182 typename std::set<INPUT>::const_iterator i;
183 for (i=inp.begin(); i != inp.end(); ++i)
184 result->addInput(*i);
190 template<
class STATE,
class INPUT,
class OUTPUT>
196 template<
class STATE,
class INPUT,
class OUTPUT>
197 const typename FA_base<STATE,INPUT,OUTPUT>::Transitions& FA_base<STATE,INPUT,OUTPUT>::transitions(STATE s)
const
199 typename std::map<STATE, Transitions>::const_iterator tr = transitions_.find(s);
200 if (tr != transitions_.end())
203 return noTransitions;
206 template<
class STATE,
class INPUT,
class OUTPUT>
207 const OUTPUT FA_base<STATE,INPUT,OUTPUT>::next(STATE from, INPUT input)
const
209 const Transitions& tr(transitions(from));
210 typename Transitions::const_iterator it = tr.find(input);
211 return it==tr.end() ? default_ : it->second;
214 template<
class STATE,
class INPUT,
class OUTPUT>
215 void FA_base<STATE,INPUT,OUTPUT>::addState(STATE newState)
217 if (states_.find(newState) == states_.end())
218 states_.insert(newState);
222 template<
class STATE,
class INPUT,
class OUTPUT>
223 void FA_base<STATE,INPUT,OUTPUT>::addInput(INPUT newInput)
225 if (inputs_.find(newInput) == inputs_.end())
226 inputs_.insert(newInput);
230 template<
class STATE,
class INPUT,
class OUTPUT>
231 void FA_base<STATE,INPUT,OUTPUT>::setTransition(STATE from, INPUT input, OUTPUT to)
233 Transitions& trans(transitions_[from]);
238 template<
class STATE,
class INPUT>
239 void NFA<STATE, INPUT>::addTransition(STATE from, INPUT input, STATE to)
241 typename FA_base<STATE,INPUT,std::set<STATE> >::Transitions &
242 trans(FA_base<STATE,INPUT,std::set<STATE> >::transitions_[from]);
243 trans[input].insert(to);
Definition: automata.h:87
Definition: automata.h:96
Definition: automata.h:21
Definition: automata.h:18