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

make EpsilonNFA templated

parent 26653f0f
No related branches found
No related tags found
No related merge requests found
...@@ -32,7 +32,7 @@ public: ...@@ -32,7 +32,7 @@ public:
/** /**
* Computes epsilon closure of a state in epsilon nonfree automaton * Computes epsilon closure of a state in epsilon nonfree automaton
*/ */
static automaton::MultiInitialStateNFA < > remove( const automaton::EpsilonNFA & fsm ); static automaton::MultiInitialStateNFA < > remove( const automaton::EpsilonNFA < > & fsm );
static automaton::MultiInitialStateNFA < > remove( const automaton::MultiInitialStateNFA < > & fsm ); static automaton::MultiInitialStateNFA < > remove( const automaton::MultiInitialStateNFA < > & fsm );
static automaton::NFA < > remove( const automaton::NFA < > & fsm ); static automaton::NFA < > remove( const automaton::NFA < > & fsm );
static automaton::DFA<> remove( const automaton::DFA<> & fsm ); static automaton::DFA<> remove( const automaton::DFA<> & fsm );
......
...@@ -31,7 +31,7 @@ T Trim::trim( const T & fsm ) { ...@@ -31,7 +31,7 @@ T Trim::trim( const T & fsm ) {
auto TrimDFA = Trim::RegistratorWrapper<automaton::DFA<>, automaton::DFA<>>(Trim::trim); auto TrimDFA = Trim::RegistratorWrapper<automaton::DFA<>, automaton::DFA<>>(Trim::trim);
auto TrimNFA = Trim::RegistratorWrapper<automaton::NFA < > , automaton::NFA < > >(Trim::trim); auto TrimNFA = Trim::RegistratorWrapper<automaton::NFA < > , automaton::NFA < > >(Trim::trim);
auto TrimMultiInitialStateNFA = Trim::RegistratorWrapper<automaton::MultiInitialStateNFA < >, automaton::MultiInitialStateNFA < >>(Trim::trim); auto TrimMultiInitialStateNFA = Trim::RegistratorWrapper<automaton::MultiInitialStateNFA < >, automaton::MultiInitialStateNFA < >>(Trim::trim);
auto TrimEpsilonNFA = Trim::RegistratorWrapper<automaton::EpsilonNFA, automaton::EpsilonNFA>(Trim::trim); auto TrimEpsilonNFA = Trim::RegistratorWrapper<automaton::EpsilonNFA < >, automaton::EpsilonNFA < > >(Trim::trim);
auto TrimCompactNFA = Trim::RegistratorWrapper<automaton::CompactNFA < >, automaton::CompactNFA < > >(Trim::trim); auto TrimCompactNFA = Trim::RegistratorWrapper<automaton::CompactNFA < >, automaton::CompactNFA < > >(Trim::trim);
auto TrimExtendedNFA = Trim::RegistratorWrapper<automaton::ExtendedNFA, automaton::ExtendedNFA>(Trim::trim); auto TrimExtendedNFA = Trim::RegistratorWrapper<automaton::ExtendedNFA, automaton::ExtendedNFA>(Trim::trim);
   
......
...@@ -51,7 +51,7 @@ T UnreachableStatesRemover::remove( const T & fsm ) { ...@@ -51,7 +51,7 @@ T UnreachableStatesRemover::remove( const T & fsm ) {
return M; return M;
} }
   
auto UnreachableStatesRemoverEpsilonNFA = UnreachableStatesRemover::RegistratorWrapper<automaton::EpsilonNFA, automaton::EpsilonNFA>(UnreachableStatesRemover::remove); auto UnreachableStatesRemoverEpsilonNFA = UnreachableStatesRemover::RegistratorWrapper<automaton::EpsilonNFA < >, automaton::EpsilonNFA < > >(UnreachableStatesRemover::remove);
auto UnreachableStatesRemoverNFA = UnreachableStatesRemover::RegistratorWrapper<automaton::NFA < > , automaton::NFA < > >(UnreachableStatesRemover::remove); auto UnreachableStatesRemoverNFA = UnreachableStatesRemover::RegistratorWrapper<automaton::NFA < > , automaton::NFA < > >(UnreachableStatesRemover::remove);
auto UnreachableStatesRemoverCompactNFA = UnreachableStatesRemover::RegistratorWrapper<automaton::CompactNFA < >, automaton::CompactNFA < > >(UnreachableStatesRemover::remove); auto UnreachableStatesRemoverCompactNFA = UnreachableStatesRemover::RegistratorWrapper<automaton::CompactNFA < >, automaton::CompactNFA < > >(UnreachableStatesRemover::remove);
auto UnreachableStatesRemoverExtendedNFA = UnreachableStatesRemover::RegistratorWrapper<automaton::ExtendedNFA, automaton::ExtendedNFA>(UnreachableStatesRemover::remove); auto UnreachableStatesRemoverExtendedNFA = UnreachableStatesRemover::RegistratorWrapper<automaton::ExtendedNFA, automaton::ExtendedNFA>(UnreachableStatesRemover::remove);
......
...@@ -53,7 +53,7 @@ T UselessStatesRemover::remove( const T & fsm ) { ...@@ -53,7 +53,7 @@ T UselessStatesRemover::remove( const T & fsm ) {
return M; return M;
} }
   
auto UselessStatesRemoverEpsilonNFA = UselessStatesRemover::RegistratorWrapper<automaton::EpsilonNFA, automaton::EpsilonNFA>(UselessStatesRemover::remove); auto UselessStatesRemoverEpsilonNFA = UselessStatesRemover::RegistratorWrapper<automaton::EpsilonNFA < >, automaton::EpsilonNFA < > >(UselessStatesRemover::remove);
auto UselessStatesRemoverNFA = UselessStatesRemover::RegistratorWrapper<automaton::NFA < > , automaton::NFA < > >(UselessStatesRemover::remove); auto UselessStatesRemoverNFA = UselessStatesRemover::RegistratorWrapper<automaton::NFA < > , automaton::NFA < > >(UselessStatesRemover::remove);
auto UselessStatesRemoverCompactNFA = UselessStatesRemover::RegistratorWrapper<automaton::CompactNFA < >, automaton::CompactNFA < > >(UselessStatesRemover::remove); auto UselessStatesRemoverCompactNFA = UselessStatesRemover::RegistratorWrapper<automaton::CompactNFA < >, automaton::CompactNFA < > >(UselessStatesRemover::remove);
auto UselessStatesRemoverExtendedNFA = UselessStatesRemover::RegistratorWrapper<automaton::ExtendedNFA, automaton::ExtendedNFA>(UselessStatesRemover::remove); auto UselessStatesRemoverExtendedNFA = UselessStatesRemover::RegistratorWrapper<automaton::ExtendedNFA, automaton::ExtendedNFA>(UselessStatesRemover::remove);
......
...@@ -45,7 +45,7 @@ Automaton AutomatonFromStringParser::parseAutomaton(std::istream& input, const s ...@@ -45,7 +45,7 @@ Automaton AutomatonFromStringParser::parseAutomaton(std::istream& input, const s
} }
} }
   
EpsilonNFA AutomatonFromStringParser::parseEpsilonNFA(std::istream& input) const { EpsilonNFA < > AutomatonFromStringParser::parseEpsilonNFA(std::istream& input) const {
AutomatonFromStringLexer::Token token = m_AutomatonLexer.next(input); AutomatonFromStringLexer::Token token = m_AutomatonLexer.next(input);
if(token.type != AutomatonFromStringLexer::TokenType::EPSILON_NFA) { if(token.type != AutomatonFromStringLexer::TokenType::EPSILON_NFA) {
throw exception::CommonException("Unrecognised ENFA token."); throw exception::CommonException("Unrecognised ENFA token.");
...@@ -88,7 +88,7 @@ EpsilonNFA AutomatonFromStringParser::parseEpsilonNFA(std::istream& input) const ...@@ -88,7 +88,7 @@ EpsilonNFA AutomatonFromStringParser::parseEpsilonNFA(std::istream& input) const
   
if(initialState == NULL) throw exception::CommonException("No initial state recognised."); if(initialState == NULL) throw exception::CommonException("No initial state recognised.");
   
EpsilonNFA res(*initialState); EpsilonNFA < > res(*initialState);
delete initialState; delete initialState;
   
for(const std::variant<string::Epsilon, alphabet::Symbol> inputSymbol : symbols) { for(const std::variant<string::Epsilon, alphabet::Symbol> inputSymbol : symbols) {
......
...@@ -46,7 +46,7 @@ private: ...@@ -46,7 +46,7 @@ private:
Automaton parseAutomaton(std::istream& input) const; Automaton parseAutomaton(std::istream& input) const;
Automaton parseAutomaton(std::istream& input, const std::set<FEATURES>& features) const; Automaton parseAutomaton(std::istream& input, const std::set<FEATURES>& features) const;
   
EpsilonNFA parseEpsilonNFA(std::istream& input) const; EpsilonNFA<> parseEpsilonNFA(std::istream& input) const;
NFA<> parseNFA(std::istream& input) const; NFA<> parseNFA(std::istream& input) const;
MultiInitialStateNFA<> parseMultiInitialStateNFA(std::istream& input) const; MultiInitialStateNFA<> parseMultiInitialStateNFA(std::istream& input) const;
DFA<> parseDFA(std::istream& input) const; DFA<> parseDFA(std::istream& input) const;
......
...@@ -66,7 +66,7 @@ void AutomatonToStringComposer::composeTransitionsFromState(std::ostream& out, c ...@@ -66,7 +66,7 @@ void AutomatonToStringComposer::composeTransitionsFromState(std::ostream& out, c
} }
} }
   
void AutomatonToStringComposer::composeTransitionsFromState(std::ostream& out, const EpsilonNFA& automaton, const label::Label& from) { void AutomatonToStringComposer::composeTransitionsFromState(std::ostream& out, const EpsilonNFA < > & automaton, const label::Label& from) {
std::map<std::pair<label::Label, alphabet::Symbol>, std::set<label::Label> > symbolTransitionsFromState = automaton.getSymbolTransitionsFromState(from); std::map<std::pair<label::Label, alphabet::Symbol>, std::set<label::Label> > symbolTransitionsFromState = automaton.getSymbolTransitionsFromState(from);
   
for(const alphabet::Symbol& inputSymbol : automaton.getInputAlphabet()) { for(const alphabet::Symbol& inputSymbol : automaton.getInputAlphabet()) {
...@@ -174,7 +174,7 @@ void AutomatonToStringComposer::compose(std::ostream& out, const MultiInitialSta ...@@ -174,7 +174,7 @@ void AutomatonToStringComposer::compose(std::ostream& out, const MultiInitialSta
   
AutomatonToStringComposer::RegistratorWrapper<void, MultiInitialStateNFA < > > AutomatonToStringComposerMultiInitialStateNFA = AutomatonToStringComposer::RegistratorWrapper<void, MultiInitialStateNFA < > >(AutomatonToStringComposer::compose); AutomatonToStringComposer::RegistratorWrapper<void, MultiInitialStateNFA < > > AutomatonToStringComposerMultiInitialStateNFA = AutomatonToStringComposer::RegistratorWrapper<void, MultiInitialStateNFA < > >(AutomatonToStringComposer::compose);
   
void AutomatonToStringComposer::compose(std::ostream& out, const EpsilonNFA& automaton) { void AutomatonToStringComposer::compose(std::ostream& out, const EpsilonNFA < > & automaton) {
out << "ENFA"; out << "ENFA";
for(const auto& symbol : automaton.getInputAlphabet()) { for(const auto& symbol : automaton.getInputAlphabet()) {
out << " "; out << " ";
...@@ -199,7 +199,7 @@ void AutomatonToStringComposer::compose(std::ostream& out, const EpsilonNFA& aut ...@@ -199,7 +199,7 @@ void AutomatonToStringComposer::compose(std::ostream& out, const EpsilonNFA& aut
} }
} }
   
AutomatonToStringComposer::RegistratorWrapper<void, EpsilonNFA> AutomatonToStringComposerEpsilonNFA = AutomatonToStringComposer::RegistratorWrapper<void, EpsilonNFA>(AutomatonToStringComposer::compose); AutomatonToStringComposer::RegistratorWrapper<void, EpsilonNFA < > > AutomatonToStringComposerEpsilonNFA = AutomatonToStringComposer::RegistratorWrapper<void, EpsilonNFA < > >(AutomatonToStringComposer::compose);
   
void AutomatonToStringComposer::compose(std::ostream& output, const Automaton& automaton) { void AutomatonToStringComposer::compose(std::ostream& output, const Automaton& automaton) {
dispatch(output, automaton.getData()); dispatch(output, automaton.getData());
......
...@@ -20,7 +20,7 @@ class AutomatonToStringComposer : public std::SingleDispatchFirstStaticParam<Aut ...@@ -20,7 +20,7 @@ class AutomatonToStringComposer : public std::SingleDispatchFirstStaticParam<Aut
static void composeTransitionsFromState(std::ostream& out, const DFA < > & automaton, const label::Label& from); static void composeTransitionsFromState(std::ostream& out, const DFA < > & automaton, const label::Label& from);
static void composeTransitionsFromState(std::ostream& out, const NFA < > & automaton, const label::Label& from); static void composeTransitionsFromState(std::ostream& out, const NFA < > & automaton, const label::Label& from);
static void composeTransitionsFromState(std::ostream& out, const MultiInitialStateNFA < > & automaton, const label::Label& from); static void composeTransitionsFromState(std::ostream& out, const MultiInitialStateNFA < > & automaton, const label::Label& from);
static void composeTransitionsFromState(std::ostream& out, const EpsilonNFA& automaton, const label::Label& from); static void composeTransitionsFromState(std::ostream& out, const EpsilonNFA < > & automaton, const label::Label& from);
   
public: public:
/** /**
...@@ -33,7 +33,7 @@ public: ...@@ -33,7 +33,7 @@ public:
static void compose(std::ostream& output, const DFA < > & automaton); static void compose(std::ostream& output, const DFA < > & automaton);
static void compose(std::ostream& output, const NFA < > & automaton); static void compose(std::ostream& output, const NFA < > & automaton);
static void compose(std::ostream& output, const MultiInitialStateNFA < > & automaton); static void compose(std::ostream& output, const MultiInitialStateNFA < > & automaton);
static void compose(std::ostream& output, const EpsilonNFA& automaton); static void compose(std::ostream& output, const EpsilonNFA < > & automaton);
}; };
   
} /* namespace automaton */ } /* namespace automaton */
......
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