Skip to content
Snippets Groups Projects
ToRegExpStateElimination.h 1.52 KiB
Newer Older
  • Learn to ignore specific revisions
  • 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_
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    #include <common/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
     */
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    class ToRegExpStateElimination : public std::SingleDispatch<regexp::RegExp, 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);
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    	static const regexp::RegExp transition(const automaton::ExtendedNFA& automaton, const automaton::State& from, const automaton::State& to);
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    	static automaton::ExtendedNFA eliminateState(const automaton::ExtendedNFA& extendedAutomaton, const automaton::State& state);
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    public:
    	static ToRegExpStateElimination& getInstance() {
    		static ToRegExpStateElimination res;
    		return res;
    	}
    
    } /* namespace convert */
    
    } /* namespace automaton */
    
    #endif /* TO_REG_EXP_STATE_ELIMINATION_H_ */