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)); } }