public static IEnumerable <ApplyIfToken> Analyse(string source) { var stringKeeper = new StringKeeper(source); while (!stringKeeper.IsEmpty) { if (stringKeeper.IsWhitespace) { stringKeeper = stringKeeper.Take(); continue; } StringKeeper newStringKeeper; ApplyIfToken token; if (TryTake(stringKeeper, Tokens, out newStringKeeper, out token) || TryTakeIdentifier(stringKeeper, out newStringKeeper, out token)) { stringKeeper = newStringKeeper; yield return(token); } else { var finish = new StringKeeper(stringKeeper); while (!finish.IsEmpty) { finish = finish.Take(); } yield return(new ApplyIfToken(ApplyIfTokenType.Error, finish.Difference(stringKeeper))); stringKeeper = finish; } } }