//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); }
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); }
//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); }