Ejemplo n.º 1
0
        public override IEnumerable <OutputRecord> Execute(ParseEngine engine)
        {
            var current = Enclosure.Execute(engine);

            if (engine.IsFailure(current))
            {
                return(current);
            }

            Func <IEnumerable <OutputRecord> > predicate = () =>
            {
                var mark   = engine.Mark();
                var result = Enclosure.Execute(engine);
                engine.Reset(mark);
                return(result);
            };

            engine.AddInterceptor(predicate);
            try
            {
                var operandResult = Operand.Execute(engine);
                if (engine.IsFailure(operandResult))
                {
                    return(operandResult);
                }

                current = current.Concat(operandResult);
            }
            finally
            {
                engine.RemoveInterceptor(predicate);
            }

            var closeResult = Enclosure.Execute(engine);

            if (engine.IsFailure(closeResult))
            {
                return(closeResult);
            }

            return(current.Concat(closeResult));
        }