internal override IEnumerable <ParseStep> Parse(IRegexEngine engine) { yield return(ParseStep.BeginParse(this, engine.State)); var initialState = engine.State; var capture = engine.GetCaptures(Number).FirstOrDefault(); if (capture == null || string.IsNullOrEmpty(capture.Value)) { yield return(ParseStep.Fail(this, initialState, engine.State, "No backreference value found")); yield return(ParseStep.Break(this)); } else { var literals = capture.Value.Select((c, i) => new CharacterLiteral(c, _ignoreCase, capture.Index + i, new string(new[] { c }))); foreach (var literal in literals) { var success = false; foreach (var result in literal.Parse(engine)) { if (result.Type == ParseStepType.Break) { break; } if (result.Type == ParseStepType.Pass) { success = true; } } if (!success) { yield return(ParseStep.Fail(this, initialState, engine.State)); yield return(ParseStep.Break(this)); yield break; } } yield return(ParseStep.Pass(this, capture.Value, initialState, engine.State)); yield return(ParseStep.Break(this)); } }
internal override IEnumerable<ParseStep> Parse(IRegexEngine engine) { yield return ParseStep.BeginParse(this, engine.State); var initialState = engine.State; var capture = engine.GetCaptures(Number).FirstOrDefault(); if (capture == null || string.IsNullOrEmpty(capture.Value)) { yield return ParseStep.Fail(this, initialState, engine.State, "No backreference value found"); yield return ParseStep.Break(this); } else { var literals = capture.Value.Select((c, i) => new CharacterLiteral(c, _ignoreCase, capture.Index + i, new string(new[] { c }))); foreach (var literal in literals) { var success = false; foreach (var result in literal.Parse(engine)) { if (result.Type == ParseStepType.Break) { break; } if (result.Type == ParseStepType.Pass) { success = true; } } if (!success) { yield return ParseStep.Fail(this, initialState, engine.State); yield return ParseStep.Break(this); yield break; } } yield return ParseStep.Pass(this, capture.Value, initialState, engine.State); yield return ParseStep.Break(this); } }
protected override IEnumerable<ParseStep> GetSuccessParseStep(IRegexEngine engine, State initialState) { var matchedText = engine.Input.Substring(initialState.Index, engine.State.Index - initialState.Index); IList<IList<ParenCapture>> captureSet = new List<IList<ParenCapture>>(); foreach (CapturingParens capturingParen in Children.FindBy(node => node is CapturingParens)) { var captures = engine.GetCaptures(capturingParen.Number); captureSet.Add(new ReadOnlyCollection<ParenCapture>(captures.ToList())); engine.PopCapture(capturingParen.Number); } yield return ParseStep.Match(this, initialState, matchedText, new ReadOnlyCollection<IList<ParenCapture>>(captureSet)); if (initialState.Index == engine.State.Index) { // If we had a successful match, and the engine didn't move, we need to move it ourselves now. engine.State = engine.State.Advance(); yield return ParseStep.AdvanceIndex(this, engine.State); } yield return ParseStep.BeginParse(this, engine.State); }
protected override IEnumerable <ParseStep> GetSuccessParseStep(IRegexEngine engine, State initialState) { var matchedText = engine.Input.Substring(initialState.Index, engine.State.Index - initialState.Index); IList <IList <ParenCapture> > captureSet = new List <IList <ParenCapture> >(); foreach (CapturingParens capturingParen in Children.FindBy(node => node is CapturingParens)) { var captures = engine.GetCaptures(capturingParen.Number); captureSet.Add(new ReadOnlyCollection <ParenCapture>(captures.ToList())); engine.PopCapture(capturingParen.Number); } yield return(ParseStep.Match(this, initialState, matchedText, new ReadOnlyCollection <IList <ParenCapture> >(captureSet))); if (initialState.Index == engine.State.Index) { // If we had a successful match, and the engine didn't move, we need to move it ourselves now. engine.State = engine.State.Advance(); yield return(ParseStep.AdvanceIndex(this, engine.State)); } yield return(ParseStep.BeginParse(this, engine.State)); }