Skip to content
Snippets Groups Projects
StateElimination.h 1.83 KiB
Newer Older
Tomáš Pecka's avatar
Tomáš Pecka committed
/*
Jan Trávníček's avatar
Jan Trávníček committed
 * StateElimination.h
Tomáš Pecka's avatar
Tomáš Pecka committed
 *
 *  Created on: 9. 2. 2014
 *      Author: Tomas Pecka
 */

Jan Trávníček's avatar
Jan Trávníček committed
#ifndef STATEELIMINATION_H_
#define STATEELIMINATION_H_
Tomáš Pecka's avatar
Tomáš Pecka committed

#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
 */
Jan Trávníček's avatar
Jan Trávníček committed
class StateElimination : 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>
Jan Trávníček's avatar
Jan Trávníček committed
    static regexp::RegExp 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;

    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);
Tomáš Pecka's avatar
Tomáš Pecka committed

    static automaton::ExtendedNFA eliminateState(const automaton::ExtendedNFA& extendedAutomaton, const automaton::State& state);

Jan Trávníček's avatar
Jan Trávníček committed
    static const StateElimination STATE_ELIMINATION;
Tomáš Pecka's avatar
Tomáš Pecka committed
};

} /* namespace fa2re */

} /* namespace conversions */

Jan Trávníček's avatar
Jan Trávníček committed
#endif /* STATEELIMINATION_H_ */