Esempio n. 1
0
        //DFA --> NDFA
        public static NDFA <T, S> ConvertToNDFA(DFA <T, S> dfa, S epsilon)
        {
            NDFA <T, S> ndfa = new NDFA <T, S>(dfa.Alphabet, epsilon);

            foreach (T fromState in dfa.GetStates())
            {
                Dictionary <S, T> states = dfa.GetStates(fromState);
                foreach (S key in states.Keys)
                {
                    ndfa.AddTransition(fromState, states[key], key);
                }
            }

            foreach (T endstate in dfa.EndStates)
            {
                ndfa.EndStates.Add(endstate);
            }
            ndfa.StartState = dfa.StartState;
            return(ndfa);
        }
Esempio n. 2
0
        private NDFA <T, S> Reverse(DFA <T, S> dfa)
        {
            NDFA <T, S> ndfa = new NDFA <T, S>(dfa.Alphabet, default(S));

            foreach (T transitionFromState in dfa.states.Keys)
            {
                foreach (S transitionSymbol in dfa.states[transitionFromState].Keys)
                {
                    if (transitionFromState.Equals(dfa.StartState))
                    {
                        ndfa.AddEndState(transitionFromState);
                    }

                    if (dfa.EndStates.Contains(transitionFromState))
                    {
                        ndfa.StartState = transitionFromState;
                    }
                    ndfa.AddTransition(dfa.states[transitionFromState][transitionSymbol], transitionFromState, transitionSymbol);
                }
            }
            return(ndfa);
        }
Esempio n. 3
0
        //Regram --> NDFA
        public static NDFA <T, S> ConvertToNDFA(Regram <T, S> regram, S epsilon)
        {
            NDFA <T, S> ndfa = new NDFA <T, S>(regram.Alphabet, epsilon);

            foreach (T fromState in regram.GetStates())
            {
                Dictionary <S, HashSet <T> > states = regram.GetStates(fromState);
                foreach (S key in states.Keys)
                {
                    foreach (T toState in states[key])
                    {
                        ndfa.AddTransition(fromState, toState, key);
                    }
                }
            }

            foreach (T endstate in regram.EndStates)
            {
                ndfa.EndStates.Add(endstate);
            }
            ndfa.StartState = regram.StartState;
            return(ndfa);
        }