public RegularExpressionTransformer(string regularExpression) { this.regularExpression = regularExpression; RegularExpressionPart regularExpressionPart = new RegularExpressionPart() { RegularExpression = regularExpression, RegularExpressionPosition = 0 }; }
public StateMachine Match(string regularExpression) { RegularExpressionPart regularExpressionPart = new RegularExpressionPart() { RegularExpression = regularExpression, RegularExpressionPosition = 0 }; StateMachine stateMaschine = new StateMachine(); var result = LoopMatch(regularExpressionPart, stateMaschine); return(stateMaschine); }
public StateMachine LoopMatch(RegularExpressionPart regularExpressionPart, StateMachine stateMaschine) { var length = regularExpressionPart.RegularExpression.ToArray().Length; State previousState = null; State jumpState = null; var minLength = 0; for (int i = 0; i < length; i++) { var actualIndex = i; var character = regularExpressionPart.RegularExpression.ToArray()[i]; if (character == LexerItems.QuestionMark) { previousState = stateMaschine.AddState(actualIndex, character.ToString(), previousState); minLength++; jumpState = null; } else if (character == LexerItems.Percent) { if (i == 0) { State tempPreviousState = previousState; previousState = stateMaschine.AddState(actualIndex, character.ToString(), previousState, true); } else { State tempPreviousState = previousState; previousState = stateMaschine.AddState(actualIndex, character.ToString(), previousState); } } //else if (character == LexerItems.QuestionMark) //{ // previousState = stateMaschine.AddState(actualIndex, character.ToString(), previousState); //} //else if (character == LexerItems.OpenBracket) //{ // State state = new State(actualIndex, character.ToString()); // bracketOperations.Push(state); // previousState = stateMaschine.AddState(state, previousState); //} //else if (character == LexerItems.CloseBracket) //{ // State state = new State(actualIndex, character.ToString()); // previousState = stateMaschine.AddState(state, previousState); // var tempState = bracketOperations.Pop(); // if (tempState.Value == LexerItems.Pipe.ToString()) // { // tempState.StatusTransitions_.Add(new StatusTransition(state)); // tempState = bracketOperations.Pop(); // if (tempState.Value != LexerItems.Pipe.ToString()) // { // jumpState = tempState; // } // } // else // { // jumpState = tempState; // } //} //else if (character == LexerItems.Pipe) //{ // State state = new State(actualIndex, character.ToString()); // State bracketOperation = bracketOperations.Peek(); // bracketOperations.Push(state); // previousState = stateMaschine.AddState(state, previousState); // var previewCharacter = regularExpressionPart.RegularExpression.ToArray()[i + 1]; // State nextCharacter = new State(actualIndex + 1, previewCharacter.ToString()); // bracketOperation.StatusTransitions_.Add(new StatusTransition(nextCharacter)); // if (nextCharacter.Value == LexerItems.OpenBracket.ToString()) // { // bracketOperations.Push(nextCharacter); // } // stateMaschine.ActualState = nextCharacter; // previousState = nextCharacter; // i++; // jumpState = null; // minLength = 0; //} else { previousState = stateMaschine.AddState(actualIndex, character.ToString(), previousState); minLength++; jumpState = null; } if (stateMaschine.MinLength < minLength) { stateMaschine.MinLength = minLength; } } previousState.IsPreviewEndeState = true; stateMaschine.AddState(length, "Ende", previousState); return(stateMaschine); }