コード例 #1
0
 public static void One(RegExp regExp, ref Automaat <string> automaat, ref int stateCounter, int leftState, int rightState)
 {
     char[] characters = regExp.Terminals.ToCharArray();
     if (characters.Length == 1)
     {
         automaat.AddTransition(
             new Transition <string>(leftState.ToString(), characters[0], rightState.ToString()));
     }
     else
     {
         automaat.AddTransition(
             new Transition <string>(leftState.ToString(), characters[0], stateCounter.ToString()));
         int i = 1;
         while (i < characters.Length - 1)
         {
             automaat.AddTransition(new Transition <string>(stateCounter.ToString(), characters[i],
                                                            (stateCounter + 1).ToString()));
             stateCounter++;
             i++;
         }
         automaat.AddTransition(
             new Transition <string>(stateCounter.ToString(), characters[i], rightState.ToString()));
         stateCounter++;
     }
 }
コード例 #2
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()));
                }
            }
        }
コード例 #3
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"));
                }
            }
        }
コード例 #4
0
        public static void Plus(RegExp regExp, ref Automaat <string> automaat, ref int stateCounter, int leftState, int rightState)
        {
            int stateTwo   = stateCounter;
            int stateThree = stateCounter + 1;

            stateCounter = stateCounter + 2;
            automaat.AddTransition(new Transition <string>(leftState.ToString(), '$', stateTwo.ToString()));
            automaat.AddTransition(new Transition <string>(stateThree.ToString(), '$', stateTwo.ToString()));
            automaat.AddTransition(new Transition <string>(stateThree.ToString(), '$', rightState.ToString()));
            Convert(regExp.Left, ref automaat, ref stateCounter, stateTwo, stateThree);
        }
コード例 #5
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);
                    }
                }
            }
        }
コード例 #6
0
        public static void Or(RegExp regExp, ref Automaat <string> automaat, ref int stateCounter, int leftState, int rightState)
        {
            int state2 = stateCounter;
            int state3 = stateCounter + 1;
            int state4 = stateCounter + 2;
            int state5 = stateCounter + 3;

            stateCounter = stateCounter + 4;
            automaat.AddTransition(new Transition <string>(leftState.ToString(), '$', state2.ToString()));
            automaat.AddTransition(new Transition <string>(leftState.ToString(), '$', state4.ToString()));
            automaat.AddTransition(new Transition <string>(state3.ToString(), '$', rightState.ToString()));
            automaat.AddTransition(new Transition <string>(state5.ToString(), '$', rightState.ToString()));
            Convert(regExp.Left, ref automaat, ref stateCounter, state2, state3);
            Convert(regExp.Right, ref automaat, ref stateCounter, state4, state5);
        }
コード例 #7
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);
        }
コード例 #8
0
        public static Automaat <string> Reverse(Automaat <string> automaat)
        {
            Automaat <string> reverseAutomaat = new Automaat <string>(automaat.Symbols);

            foreach (Transition <string> transition in automaat.Transitions)
            {
                reverseAutomaat.AddTransition(
                    new Transition <string>(transition.ToState, transition.Symbol, transition.FromState));
            }
            reverseAutomaat.StartStates = automaat.FinalStates;
            reverseAutomaat.FinalStates = automaat.StartStates;
            return(reverseAutomaat);
        }
コード例 #9
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));
        }
コード例 #10
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);
        }
コード例 #11
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);
        }
コード例 #12
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);
            }
        }