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

aepsilon and epsilonRemove algorithm api

parent e3f9dbc8
No related branches found
No related tags found
No related merge requests found
......@@ -9,7 +9,7 @@
#include <factory/DataFactory.hpp>
#include <exception/AlibException.h>
 
#include "epsilon/epsilonNfa/EpsilonNFAEpsilonRemover.h"
#include "epsilon/fsm/FSMEpsilonRemover.h"
 
int main(int argc, char** argv) {
int fileParameterIndex = -1;
......@@ -45,21 +45,9 @@ int main(int argc, char** argv) {
 
if(alib::FromXMLParsers::automatonParser.first(tokens)) {
std::string xmlMark = tokens.front( ).getData( );
if(xmlMark == "EpsilonNFA") {
automaton::EpsilonNFA automaton = alib::DataFactory::fromTokens<automaton::EpsilonNFA>(tokens);
automaton::NFA res = epsilon::EpsilonNFAEpsilonRemover::remove( automaton );
alib::DataFactory::toStdout(res);
} else if(xmlMark == "NFA") {
automaton::NFA automaton = alib::DataFactory::fromTokens<automaton::NFA>(tokens);
alib::DataFactory::toStdout(automaton);
} else if(xmlMark == "DFA") {
automaton::DFA automaton = alib::DataFactory::fromTokens<automaton::DFA>(tokens);
alib::DataFactory::toStdout(automaton);
} else {
automaton::EpsilonNFA automaton = alib::DataFactory::fromTokens<automaton::EpsilonNFA>(tokens);
automaton::NFA res = epsilon::EpsilonNFAEpsilonRemover::remove( automaton );
alib::DataFactory::toStdout(res);
}
automaton::Automaton automaton = alib::DataFactory::fromTokens<automaton::Automaton>(tokens);
automaton::Automaton res = epsilon::FSMEpsilonRemover::remove( automaton );
alib::DataFactory::toStdout(res);
} else {
throw exception::AlibException("Invalid argument expected Epsilon NFA.");
}
......
......@@ -17,7 +17,7 @@
 
namespace automaton {
 
class EpsilonClosure : public VisitableAutomatonBase::const_visitor_type {
class EpsilonClosure : public VisitableAutomatonBase::const_visitor_type {
public:
static std::set<automaton::State> epsilonClosure( const automaton::Automaton & automaton, const automaton::State & state );
 
......
/*
* EpsilonNFAEpsilonRemover.h
*
* Created on: 16. 1. 2014
* Author: Tomas Pecka
*/
#ifndef EPSILON_NFA_EPSILON_REMOVER_H_
#define EPSILON_NFA_EPSILON_REMOVER_H_
#include <map>
#include <algorithm>
#include <automaton/FSM/EpsilonNFA.h>
#include <automaton/FSM/NFA.h>
#include <exception/AlibException.h>
namespace epsilon {
class EpsilonNFAEpsilonRemover {
public:
static automaton::NFA remove(const automaton::EpsilonNFA &);
static automaton::NFA remove(const automaton::NFA &);
};
} /* namespace epsilon */
#endif /* EPSILON_NFA_EPSILON_REMOVER_H_ */
/*
* EpsilonNFAEpsilonRemover.cpp
* FSMEpsilonRemover.cpp
*
* Created on: 16. 1. 2014
* Author: Tomas Pecka
*/
 
#include "EpsilonNFAEpsilonRemover.h"
#include "FSMEpsilonRemover.h"
 
#include "../../automaton/EpsilonClosure.h"
 
namespace epsilon {
 
automaton::NFA EpsilonNFAEpsilonRemover::remove(const automaton::NFA& origFSM)
automaton::DFA FSMEpsilonRemover::remove(const automaton::DFA& origFSM)
{
return origFSM;
}
 
automaton::NFA EpsilonNFAEpsilonRemover::remove( const automaton::EpsilonNFA & origFSM ) {
automaton::NFA FSMEpsilonRemover::remove(const automaton::NFA& origFSM)
{
return origFSM;
}
automaton::NFA FSMEpsilonRemover::remove( const automaton::EpsilonNFA & origFSM ) {
automaton::NFA fsm;
 
for( const auto & state : origFSM.getStates() )
......@@ -59,4 +64,53 @@ automaton::NFA EpsilonNFAEpsilonRemover::remove( const automaton::EpsilonNFA & o
return fsm;
}
 
automaton::Automaton FSMEpsilonRemover::remove(const automaton::Automaton& automaton) {
automaton::Automaton* out = NULL;
automaton.getData().Accept((void*) &out, FSMEpsilonRemover::FSM_EPSILON_REMOVER);
automaton::Automaton res = std::move(*out);
delete out;
return res;
}
void FSMEpsilonRemover::Visit(void*, const automaton::UnknownAutomaton&) const {
throw exception::AlibException("Unsupported automaton type UnknownAutomaton");
}
void FSMEpsilonRemover::Visit(void* data, const automaton::EpsilonNFA& automaton) const {
automaton::Automaton* & out = *((automaton::Automaton**) data);
out = new automaton::Automaton(this->remove(automaton));
}
void FSMEpsilonRemover::Visit(void* data, const automaton::NFA& automaton) const {
automaton::Automaton* & out = *((automaton::Automaton**) data);
out = new automaton::Automaton(this->remove(automaton));
}
void FSMEpsilonRemover::Visit(void* data, const automaton::DFA& automaton) const {
automaton::Automaton* & out = *((automaton::Automaton**) data);
out = new automaton::Automaton(this->remove(automaton));
}
void FSMEpsilonRemover::Visit(void*, const automaton::ExtendedNFA& ) const {
throw exception::AlibException("Unsupported automaton type UnknownAutomaton");
}
void FSMEpsilonRemover::Visit(void*, const automaton::CompactNFA& ) const {
throw exception::AlibException("Unsupported automaton type UnknownAutomaton");
}
void FSMEpsilonRemover::Visit(void*, const automaton::NPDA&) const {
throw exception::AlibException("Unsupported automaton type UnknownAutomaton");
}
void FSMEpsilonRemover::Visit(void*, const automaton::SinglePopNPDA&) const {
throw exception::AlibException("Unsupported automaton type UnknownAutomaton");
}
void FSMEpsilonRemover::Visit(void*, const automaton::OneTapeDTM&) const {
throw exception::AlibException("Unsupported automaton type UnknownAutomaton");
}
const FSMEpsilonRemover FSMEpsilonRemover::FSM_EPSILON_REMOVER;
} /* namespace epsilon */
/*
* FSMEpsilonRemover.h
*
* Created on: 16. 1. 2014
* Author: Tomas Pecka
*/
#ifndef FMS_EPSILON_REMOVER_H_
#define FMS_EPSILON_REMOVER_H_
#include <map>
#include <algorithm>
#include <automaton/Automaton.h>
#include <automaton/FSM/EpsilonNFA.h>
#include <automaton/FSM/NFA.h>
#include <automaton/FSM/DFA.h>
#include <exception/AlibException.h>
namespace epsilon {
class FSMEpsilonRemover : public automaton::VisitableAutomatonBase::const_visitor_type {
public:
static automaton::Automaton remove( const automaton::Automaton & automaton );
/**
* Computes epsilon closure of a state in epsilon nonfree automaton
*/
static automaton::NFA remove( const automaton::EpsilonNFA & fsm );
static automaton::NFA remove( const automaton::NFA & fsm );
static automaton::DFA remove( const automaton::DFA & fsm );
private:
void Visit(void*, const automaton::UnknownAutomaton& automaton) const;
void Visit(void*, const automaton::EpsilonNFA& automaton) const;
void Visit(void*, const automaton::NFA& automaton) const;
void Visit(void*, const automaton::DFA& automaton) const;
void Visit(void*, const automaton::ExtendedNFA& automaton) const;
void Visit(void*, const automaton::CompactNFA& automaton) const;
void Visit(void*, const automaton::NPDA& automaton) const;
void Visit(void*, const automaton::SinglePopNPDA& automaton) const;
void Visit(void*, const automaton::OneTapeDTM& automaton) const;
static const FSMEpsilonRemover FSM_EPSILON_REMOVER;
};
} /* namespace epsilon */
#endif /* FMS_EPSILON_REMOVER_H_ */
......@@ -10,7 +10,7 @@
#include "generator/RandomAutomatonFactory.h"
#include "normalize/dfa/NormalizeDFA.h"
#include "trim/automaton/TrimFSM.h"
#include "epsilon/epsilonNfa/EpsilonNFAEpsilonRemover.h"
#include "epsilon/fsm/FSMEpsilonRemover.h"
#include "minimize/dfa/MinimizeDFA.h"
 
//#include "conversions/fa2re/StateElimination.h"
......@@ -57,7 +57,7 @@ automaton::NFA playTest::randomNFA(void) const
 
automaton::DFA playTest::mDFA(const automaton::NFA& automaton) const
{
automaton::NFA nfa = epsilon::EpsilonNFAEpsilonRemover::remove(automaton);
automaton::NFA nfa = epsilon::FSMEpsilonRemover::remove(automaton);
nfa = trim::TrimFSM::trim(nfa);
automaton::DFA dfa = determinize::NFADeterminizer::determinize(nfa);
dfa = trim::TrimFSM::trim(dfa);
......
......@@ -7,7 +7,7 @@
#include "conversions/fa2re/BrzozowskiAlgebraic.h"
#include "determinize/nfa/NFADeterminizer.h"
#include "minimize/dfa/MinimizeDFA.h"
#include "epsilon/epsilonNfa/EpsilonNFAEpsilonRemover.h"
#include "epsilon/fsm/FSMEpsilonRemover.h"
 
#include "regexp/unbounded/UnboundedRegExp.h"
#include "regexp/RegExpFromStringParser.h"
......@@ -37,8 +37,8 @@ void re2faTest::testThompson() {
re2fa::Thompson thompson2;
automaton::EpsilonNFA enfa2 = thompson2.convert(regexp2);
 
automaton::NFA nfa1 = epsilon::EpsilonNFAEpsilonRemover::remove(enfa1);
automaton::NFA nfa2 = epsilon::EpsilonNFAEpsilonRemover::remove(enfa2);
automaton::NFA nfa1 = epsilon::FSMEpsilonRemover::remove(enfa1);
automaton::NFA nfa2 = epsilon::FSMEpsilonRemover::remove(enfa2);
 
automaton::DFA dfa1 = determinize::NFADeterminizer::determinize(nfa1);
automaton::DFA dfa2 = determinize::NFADeterminizer::determinize(nfa2);
......
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