Beispiel #1
0
        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);
            }
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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));
        }