public RegExp(string regex) { RegExp regExp = String2Regex(new RegExp(), regex); Operator = regExp.Operator; Terminals = regExp.Terminals; Left = regExp.Left; Right = regExp.Right; }
public RegExp Dot(RegExp e2) { RegExp result = new RegExp(); result.Operator = OperatorEnum.Dot; result.Left = this; result.Right = e2; return(result); }
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); }
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); }