Skip to content
Snippets Groups Projects
Commit 5536dd20 authored by Jan Trávníček's avatar Jan Trávníček
Browse files

fix iteration of automata

parent 94b7e87e
No related branches found
No related tags found
No related merge requests found
...@@ -15,20 +15,46 @@ automaton::Automaton AutomatonIteration::iteration(const automaton::Automaton& a ...@@ -15,20 +15,46 @@ automaton::Automaton AutomatonIteration::iteration(const automaton::Automaton& a
return dispatch(automaton.getData()); return dispatch(automaton.getData());
} }
   
template<class T> automaton::NFA < > AutomatonIteration::iteration(const automaton::DFA < > & automaton) {
automaton::NFA < > AutomatonIteration::iteration(const T& automaton) {
automaton::NFA < > res(automaton); automaton::NFA < > res(automaton);
   
for(const auto& qf : res.getFinalStates()) for(const auto& qf : res.getFinalStates())
for(const auto& t : res.getTransitionsToState(qf)) for(const auto& t : res.getTransitionsToState(qf))
res.addTransition(t.first.first, t.first.second, res.getInitialState()); res.addTransition(t.first.first, t.first.second, res.getInitialState());
   
res.addFinalState(automaton.getInitialState()); label::Label newInitialState = label::createUniqueLabel(automaton.getInitialState(), automaton.getStates());
res.addState(newInitialState);
res.setInitialState(newInitialState);
res.addFinalState(newInitialState);
for(const auto& t : automaton.getTransitionsFromState(automaton.getInitialState()))
res.addTransition(newInitialState, t.first.second, t.second);
return res;
}
auto AutomatonIterationDFA = AutomatonIteration::RegistratorWrapper < automaton::NFA < >, automaton::DFA < > > ( AutomatonIteration::iteration );
automaton::NFA < > AutomatonIteration::iteration(const automaton::NFA < > & automaton) {
automaton::NFA < > res(automaton);
for(const auto& qf : res.getFinalStates())
for(const auto& t : res.getTransitionsToState(qf))
res.addTransition(t.first.first, t.first.second, res.getInitialState());
label::Label newInitialState = label::createUniqueLabel(automaton.getInitialState(), automaton.getStates());
res.addState(newInitialState);
res.setInitialState(newInitialState);
res.addFinalState(newInitialState);
for(const auto& t : automaton.getTransitionsFromState(automaton.getInitialState()))
for (const label::Label & toState : t.second )
res.addTransition(newInitialState, t.first.second, toState);
return res; return res;
} }
   
auto AutomatonIterationDFA = AutomatonIteration::RegistratorWrapper<automaton::NFA < > , automaton::DFA<>>(AutomatonIteration::iteration); auto AutomatonIterationNFA = AutomatonIteration::RegistratorWrapper < automaton::NFA < >, automaton::NFA < > > (AutomatonIteration::iteration);
auto AutomatonIterationNFA = AutomatonIteration::RegistratorWrapper<automaton::NFA < > , automaton::NFA < > >(AutomatonIteration::iteration);
   
} /* namespace transform */ } /* namespace transform */
   
......
...@@ -24,8 +24,8 @@ class AutomatonIteration : public std::SingleDispatch<AutomatonIteration, automa ...@@ -24,8 +24,8 @@ class AutomatonIteration : public std::SingleDispatch<AutomatonIteration, automa
public: public:
static automaton::Automaton iteration(const automaton::Automaton& automaton); static automaton::Automaton iteration(const automaton::Automaton& automaton);
   
template<class T> static automaton::NFA < > iteration(const automaton::DFA < > & automaton);
static automaton::NFA < > iteration(const T& automaton); static automaton::NFA < > iteration(const automaton::NFA < > & automaton);
}; };
   
} /* namespace transform */ } /* namespace transform */
......
...@@ -22,7 +22,12 @@ automaton::EpsilonNFA < > AutomatonIterationEpsilonTransition::iteration(const T ...@@ -22,7 +22,12 @@ automaton::EpsilonNFA < > AutomatonIterationEpsilonTransition::iteration(const T
for(const auto&q : automaton.getFinalStates()) for(const auto&q : automaton.getFinalStates())
res.addTransition(q, automaton.getInitialState()); res.addTransition(q, automaton.getInitialState());
   
res.addFinalState(automaton.getInitialState()); label::Label newInitialState = label::createUniqueLabel(automaton.getInitialState(), automaton.getStates());
res.addState(newInitialState);
res.setInitialState(newInitialState);
res.addFinalState(newInitialState);
res.addTransition(newInitialState, automaton.getInitialState());
return res; return res;
} }
   
......
...@@ -25,27 +25,34 @@ void AutomatonIterationTest::tearDown() { ...@@ -25,27 +25,34 @@ void AutomatonIterationTest::tearDown() {
void AutomatonIterationTest::testAutomatonIteration() { void AutomatonIterationTest::testAutomatonIteration() {
   
// Melichar 2.83 // Melichar 2.83
label::Label q0 = label::labelFrom(0);
label::Label q1 = label::labelFrom(1); label::Label q1 = label::labelFrom(1);
label::Label q2 = label::labelFrom(2); label::Label q2 = label::labelFrom(2);
label::Label q3 = label::labelFrom(3); label::Label q3 = label::labelFrom(3);
alphabet::Symbol a(alphabet::symbolFrom('a')), b(alphabet::symbolFrom('b')); alphabet::Symbol a = alphabet::symbolFrom('a');
alphabet::Symbol b = alphabet::symbolFrom('b');
   
automaton::DFA<> m1(q1); automaton::DFA < > m1(q1);
m1.setStates({q1, q2, q3}); m1.setStates({q1, q2, q3});
m1.addFinalState(q3); m1.addFinalState(q3);
m1.setInputAlphabet({a, b}); m1.setInputAlphabet({a, b});
m1.addTransition(q1, a, q2); m1.addTransition(q1, a, q2);
m1.addTransition(q2, b, q2); m1.addTransition(q2, b, q2);
m1.addTransition(q2, a, q3); m1.addTransition(q2, a, q3);
m1.addTransition(q3, a, q1);
   
automaton::NFA < > res(q1); automaton::EpsilonNFA < > res(q0);
res.setStates({q1, q2, q3}); res.setStates({q0, q1, q2, q3});
res.setInputAlphabet({a, b}); res.setInputAlphabet({a, b});
res.setFinalStates({q1, q3}); res.setFinalStates({q0, q3});
res.addTransition(q1, a, q2); res.addTransition(q1, a, q2);
res.addTransition(q2, b, q2); res.addTransition(q2, b, q2);
res.addTransition(q2, a, q3); res.addTransition(q2, a, q3);
res.addTransition(q2, a, q1); res.addTransition(q3, a, q1);
res.addTransition(q0, q1);
res.addTransition(q3, q1);
   
automaton::Automaton i2 = automaton::transform::AutomatonIterationEpsilonTransition::iteration(automaton::Automaton(m1)); automaton::Automaton i2 = automaton::transform::AutomatonIterationEpsilonTransition::iteration(automaton::Automaton(m1));
automaton::Automaton i1 = automaton::transform::AutomatonIteration::iteration(automaton::Automaton(m1)); automaton::Automaton i1 = automaton::transform::AutomatonIteration::iteration(automaton::Automaton(m1));
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment