예제 #1
0
        private static void RecalculationList(string name, Surf.Set dependents, Surf.Set recalculationList)
        {
            if (recalculationList.Contains(name))
            {
                throw new System.Exception("Cycle detected.");
            }

            recalculationList.Add(name);

            if (dependents.IsDefined(name))
            {
                foreach (string dependent in (Surf.Set)dependents.Apply(name))
                {
                    RecalculationList(dependent, dependents, recalculationList);
                }
            }
        }
예제 #2
0
        private static Surf.Set EpsilonClosure(Surf.Set states, Surf.Set transitions, Surf.Set epsilonCache)
        {
            Surf.Tuple key = Tuple(states);
            if (epsilonCache.IsDefined(key))
            {
                return((Surf.Set)epsilonCache.Apply(key));
            }

            //System.Console.WriteLine("START EpsilonClosure     " + System.DateTime.Now.ToString());
            Surf.Set epsilonClosure = new Surf.Set();

            Stack <int> worklist = new Stack <int>();

            foreach (int state in states)
            {
                epsilonClosure.Add(state);
                worklist.Push(state);
            }

            while (worklist.Count > 0)
            {
                int state = worklist.Pop();

                foreach (Surf.Tuple transition in transitions)
                {
                    Surf.Tuple input = (Surf.Tuple)transition[0];

                    if (input.Count == 1 && (int)input[0] == state)
                    {
                        int toState = (int)transition[1];
                        if (!epsilonClosure.Contains(toState))
                        {
                            epsilonClosure.Add(toState);
                            worklist.Push(toState);
                        }
                    }
                }
            }

            epsilonCache.Add(new Surf.Tuple(new object[] { key, epsilonClosure }));
            //System.Console.WriteLine("END   EpsilonClosure     " + System.DateTime.Now.ToString());
            return(epsilonClosure);
        }
예제 #3
0
        public static FiniteAutomaton DFA(Bamboo.Parsing.FiniteAutomata.FiniteAutomaton nfa, Counter counter)
        {
            System.Console.WriteLine("START DFA     " + System.DateTime.Now.ToString());

            Surf.Set epsilonCache = new Surf.Set();
            Surf.Set moveCache    = new Surf.Set();

            Surf.Set nfa_transitions = Set(nfa.Transitions);

            Dictionary <string, int> nfa_transitions_lookup = new Dictionary <string, int>();

            foreach (Surf.Tuple transition in nfa_transitions)
            {
                Surf.Tuple input = (Surf.Tuple)transition[0];

                if (input.Count == 2)
                {
                    int  state = (int)input[0];
                    char ch    = (char)input[1];

                    nfa_transitions_lookup.Add("" + state + "::" + ch, (int)transition[1]);
                }
            }

            Surf.Set q0 = EpsilonClosure(new Surf.Set(new object[] { nfa.StartState }), nfa_transitions, epsilonCache);
            Surf.Set Q  = new Surf.Set();            // A set whose element are sets of states that are subsets of N.
            Q.Add(q0);
            Surf.Set         T        = new Surf.Set();
            Stack <Surf.Set> worklist = new Stack <Surf.Set>();

            worklist.Push(q0);

            while (worklist.Count > 0)
            {
                Surf.Set q = worklist.Pop();

                foreach (char character in nfa.Alphabet)
                {
                    Surf.Set t = EpsilonClosure(Move(q, character, nfa_transitions_lookup), nfa_transitions, epsilonCache);

                    if (t.Count > 0)
                    {
                        T.Add(new Surf.Tuple(new object[] { new Surf.Tuple(new object[] { q, character }), t }));

                        if (!Q.Contains(t))
                        {
                            Q.Add(t);
                            worklist.Push(t);
                        }
                    }
                }
            }



            Surf.Set states      = new Surf.Set();
            Surf.Set alphabet    = new Surf.Set();
            Surf.Set transitions = new Surf.Set();
            int      startState;

            Surf.Set finalStates = new Surf.Set();
            Surf.Set tokens      = new Surf.Set();

            Surf.Set D = new Surf.Set();
            foreach (Surf.Set q in Q)
            {
                D.Add(new Surf.Tuple(new object[] { q, counter.Next() }));
            }



            foreach (Surf.Set q in Q)
            {
                states.Add(D.Apply(q));
            }
            alphabet = new Surf.Set(nfa.Alphabet);
            foreach (Surf.Tuple t in T)
            {
                Surf.Tuple input     = (Surf.Tuple)t[0];
                int        fromState = (int)D.Apply(input[0]);
                char       character = (char)input[1];
                int        toState   = (int)D.Apply(t[1]);
                transitions.Add(new Surf.Tuple(new object[] { new Surf.Tuple(new object[] { fromState, character }), toState }));
            }
            startState = (int)states[0];
            foreach (int state in nfa.FinalStates)
            {
                foreach (Surf.Tuple d in D)
                {
                    Surf.Set q = (Surf.Set)d[0];
                    if (q.Contains(state))
                    {
                        finalStates.Add(d[1]);
                        foreach (int q_state in q)
                        {
                            string token = Lookup(nfa.Tokens, (int)q_state);
                            if (token.Length > 0)
                            {
                                tokens.Add(new Surf.Tuple(new object[] { d[1], token }));
                                break;
                            }
                        }
                    }
                }
            }

            System.Console.WriteLine("END   DFA     " + System.DateTime.Now.ToString());
            //foreach (Token token in nfa.Tokens)
            //{
            //    System.Console.WriteLine(token.Name + " " + token.Number);
            //}
            //System.Console.WriteLine();
            //Surf.Printer.Print(tokens, System.Console.Out);
            //System.Console.WriteLine();
            //System.Console.WriteLine();
            return(Minimize(Reorder(new FiniteAutomaton(states, alphabet, transitions, startState, finalStates, tokens))));
        }