示例#1
0
        private void ReadIdentifierOrKeyword()
        {
            while (char.IsLetter(Current))
            {
                _position++;
            }

            var length = _position - _start;
            var text   = _text.ToString(_start, length);

            _kind = SyntaxRules.GetKeywordKind(text);
        }
示例#2
0
        public SyntaxToken Lex()
        {
            _start = _position;
            _kind  = SyntaxKind.BadToken;
            _value = null;

            // <operator> + - / ( )
            switch (Current)
            {
            case '+':
            {
                _kind = SyntaxKind.PlusToken;
                _position++;
                break;
            }

            case '-':
            {
                _kind = SyntaxKind.MinusToken;
                _position++;
                break;
            }

            case '*':
            {
                _kind = SyntaxKind.StarToken;
                _position++;
                break;
            }

            case '/':
            {
                _kind = SyntaxKind.ForwardSlashToken;
                _position++;
                break;
            }

            case '(':
            {
                _kind = SyntaxKind.OpenParenToken;
                _position++;
                break;
            }

            case ')':
            {
                _kind = SyntaxKind.CloseParenToken;
                _position++;
                break;
            }

            case '{':
            {
                _kind = SyntaxKind.OpenBraceToken;
                _position++;
                break;
            }

            case '}':
            {
                _kind = SyntaxKind.CloseBraceToken;
                _position++;
                break;
            }

            case '&':
            {
                if (Lookahead == '&')
                {
                    _kind      = SyntaxKind.AmpersandAmpersandToken;
                    _position += 2;
                }
                break;
            }

            case '|':
            {
                if (Lookahead == '|')
                {
                    _kind      = SyntaxKind.PipePipeToken;
                    _position += 2;
                }
                break;
            }

            case '=':
            {
                _position++;
                if (Current != '=')
                {
                    _kind = SyntaxKind.EqualToken;
                }
                else
                {
                    _kind = SyntaxKind.EqualEqualToken;
                    _position++;
                }
                break;
            }

            case '!':
            {
                _position++;
                if (Current != '=')
                {
                    _kind = SyntaxKind.BangToken;
                }
                else
                {
                    _kind = SyntaxKind.BangEqualToken;
                    _position++;
                }
                break;
            }

            case '0':
            case '1':
            case '2':
            case '3':
            case '4':
            case '5':
            case '6':
            case '7':
            case '8':
            case '9':
            {
                ReadNumberToken();
                break;
            }

            case ' ':
            case '\t':
            case '\n':
            case '\r':
            {
                ReadWhiteSpaceToken();
                break;
            }

            case '\0':
            {
                _kind = SyntaxKind.EOFToken;
                break;
            }

            default:
            {
                if (char.IsLetter(Current))
                {
                    ReadIdentifierOrKeyword();
                }
                // <whitespace>
                else if (char.IsWhiteSpace(Current))
                {
                    ReadWhiteSpaceToken();
                }
                else
                {
                    _diagnostics.ReportBadCharacter(_position, Current);
                    _position++;
                }
                break;
            }
            }

            var length = _position - _start;
            var text   = SyntaxRules.GetText(_kind);

            if (text == null)
            {
                text = _text.ToString(_start, length);
            }
            return(new SyntaxToken(_kind, _start, text, _value));
        }