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); }
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); }