Skip to content
Snippets Groups Projects
Commit 96951612 authored by Tomáš Pecka's avatar Tomáš Pecka
Browse files

algo: fa2re StateElimination API correction

parent 8efa194a
No related branches found
No related tags found
No related merge requests found
...@@ -19,11 +19,20 @@ namespace conversions ...@@ -19,11 +19,20 @@ namespace conversions
namespace fa2re namespace fa2re
{ {
   
regexp::RegExp StateEliminationFormal::convert(const automaton::Automaton& automaton)
{
regexp::RegExp* out = NULL;
automaton.getData().Accept((void*) &out, StateEliminationFormal::STATE_ELIMINATION_FORMAL);
regexp::RegExp res = std::move(*out);
delete out;
return res;
}
template<class T> template<class T>
regexp::RegExp StateEliminationFormal::convert(const T& automaton) regexp::FormalRegExp StateEliminationFormal::convert(const T& automaton)
{ {
if(automaton.getFinalStates().size() == 0) if(automaton.getFinalStates().size() == 0)
return regexp::RegExp{regexp::FormalRegExp(regexp::FormalRegExpEmpty())}; return regexp::FormalRegExp(regexp::FormalRegExpEmpty());
   
// steps 1 + 2 // steps 1 + 2
automaton::ExtendedNFA extendedAutomaton = constructExtendedNFA(automaton); automaton::ExtendedNFA extendedAutomaton = constructExtendedNFA(automaton);
...@@ -46,21 +55,10 @@ regexp::RegExp StateEliminationFormal::convert(const T& automaton) ...@@ -46,21 +55,10 @@ regexp::RegExp StateEliminationFormal::convert(const T& automaton)
regexp::FormalRegExpIteration(std::move(*transition(extendedAutomaton, *extendedAutomaton.getFinalStates().begin(), *extendedAutomaton.getFinalStates().begin()))) regexp::FormalRegExpIteration(std::move(*transition(extendedAutomaton, *extendedAutomaton.getFinalStates().begin(), *extendedAutomaton.getFinalStates().begin())))
); );
//return regexp::RegExp{opt.optimize(regexp::FormalRegExp(concat))}; //return regexp::RegExp{opt.optimize(regexp::FormalRegExp(concat))};
return regexp::RegExp{regexp::FormalRegExp(concat)}; return regexp::FormalRegExp(concat);
}
template<>
regexp::RegExp StateEliminationFormal::convert(const automaton::Automaton& automaton)
{
regexp::RegExp* out = NULL;
automaton.getData().Accept((void*) &out, StateEliminationFormal::STATE_ELIMINATION_FORMAL);
regexp::RegExp res = std::move(*out);
delete out;
return res;
} }
   
   
void StateEliminationFormal::Visit(void*, const automaton::UnknownAutomaton&) const void StateEliminationFormal::Visit(void*, const automaton::UnknownAutomaton&) const
{ {
throw exception::AlibException("Unsupported automaton type UnknownAutomaton"); throw exception::AlibException("Unsupported automaton type UnknownAutomaton");
......
...@@ -34,8 +34,10 @@ public: ...@@ -34,8 +34,10 @@ public:
* Performs conversion. * Performs conversion.
* @return regular expression equivalent to source NFA. * @return regular expression equivalent to source NFA.
*/ */
static regexp::RegExp convert(const automaton::Automaton& automaton);
template<class T> template<class T>
static regexp::RegExp convert(const T& automaton); static regexp::FormalRegExp convert(const T& automaton);
   
private: private:
void Visit(void*, const automaton::UnknownAutomaton& automaton) const; void Visit(void*, const automaton::UnknownAutomaton& automaton) const;
......
...@@ -19,11 +19,20 @@ namespace conversions ...@@ -19,11 +19,20 @@ namespace conversions
namespace fa2re namespace fa2re
{ {
   
regexp::RegExp StateEliminationUnbounded::convert(const automaton::Automaton& automaton)
{
regexp::RegExp* out = NULL;
automaton.getData().Accept((void*) &out, StateEliminationUnbounded::STATE_ELIMINATION_UNBOUNDED);
regexp::RegExp res = std::move(*out);
delete out;
return res;
}
template<class T> template<class T>
regexp::RegExp StateEliminationUnbounded::convert(const T& automaton) regexp::UnboundedRegExp StateEliminationUnbounded::convert(const T& automaton)
{ {
if(automaton.getFinalStates().size() == 0) if(automaton.getFinalStates().size() == 0)
return regexp::RegExp{regexp::UnboundedRegExp(regexp::UnboundedRegExpEmpty())}; return regexp::UnboundedRegExp(regexp::UnboundedRegExpEmpty());
   
// steps 1 + 2 // steps 1 + 2
automaton::ExtendedNFA extendedAutomaton = constructExtendedNFA(automaton); automaton::ExtendedNFA extendedAutomaton = constructExtendedNFA(automaton);
...@@ -44,21 +53,10 @@ regexp::RegExp StateEliminationUnbounded::convert(const T& automaton) ...@@ -44,21 +53,10 @@ regexp::RegExp StateEliminationUnbounded::convert(const T& automaton)
regexp::UnboundedRegExpConcatenation concat; regexp::UnboundedRegExpConcatenation concat;
concat.appendElement(std::move(*transition(extendedAutomaton, *extendedAutomaton.getInitialStates().begin(), *extendedAutomaton.getFinalStates().begin()))); concat.appendElement(std::move(*transition(extendedAutomaton, *extendedAutomaton.getInitialStates().begin(), *extendedAutomaton.getFinalStates().begin())));
concat.appendElement(regexp::UnboundedRegExpIteration(std::move(*transition(extendedAutomaton, *extendedAutomaton.getFinalStates().begin(), *extendedAutomaton.getFinalStates().begin())))); concat.appendElement(regexp::UnboundedRegExpIteration(std::move(*transition(extendedAutomaton, *extendedAutomaton.getFinalStates().begin(), *extendedAutomaton.getFinalStates().begin()))));
return regexp::RegExp{opt.optimize(regexp::UnboundedRegExp(concat))}; return opt.optimize(regexp::UnboundedRegExp(concat));
}
template<>
regexp::RegExp StateEliminationUnbounded::convert(const automaton::Automaton& automaton)
{
regexp::RegExp* out = NULL;
automaton.getData().Accept((void*) &out, StateEliminationUnbounded::STATE_ELIMINATION_UNBOUNDED);
regexp::RegExp res = std::move(*out);
delete out;
return res;
} }
   
   
void StateEliminationUnbounded::Visit(void*, const automaton::UnknownAutomaton&) const void StateEliminationUnbounded::Visit(void*, const automaton::UnknownAutomaton&) const
{ {
throw exception::AlibException("Unsupported automaton type UnknownAutomaton"); throw exception::AlibException("Unsupported automaton type UnknownAutomaton");
......
...@@ -32,10 +32,13 @@ class StateEliminationUnbounded : public automaton::VisitableAutomatonBase::cons ...@@ -32,10 +32,13 @@ class StateEliminationUnbounded : public automaton::VisitableAutomatonBase::cons
public: public:
/** /**
* Performs conversion. * Performs conversion.
* @param automaton automaton to convert
* @return regular expression equivalent to source NFA. * @return regular expression equivalent to source NFA.
*/ */
static regexp::RegExp convert(const automaton::Automaton& automaton);
template<class T> template<class T>
static regexp::RegExp convert(const T& automaton); static regexp::UnboundedRegExp convert(const T& automaton);
   
private: private:
void Visit(void*, const automaton::UnknownAutomaton& automaton) const; void Visit(void*, const automaton::UnknownAutomaton& automaton) const;
......
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