public override bool Parse(ItemFactory itemFactory, ITextProvider text, TokenStream tokens)
        {
            switch (tokens.CurrentToken.TokenType)
            {
            case CssTokenType.Identifier:
                if (TextRange.CompareDecoded(tokens.CurrentToken.Start, tokens.CurrentToken.Length, text, "from", true))
                {
                    SelectorType = KeyFrameSelectorType.From;
                    Name         = Children.AddCurrentAndAdvance(tokens, null);
                }
                else if (TextRange.CompareDecoded(tokens.CurrentToken.Start, tokens.CurrentToken.Length, text, "to", true))
                {
                    SelectorType = KeyFrameSelectorType.To;
                    Name         = Children.AddCurrentAndAdvance(tokens, null);
                }
                break;

            case CssTokenType.Number:
                // Must be a percentage:
                if (tokens.Peek(1).TokenType == CssTokenType.Units &&
                    TextRange.Compare(tokens.Peek(1).Start, tokens.Peek(1).Length, text, "%", ignoreCase: false))
                {
                    UnitValue uv = new UnitValue();

                    if (uv.Parse(itemFactory, text, tokens))
                    {
                        SelectorType = KeyFrameSelectorType.Percentage;
                        Children.Add(uv);
                    }
                }
                break;
            }

            if (tokens.CurrentToken.TokenType == CssTokenType.Comma && Children.Count > 0)
            {
                Comma = Children.AddCurrentAndAdvance(tokens, CssClassifierContextType.Punctuation);
            }

            return(Children.Count > 0);
        }