private static void LoadFile(string fileName) { Console.WriteLine("Loading from file: {0}", fileName); if (!System.IO.File.Exists(fileName)) { Console.WriteLine("No such file!"); } var eNfa = AutomataBuilder.FromFile(fileName); Console.WriteLine("Loaded."); Console.WriteLine("=== NFA Primitive Infomation ==="); Console.WriteLine(eNfa.About()); Console.WriteLine("Epsilon Closures: "); foreach (var state in eNfa.States) { var eclosure = eNfa.GetEpsilonClosureOf(state); Console.WriteLine("{0}: {{{1}}}", state, string.Join(',', eclosure)); } Console.WriteLine("\nConverted.\n"); Console.WriteLine("=== DFA Infomation ==="); var dfa = AutomataConverter.EpsilonNfaToDFA(eNfa); Console.WriteLine(dfa.About()); }
private static void Example3() { var eNfa = new AutomataBuilder() .SetStates(new string[] { "p", "q", "r" }) .SetInputSymbols(new char[] { '0', '1', '$' }) .SetTransitionFunction(new string[] { "f(p,0)=p", "f(p,1)={p,q}", "f(q,0)=r", "f(q,1)=r", }) .SetInitialState("p") .SetFinalState("r") .Build(); Console.WriteLine("=== NFA Primitive Infomation ==="); Console.WriteLine(eNfa.About()); Console.WriteLine("Epsilon Closures: "); foreach (var state in eNfa.States) { var eclosure = eNfa.GetEpsilonClosureOf(state); Console.WriteLine("{0}: {{{1}}}", state, string.Join(',', eclosure)); } Console.WriteLine("\nConverted.\n"); Console.WriteLine("=== DFA Infomation ==="); var dfa = AutomataConverter.EpsilonNfaToDFA(eNfa); Console.WriteLine(dfa.About()); }
private static void Example2() { var nfa = new AutomataBuilder() .SetStates(new string[] { "q0", "q1", "q2" }) .SetInputSymbols(new char[] { 'a', 'b', '$' }) .SetTransitionFunction(new string[] { "f(q0,a)=q1", "f(q0,$)=q1", "f(q1,a)=q0", "f(q1,b)=q1", "f(q1,a)=q2", "f(q1,b)=q2", "f(q2,a)=q2", "f(q2,b)=q1", "f(q2,b)=q1", }) .SetInitialState("q0") .SetFinalState("q1") .Build(); Console.WriteLine("=== NFA Primitive Infomation ==="); Console.WriteLine(nfa.About()); Console.WriteLine("Epsilon Closures: "); foreach (var state in nfa.States) { var eclosure = nfa.GetEpsilonClosureOf(state); Console.WriteLine("{0}: {{{1}}}", state, string.Join(',', eclosure)); } var transitionFunctions = new HashSet <TransitionFunction>(); foreach (var state in nfa.States) { var eclosure = nfa.GetEpsilonClosureOf(state); foreach (var eclosureState in eclosure) { var acceptableInputs = nfa.GetAcceptableInputOf(eclosureState, true); foreach (var input in acceptableInputs) { var func = (new TransitionFunction(eclosure, input, nfa.GetNextStatesOf(eclosure, input))); transitionFunctions.Add(func); } } } Console.WriteLine("New transition functions:"); Console.WriteLine(string.Join("\n", transitionFunctions)); }
private static void Example1() { var nfa = new AutomataBuilder() .SetStates(new string[] { "A", "B", "C", "D", "E" }) .SetInputSymbols(new char[] { '0', '1', '$' }) .SetTransitionFunction(new string[] { "f(A,0)=B", "f(A,$)=C", "f(B,$)=D", "f(C,$)=D", "f(C,1)=E", "f(D,0)=D", "f(D,1)=E", }) .SetInitialState("A") .SetFinalState("E") .Build(); Console.WriteLine("=== NFA Primitive Infomation ==="); Console.WriteLine(nfa.About()); Console.WriteLine("Epsilon Closures: "); foreach (var state in nfa.States) { var eclosure = nfa.GetEpsilonClosureOf(state); Console.WriteLine("{0}: {{{1}}}", state, string.Join(',', eclosure)); } var transitionFunctions = new SortedSet <TransitionFunction>(); foreach (var state in nfa.States) { var eclosure = nfa.GetEpsilonClosureOf(state); foreach (var eclosureState in eclosure) { var acceptableInputs = nfa.GetAcceptableInputOf(eclosureState, true); foreach (var input in acceptableInputs) { var func = (new TransitionFunction(eclosure, input, nfa.GetNextStatesOf(eclosure, input))); transitionFunctions.Add(func); } } } Console.WriteLine("New transition functions:"); Console.WriteLine(string.Join("\n", transitionFunctions)); }
/// <summary> /// 将 NFA(可带空转) 转换为 DFA /// </summary> /// <param name="eNfa">NFA</param> /// <returns></returns> public static Automata EpsilonNfaToDFA(Automata eNfa) { // 首先将 eNFA 转换为 NFA var nfaTransitionFunctions = RemoveEpsilonTransitions(eNfa); Debug.WriteLine("New transition functions:"); Debug.WriteLine(string.Join("\n", nfaTransitionFunctions)); var dfa = new AutomataBuilder() .SetInputSymbols(eNfa.InputSymbols.ToArray()) .Build(); // 获取初始转移函数 var initalTransitionFunction = TransitionFunction.GetInitalTransitionFunction(nfaTransitionFunctions, eNfa.InitialState); if (0 == initalTransitionFunction.Count) { throw new Exception("Initial transition function not found!"); } var dfaTransitionFunctions = NfaToDfaTransitionFunctions(nfaTransitionFunctions, dfa.InputSymbols, initalTransitionFunction); var stateMap = TransitionFunction.MergeStates(dfaTransitionFunctions); dfa.States = new SortedSet <State>(); foreach (var kv in stateMap) { dfa.States.Add(new State(kv.Value.Name, kv.Key)); } SortedSet <State> finalStates = GetFinialStates(eNfa, dfa); dfa.FinalStates = finalStates; dfa.InitialState = stateMap[eNfa.InitialState.Name]; var mergedFunctions = TransitionFunction.MergeFunctions(dfaTransitionFunctions, stateMap); dfa.TransitionFunctions = mergedFunctions; Debug.WriteLine("DFA transition functions:"); Debug.WriteLine(string.Join("\n", dfaTransitionFunctions)); return(dfa); }
public static Automata FromString(string input) { string pattern = @".*NFA(.*)where(.*)and(.*)by(.*)"; RegexOptions options = RegexOptions.Singleline; Match m = Regex.Match(input, pattern, options); // Console.WriteLine("'{0}' found at index {1}", m.Value, m.Index); // Group 2: where ... and var g2 = m.Groups[2]; var raw1 = g2.Value.Replace(" ", "").Replace("\t", "").Replace("\r", "").Replace("{", "").Replace("}", ""); var lines1 = raw1.Split('\n'); var dict = new Dictionary <string, string>(); foreach (var line in lines1) { if (line.Trim().Length == 0) { continue; } var kv = line.Split("="); if (kv.Length != 2) { throw new Exception("Invalid line: " + line); } var k = kv[0].ToLower().Trim(); dict.Add(k, kv[1]); } foreach (var key in new string[] { "q", "t", "q0", "f" }) { if (!dict.ContainsKey(key)) { throw new Exception("Missing automata argument: " + key); } } // Group 4: by ... var g4 = m.Groups[4]; var raw2 = g4.Value.Replace(" ", "").Replace("\t", "").Replace("\r", "").Replace("{", "").Replace("}", ""); var lines2 = raw2.Split('\n'); var exps = new List <string>(); foreach (var line in lines2) { if (line.Trim().Length == 0) { continue; } exps.Add(line.Trim()); } // build var builder = new AutomataBuilder(); var automata = builder .SetStates(dict["q"]) .SetInputSymbols(dict["t"]) .SetInitialState(dict["q0"]) .SetFinalState(dict["f"]) .SetTransitionFunction(exps.ToArray()) .Build(); return(automata); }