Skip to content
Snippets Groups Projects
StateEliminationUnbounded.h 2.01 KiB
Newer Older
  • Learn to ignore specific revisions
  • Tomáš Pecka's avatar
    Tomáš Pecka committed
    /*
     * StateEliminationUnbounded.h
     *
     *  Created on: 9. 2. 2014
     *      Author: Tomas Pecka
     */
    
    #ifndef STATEELIMINATIONUNBOUNDED_H_
    #define STATEELIMINATIONUNBOUNDED_H_
    
    #include <regexp/RegExp.h>
    #include <regexp/unbounded/UnboundedRegExpElements.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 conversions
    {
    
    
    Tomáš Pecka's avatar
    Tomáš Pecka committed
    namespace fa2re
    {
    
    /**
     * Converts FSM to RE using State Elimination algorithm.
     * Source: Melichar 2.118
     */
    
    class StateEliminationUnbounded : public automaton::VisitableConstFSMBase
    
    Tomáš Pecka's avatar
    Tomáš Pecka committed
    {
    public:
        /**
         * Performs conversion.
    
         * @param automaton automaton to convert
    
    Tomáš Pecka's avatar
    Tomáš Pecka committed
         * @return regular expression equivalent to source NFA.
         */
    
        static regexp::RegExp convert(const automaton::Automaton& automaton);
    
    
    Tomáš Pecka's avatar
    Tomáš Pecka committed
        template<class T>
    
        static regexp::UnboundedRegExp convert(const T& automaton);
    
    Tomáš Pecka's avatar
    Tomáš Pecka committed
    
    private:
        void Visit(void*, const automaton::EpsilonNFA& automaton) const;
    
        void Visit(void*, const automaton::MultiInitialStateNFA& automaton) const;
    
    Tomáš Pecka's avatar
    Tomáš Pecka committed
        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;
    
        template<class T>
        static automaton::ExtendedNFA constructExtendedNFA(const T& automaton);
    
        static void extendExtendedNFA(automaton::ExtendedNFA& automaton);
    
        static const regexp::UnboundedRegExpElement* transition(const automaton::ExtendedNFA& automaton, const automaton::State& from, const automaton::State& to);
    
        static automaton::ExtendedNFA eliminateState(const automaton::ExtendedNFA& extendedAutomaton, const automaton::State& state);
    
    
    Tomáš Pecka's avatar
    Tomáš Pecka committed
        static const StateEliminationUnbounded STATE_ELIMINATION_UNBOUNDED;
    
    Tomáš Pecka's avatar
    Tomáš Pecka committed
    };
    
    } /* namespace fa2re */
    
    
    } /* namespace conversions */
    
    
    Tomáš Pecka's avatar
    Tomáš Pecka committed
    #endif /* STATEELIMINATIONUNBOUNDED_H_ */