Пример #1
0
        public RegExp(string regex)
        {
            RegExp regExp = String2Regex(new RegExp(), regex);

            Operator  = regExp.Operator;
            Terminals = regExp.Terminals;
            Left      = regExp.Left;
            Right     = regExp.Right;
        }
Пример #2
0
        public RegExp Dot(RegExp e2)
        {
            RegExp result = new RegExp();

            result.Operator = OperatorEnum.Dot;
            result.Left     = this;
            result.Right    = e2;
            return(result);
        }
Пример #3
0
        public static void Execute(RegExp regExp)
        {
            // Convert regex to ndfa
            Console.WriteLine();
            Console.WriteLine("----- Converting regex to ndfa -----");
            Automaat <string> ndfa = ThompsonConstruction.ConvertRegExp(regExp);

            foreach (Transition <string> transition in ndfa.Transitions)
            {
                Console.WriteLine(transition.ToString());
            }
            Console.WriteLine("Printing image");
            GraphVizParser.PrintGraph(ndfa, "ndfa");
            Console.WriteLine("Image saved as ndfa.jpg");

            // Convert ndfa to dfa
            Console.WriteLine();
            Console.WriteLine("----- Converting ndfa to dfa -----");
            Automaat <string> dfa = NdfaToDfaConverter.Convert(ndfa);

            foreach (Transition <string> transition in dfa.Transitions)
            {
                Console.WriteLine(transition.ToString());
            }
            Console.WriteLine("Printing image");
            GraphVizParser.PrintGraph(dfa, "dfa");
            Console.WriteLine("Image saved as dfa.jpg");

            // Optimizing dfa Brzozowski
            Console.WriteLine();
            Console.WriteLine("----- Optimizing dfa: Brzozowski's algorithm -----");
            Automaat <string> brzozowskiDfa = NdfaToDfaConverter.OptimizeDfa(dfa);

            foreach (Transition <string> transition in brzozowskiDfa.Transitions)
            {
                Console.WriteLine(transition.ToString());
            }
            Console.WriteLine("Printing image");
            GraphVizParser.PrintGraph(brzozowskiDfa, "BrzozowskiDfa");
            Console.WriteLine("Image saved as BrzozowskiDfa.jpg");

            // Optimize dfa Hopcroft
            Console.WriteLine();
            Console.WriteLine("----- Optimizing dfa: Hopcroft's algorithm -----");
            Automaat <string> hopcroftDfa = HopcroftAlgorithm.MinimizeDfa(dfa);

            foreach (Transition <string> transition in hopcroftDfa.Transitions)
            {
                Console.WriteLine(transition.ToString());
            }
            Console.WriteLine("Printing image");
            GraphVizParser.PrintGraph(hopcroftDfa, "HopcroftDfa");
            Console.WriteLine("Image saved as HopcroftDfa.jpg");
        }
        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);
        }
        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);
        }
        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
 public RegExp String2Regex(RegExp regex, string stringToRegex)
 {
     for (int index = 0; index < stringToRegex.Length; index++)
     {
         char currentChar = stringToRegex[index];
         if (currentChar == '(')
         {
             int closingBracketPosition = -1;
             int bracketCount           = 0;
             for (int i = index + 1; i < stringToRegex.Length; i++)
             {
                 if (stringToRegex[i] == '(')
                 {
                     bracketCount++;
                 }
                 if (stringToRegex[i] == ')' && bracketCount == 0)
                 {
                     closingBracketPosition = i;
                     break;
                 }
                 if (stringToRegex[i] == ')' && bracketCount != 0)
                 {
                     bracketCount--;
                 }
             }
             string between = stringToRegex.Substring(index + 1, closingBracketPosition - 1 - index);
             RegExp regExp  = String2Regex(new RegExp(), between);
             if (closingBracketPosition + 1 < stringToRegex.Length)
             {
                 index       = closingBracketPosition + 1;
                 currentChar = stringToRegex[index];
                 if (currentChar == '+')
                 {
                     regExp = regExp.Plus();
                 }
                 else if (currentChar == '*')
                 {
                     regExp = regExp.Star();
                 }
             }
             if (regex.Terminals == "" && regex.Operator == RegExp.OperatorEnum.One)
             {
                 regex = regExp;
             }
             else
             {
                 regex = regex.Dot(regExp);
             }
         }
         else if (currentChar == '+')
         {
             regex = regex.Plus();
         }
         else if (currentChar == '*')
         {
             regex = regex.Star();
         }
         else if (currentChar == '|')
         {
             regex = regex.Or(new RegExp(stringToRegex[index + 1].ToString()));
             index++;
         }
         else
         {
             if (regex.Terminals == "" && regex.Operator == RegExp.OperatorEnum.One)
             {
                 regex.Terminals = currentChar.ToString();
             }
             else
             {
                 regex = regex.Dot(new RegExp(currentChar.ToString()));
             }
         }
     }
     return(regex);
 }