private void State_Start()
        {
            AdvanceOverWhitespace();

            if (IsAtEndOfInput)
            {
                _token = XamlTypeNameLexerToken.NONE;
            }
            else
            {
                switch (CurrentChar)
                {
                case '(':
                    _token = XamlTypeNameLexerToken.ROUND_BRACKET_OPEN;
                    break;

                case ')':
                    _token = XamlTypeNameLexerToken.ROUND_BRACKET_CLOSE;
                    break;

                case '[':
                    _token = XamlTypeNameLexerToken.SQUARE_BRACKET_OPEN;
                    break;

                case ']':
                    _token = XamlTypeNameLexerToken.SQUARE_BRACKET_CLOSE;
                    break;

                case ',':
                    _token = XamlTypeNameLexerToken.COMMA;
                    break;

                case ':':
                    _token = XamlTypeNameLexerToken.COLON;
                    break;

                default:
                    if (XamlParseUtils.IsValidNameStartChar(CurrentChar))
                    {
                        StartMultiCharToken();
                        _state = State.INNAME;
                    }
                    else
                    {
                        _token = XamlTypeNameLexerToken.ERROR;
                    }
                    break;
                }

                _lastChar = CurrentChar;
                Advance();
            }
        }
        private void State_InName()
        {
            if ((IsAtEndOfInput || XamlParseUtils.IsWhitespaceChar(CurrentChar)) || (CurrentChar == '['))
            {
                _token = XamlTypeNameLexerToken.NAME;
                _state = State.START;
            }
            else
            {
                switch (CurrentChar)
                {
                case '(':
                    _pushedBackSymbol = XamlTypeNameLexerToken.ROUND_BRACKET_OPEN;
                    _token            = XamlTypeNameLexerToken.NAME;
                    _state            = State.START;
                    break;

                case ')':
                    _pushedBackSymbol = XamlTypeNameLexerToken.ROUND_BRACKET_CLOSE;
                    _token            = XamlTypeNameLexerToken.NAME;
                    _state            = State.START;
                    break;

                case ',':
                    _pushedBackSymbol = XamlTypeNameLexerToken.COMMA;
                    _token            = XamlTypeNameLexerToken.NAME;
                    _state            = State.START;
                    break;

                case ':':
                    _pushedBackSymbol = XamlTypeNameLexerToken.COLON;
                    _token            = XamlTypeNameLexerToken.NAME;
                    _state            = State.START;
                    break;

                default:
                    if (XamlParseUtils.IsValidQualifiedNameChar(CurrentChar))
                    {
                        AddToMultiCharToken();
                    }
                    else
                    {
                        _token = XamlTypeNameLexerToken.ERROR;
                    }
                    break;
                }

                _lastChar = CurrentChar;
                Advance();
            }
        }
        internal void Read()
        {
            if (_pushedBackSymbol != XamlTypeNameLexerToken.NONE)
            {
                _token            = _pushedBackSymbol;
                _pushedBackSymbol = XamlTypeNameLexerToken.NONE;
            }
            else
            {
                _token     = XamlTypeNameLexerToken.NONE;
                _tokenText = string.Empty;
                _multiCharTokenStartIdx = -1;
                _multiCharTokenLength   = 0;

                while (_token == XamlTypeNameLexerToken.NONE)
                {
                    if (IsAtEndOfInput)
                    {
                        if (_state == State.INNAME)
                        {
                            _token = XamlTypeNameLexerToken.NAME;
                            _state = State.START;
                        }

                        break;
                    }

                    switch (_state)
                    {
                    case State.START:
                        State_Start();
                        break;

                    case State.INNAME:
                        State_InName();
                        break;
                    }
                }

                if (_multiCharTokenLength > 0)
                {
                    _tokenText = CollectMultiCharToken();
                }
            }
        }
 public XamlTypeNameLexer(string text)
 {
     _inputText        = text;
     _state            = State.START;
     _pushedBackSymbol = XamlTypeNameLexerToken.NONE;
 }