Esempio n. 1
0
        public static TElement Read <TElement>([NotNull] this ILexer <TElement> instance, [NotNull] ITextScanner scanner) where TElement : Element
        {
            if (instance == null)
            {
                throw new ArgumentNullException(nameof(instance));
            }
            if (scanner == null)
            {
                throw new ArgumentNullException(nameof(scanner));
            }
            var offset = scanner.Offset;

            scanner.StartRecording();
            TElement candidate = null;

            try
            {
                var context = scanner.GetContext();
                foreach (var element in instance.Read(scanner, context))
                {
                    if (candidate == null)
                    {
                        candidate = element;
                    }
                    else if (element.Text.Length > candidate.Text.Length)
                    {
                        candidate = element;
                    }
                }
                if (candidate == null)
                {
                    return(null);
                }
                scanner.Seek(offset + candidate.Text.Length);
            }
            finally
            {
                scanner.StopRecording();
            }
            return(candidate);
        }
Esempio n. 2
0
 public bool MoveNext()
 {
     if (!initialized)
     {
         start = scanner.Offset;
         scanner.StartRecording();
         inner       = lexer.ReadImpl(scanner, context).GetEnumerator();
         initialized = true;
     }
     if (scanner.Offset != context.Offset)
     {
         scanner.Seek(context.Offset);
     }
     if (!inner.MoveNext())
     {
         if (scanner.Offset != context.Offset)
         {
             scanner.Seek(context.Offset);
         }
         return(false);
     }
     Current = inner.Current;
     return(true);
 }