Skip to content
Snippets Groups Projects
ToRegExpStateElimination.h 1.42 KiB
Newer Older
Tomáš Pecka's avatar
Tomáš Pecka committed
/*
 * ToRegExpStateElimination.h
Tomáš Pecka's avatar
Tomáš Pecka committed
 *
 *  Created on: 9. 2. 2014
Jan Trávníček's avatar
Jan Trávníček committed
 *	  Author: Tomas Pecka
#ifndef TO_REG_EXP_STATE_ELIMINATION_H_
#define TO_REG_EXP_STATE_ELIMINATION_H_
#include <core/multipleDispatch.hpp>
Tomáš Pecka's avatar
Tomáš Pecka committed
#include <regexp/RegExp.h>

#include <automaton/Automaton.h>
#include <automaton/FSM/DFA.h>
#include <automaton/FSM/NFA.h>
#include <automaton/FSM/MultiInitialStateNFA.h>
Tomáš Pecka's avatar
Tomáš Pecka committed
#include <automaton/FSM/EpsilonNFA.h>
#include <automaton/FSM/ExtendedNFA.h>

namespace automaton {
namespace convert {
Tomáš Pecka's avatar
Tomáš Pecka committed

/**
 * Converts FSM to RE using State Elimination algorithm.
 * Source: Melichar 2.118
 */
class ToRegExpStateElimination : public std::SingleDispatch<ToRegExpStateElimination, regexp::RegExp, const automaton::AutomatonBase &> {
Tomáš Pecka's avatar
Tomáš Pecka committed
public:
Jan Trávníček's avatar
Jan Trávníček committed
	/**
	 * Performs conversion.
	 * @param automaton automaton to convert
	 * @return regular expression equivalent to source NFA.
	 */
	static regexp::RegExp convert(const automaton::Automaton& automaton);
Jan Trávníček's avatar
Jan Trávníček committed
	template<class T>
	static regexp::RegExp convert(const T& automaton);
Tomáš Pecka's avatar
Tomáš Pecka committed

private:
Jan Trávníček's avatar
Jan Trávníček committed
	static void extendExtendedNFA(automaton::ExtendedNFA& automaton);
	static const regexp::RegExp transition(const automaton::ExtendedNFA& automaton, const label::Label& from, const label::Label& to);
	static automaton::ExtendedNFA eliminateState(const automaton::ExtendedNFA& extendedAutomaton, const label::Label& state);
} /* namespace convert */
} /* namespace automaton */
#endif /* TO_REG_EXP_STATE_ELIMINATION_H_ */