예제 #1
0
        private static void ConvertState(string currentState, ref Automaat <string> dfa, ref Automaat <string> ndfa)
        {
            //If this state is already completely processed, return to avoid stackoverflow exception
            if (dfa.GetTransition(currentState).Count == ndfa.Symbols.Count)
            {
                return;
            }

            //split given state for comparison
            string[] states = currentState.Split('_');

            //Loop through all symbols aka all the necessary routes
            foreach (char symbol in ndfa.Symbols)
            {
                //checks if this symbol already has a route in the new DFA
                if (CheckExistingRouteForChar(currentState, symbol, dfa))
                {
                    return;
                }

                int correctAmountOfRoutes = CheckAvailableRoutes(states, symbol, ndfa);

                //the TOSTATE of the to be added implementation
                string toState = "";
                if (correctAmountOfRoutes == 0)
                {
                    dfa.AddTransition(new Transition <string>(currentState, symbol, "F"));
                }
                else
                {
                    bool isFinalState = GenerateToState(ref toState, states, symbol, ndfa);

                    dfa.AddTransition(new Transition <string>(currentState, symbol, toState));

                    //Checks if currentState is should be final aswell (could be done better)
                    if (ndfa.FinalStates.Contains(currentState))
                    {
                        dfa.DefineAsFinalState(currentState);
                    }

                    if (isFinalState)
                    {
                        dfa.DefineAsFinalState(toState);
                    }

                    //checks if its not a loop to itself
                    if (currentState != toState)
                    {
                        ConvertState(toState, ref dfa, ref ndfa);
                    }
                }
            }
        }
예제 #2
0
        private static Automaat <string> RetrieveDfaFromPartitions(SortedSet <Partition> partitions,
                                                                   SortedSet <char> symbols)
        {
            Automaat <string> automaat = new Automaat <string>(symbols);

            foreach (Partition p in partitions)
            {
                if (p.IsFinal)
                {
                    automaat.DefineAsFinalState(p.Identifier.ToString());
                }
                if (p.IsStart)
                {
                    automaat.DefineAsStartState(p.Identifier.ToString());
                }
                foreach (KeyValuePair <string, Row> row in p.Rows)
                {
                    foreach (KeyValuePair <char, string> innerRow in row.Value.InnerRows)
                    {
                        string toState = "";
                        foreach (Partition p2 in partitions)
                        {
                            if (p2.ContainsState(innerRow.Value))
                            {
                                toState = p2.Identifier.ToString();
                                break;
                            }
                        }
                        automaat.AddTransition(new Transition <string>(p.Identifier.ToString(), innerRow.Key, toState));
                    }
                }
            }

            return(automaat);
        }
예제 #3
0
        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()));
                }
            }
        }
예제 #4
0
        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"));
                }
            }
        }
        public static Automaat <string> ConvertRegExp(RegExp regExp)
        {
            Automaat <string> automaat = new Automaat <string>();

            automaat.DefineAsStartState("0");
            automaat.DefineAsFinalState("1");
            int stateCounter = 2;

            Convert(regExp, ref automaat, ref stateCounter, 0, 1);
            automaat.Symbols = new SortedSet <char>(automaat.Transitions.Distinct().Select(e => e.Symbol).ToList());
            //Epsilon should not be in alphabet
            automaat.Symbols.Remove('$');
            return(automaat);
        }
예제 #6
0
        public static Automaat <string> Convert(Automaat <string> ndfa)
        {
            Automaat <string>  dfa = new Automaat <string>(ndfa.Symbols);
            string             combinedStartState = "";
            SortedSet <string> completeStartState = new SortedSet <string>();

            bool isFinalState = false;

            // Loop through all the available start states from the ndfa and create a list with them + their epsilon-linked states
            foreach (string startState in ndfa.StartStates)
            {
                RetrieveEpsilonIncludedState(startState, ndfa, ref completeStartState);
            }

            //Turn sortedset into a string with all its states
            foreach (string s in completeStartState)
            {
                combinedStartState += s + "_";
                if (ndfa.FinalStates.Contains(s))
                {
                    isFinalState = true;
                }
            }


            //trim last "_" off of string
            combinedStartState = combinedStartState.TrimEnd('_');
            //Start conversion
            ConvertState(combinedStartState, ref dfa, ref ndfa);
            // Define combinedStartState as one and only start state in dfa
            dfa.DefineAsStartState(combinedStartState);
            if (isFinalState)
            {
                dfa.DefineAsFinalState(combinedStartState);
            }

            // Add a symbol loop to the failstate if one is created during conversion.
            if (dfa.States.Contains("F"))
            {
                foreach (char route in dfa.Symbols)
                {
                    dfa.AddTransition(new Transition <string>("F", route, "F"));
                }
            }
            return(finaliseConversion(dfa));
        }
예제 #7
0
        public static Automaat <string> Not(Automaat <string> automaat)
        {
            Automaat <string> notAutomaat = new Automaat <string>(automaat.Symbols);

            //save way of copying transitions
            notAutomaat.StartStates = automaat.StartStates;
            foreach (Transition <string> t in automaat.Transitions)
            {
                notAutomaat.AddTransition(t);
            }

            foreach (string state in notAutomaat.States)
            {
                if (!automaat.FinalStates.Contains(state))
                {
                    notAutomaat.DefineAsFinalState(state);
                }
            }
            return(notAutomaat);
        }
예제 #8
0
        private static Automaat <string> finaliseMerge(Automaat <string> merged)
        {
            Automaat <string> finalisedMerge = new Automaat <string>(merged.Symbols);

            foreach (Transition <string> t in merged.Transitions)
            {
                finalisedMerge.AddTransition(new Transition <string>(t.FromState.Replace("_", String.Empty), t.Symbol, t.ToState.Replace("_", String.Empty)));
            }

            foreach (string startState in merged.StartStates)
            {
                finalisedMerge.DefineAsStartState(startState.Replace("_", String.Empty));
            }

            foreach (string finalState in merged.FinalStates)
            {
                finalisedMerge.DefineAsFinalState(finalState.Replace("_", String.Empty));
            }


            return(finalisedMerge);
        }
예제 #9
0
        private static void AddMergedState(Dictionary <char, string> prevMergedState, ref Automaat <string> merged, Automaat <string> dfaA, Automaat <string> dfaB, MergeType type)
        {
            // string[] states = prevMergedState.Split('_');
            // Add prev
            int    countFinal = 0;
            int    countStart = 0;
            string completePrevMergedState = "";

            foreach (KeyValuePair <char, string> entry in prevMergedState)
            {
                completePrevMergedState += entry.Value + "_";

                if (entry.Key == 'A')
                {
                    if (dfaA.FinalStates.Contains(entry.Value))
                    {
                        countFinal++;
                    }
                    if (dfaA.StartStates.Contains(entry.Value))
                    {
                        countStart++;
                    }
                }

                else if (entry.Key == 'B')
                {
                    if (dfaB.FinalStates.Contains(entry.Value))
                    {
                        countFinal++;
                    }
                    if (dfaB.StartStates.Contains(entry.Value))
                    {
                        countStart++;
                    }
                }
            }

            completePrevMergedState = completePrevMergedState.TrimEnd('_');

            if (type == MergeType.Union && countFinal == prevMergedState.Count)
            {
                merged.DefineAsFinalState(completePrevMergedState);
            }
            else if (type == MergeType.Concatenation && countFinal >= 1)
            {
                merged.DefineAsFinalState(completePrevMergedState);
            }

            if (type == MergeType.Union && countStart == prevMergedState.Count)
            {
                merged.DefineAsStartState(completePrevMergedState);
            }
            else if (type == MergeType.Concatenation && countStart >= 1)
            {
                merged.DefineAsStartState(completePrevMergedState);
            }


            if (merged.GetTransition(completePrevMergedState).Count == merged.Symbols.Count)
            {
                return;
            }

            foreach (char symbol in merged.Symbols)
            {
                Dictionary <char, string> newMergedState = new Dictionary <char, string>();
                // This could break though
                if (CheckExistingRouteForChar(completePrevMergedState, symbol, merged))
                {
                    return;
                }

                foreach (KeyValuePair <char, string> entry in prevMergedState)
                {
                    if (entry.Key == 'A')
                    {
                        CollectRoutesFromDfa(entry, symbol, dfaA, ref newMergedState);
                    }
                    else if (entry.Key == 'B')
                    {
                        CollectRoutesFromDfa(entry, symbol, dfaB, ref newMergedState);
                    }
                }

                string completeNewMergedState = "";
                foreach (KeyValuePair <char, string> entry in newMergedState)
                {
                    completeNewMergedState += entry.Value + "_";
                }
                completeNewMergedState = completeNewMergedState.TrimEnd('_');
                merged.AddTransition(new Transition <string>(completePrevMergedState, symbol, completeNewMergedState));


                AddMergedState(newMergedState, ref merged, dfaA, dfaB, type);
            }
        }