private static void beginsWith(DfaGenerateValue param, ref Automaat <string> dfa) { char[] chars = param.Parameter.ToCharArray(); int stateCounter = 0; dfa.DefineAsStartState(stateCounter.ToString()); foreach (char c in chars) { dfa.AddTransition(new Transition <string>(stateCounter.ToString(), c, (stateCounter + 1).ToString())); stateCounter = dfa.States.Count - 1; } dfa.DefineAsFinalState(stateCounter.ToString()); foreach (char c in dfa.Symbols) { dfa.AddTransition(new Transition <string>(stateCounter.ToString(), c, stateCounter.ToString())); } //Hardcopy states SortedSet <string> ogStates = new SortedSet <string>(); foreach (string state in dfa.States) { ogStates.Add(state); } foreach (string state in ogStates) { List <Transition <string> > trans = dfa.GetTransition(state); SortedSet <char> routesPresent = new SortedSet <char>(); foreach (Transition <string> t in trans) { routesPresent.Add(t.Symbol); } foreach (char letter in dfa.Symbols) { if (!routesPresent.Contains(letter)) { dfa.AddTransition(new Transition <string>(state, letter, "F")); } } } if (dfa.States.Contains("F")) { foreach (char letter in dfa.Symbols) { dfa.AddTransition(new Transition <string>("F", letter, "F")); } } }
private static void contains(DfaGenerateValue param, ref Automaat <string> dfa) { char[] chars = param.Parameter.ToCharArray(); int stateCounter = 0; dfa.DefineAsStartState(stateCounter.ToString()); foreach (char c in chars) { dfa.AddTransition(new Transition <string>(stateCounter.ToString(), c, (stateCounter + 1).ToString())); stateCounter = dfa.States.Count - 1; } dfa.DefineAsFinalState(stateCounter.ToString()); //Hardcopy states List <string> ogStates = new List <string>(); foreach (string state in dfa.States) { ogStates.Add(state); } for (int i = 0; i < ogStates.Count; i++) { string state = ogStates[i]; List <Transition <string> > trans = dfa.GetTransition(state); SortedSet <char> routesPresent = new SortedSet <char>(); foreach (Transition <string> t in trans) { routesPresent.Add(t.Symbol); } foreach (char letter in dfa.Symbols) { if (!routesPresent.Contains(letter) && !dfa.FinalStates.Contains(state)) { int stateToReturnTo = backTrackForWorkingRoute(chars, letter); dfa.AddTransition(new Transition <string>(state, letter, ogStates[stateToReturnTo])); } } } foreach (char c in dfa.Symbols) { foreach (string finalstate in dfa.FinalStates) { dfa.AddTransition(new Transition <string>(stateCounter.ToString(), c, stateCounter.ToString())); } } }
public static Automaat <string> GenerateDfa(DfaGenerateValue param, char[] symbols) { Automaat <string> dfa = new Automaat <string>(symbols); if (param.Parameter == "") { return(null); } ///Check alphabet and parameter foreach (char c in param.Parameter.ToCharArray()) { if (!dfa.Symbols.Contains(c)) { return(null); } } switch (param.Type) { case GeneratorType.BeginsWith: beginsWith(param, ref dfa); break; case GeneratorType.Contains: contains(param, ref dfa); break; case GeneratorType.EndsWith: endsWith(param, ref dfa); break; } if (param.IsNot) { return(Not(dfa)); } else { return(dfa); } }