Пример #1
0
        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;
                }
            }
        }