Ejemplo n.º 1
0
        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());
        }
Ejemplo n.º 2
0
        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());
        }
Ejemplo n.º 3
0
        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));
        }
Ejemplo n.º 4
0
        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));
        }
Ejemplo n.º 5
0
        /// <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);
        }
Ejemplo n.º 6
0
        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);
        }