Example #1
0
        public SyntaxToken Lex()
        {
            if (_position >= _text.Length)
            {
                return(new SyntaxToken(SyntaxKind.EndOfFileToken, _position, "\0", null));
            }

            if (IsDigit(Current))
            {
                int start = _position;

                while (IsDigit(Current))
                {
                    Next();
                }

                int    length = _position - start;
                string text   = _text.Substring(start, length);
                int.TryParse(text, out int value);
                return(new SyntaxToken(SyntaxKind.NumberToken, start, text, value));
            }
            if (char.IsWhiteSpace(Current))
            {
                int start = _position;

                while (char.IsWhiteSpace(Current))
                {
                    Next();
                }

                int    length = _position - start;
                string text   = _text.Substring(start, length);
                int.TryParse(text, out int value);
                return(new SyntaxToken(SyntaxKind.WhitespaceToken, start, text, value));
            }


            switch (Current)
            {
            case '+':
                Next();
                SyntaxKind plusToken = SyntaxKind.PlusToken;
                return(new SyntaxToken(plusToken, _position, plusToken.ToText(), plusToken.ToText()));

            case '-':
                Next();
                SyntaxKind minusToken = SyntaxKind.MinusToken;
                return(new SyntaxToken(minusToken, _position, minusToken.ToText(), minusToken.ToText()));


            case '*':
                Next();
                SyntaxKind starToken = SyntaxKind.StarToken;
                return(new SyntaxToken(starToken, _position, starToken.ToText(), starToken.ToText()));


            case '/':
                Next();
                SyntaxKind slashToken = SyntaxKind.SlashToken;
                return(new SyntaxToken(slashToken, _position, slashToken.ToText(), null));


            case '(':
                Next();
                SyntaxKind openParenthesisToken = SyntaxKind.SlashToken;
                return(new SyntaxToken(openParenthesisToken, _position, openParenthesisToken.ToText(), null));


            case ')':
                Next();
                SyntaxKind closeParenthesisToken = SyntaxKind.SlashToken;
                return(new SyntaxToken(closeParenthesisToken, _position, closeParenthesisToken.ToText(), null));


            default:
                Next();
                return(new SyntaxToken(SyntaxKind.BadToken, _position, _text.Substring(_position - 1, 1), null));
            }
        }