internal static bool TryParse(string sql, int position, char expected, SqlKind kind, out RawToken token) { if (sql.TryElementAt(position, out var c) && c == expected) { token = RawToken.SingleChar(kind, position); return(true); } token = default; return(false); }
public static ImmutableArray <RawToken> Tokens(string sql) { if (string.IsNullOrEmpty(sql)) { return(ImmutableArray <RawToken> .Empty); } var tokens = new List <RawToken>(); var position = 0; while (position < sql.Length) { TokenParser.SkipWhitespace(sql, ref position); if (TokenParser.TryParseNumber(sql, position, out var token) || TokenParser.TryParseString(sql, position, out token) || TokenParser.TryParseComment(sql, position, out token) || TokenParser.TryParseIdentifier(sql, position, out token) || TokenParser.TryParse(sql, position, "<>", SqlKind.NotEqualsToken, out token) || TokenParser.TryParse(sql, position, "<=", SqlKind.LessThanEqualsToken, out token) || TokenParser.TryParse(sql, position, ">=", SqlKind.GreaterThanEqualsToken, out token) || TokenParser.TryParse(sql, position, "|/", SqlKind.SquareRootToken, out token) || TokenParser.TryParse(sql, position, "||/", SqlKind.CubeRootToken, out token) || TokenParser.TryParse(sql, position, "!!", SqlKind.ExclamationExclamationToken, out token) || TokenParser.TryParse(sql, position, "<<", SqlKind.LessThanLessThanToken, out token) || TokenParser.TryParse(sql, position, ">>", SqlKind.GreaterThanGreaterThanToken, out token) || TokenParser.TryParse(sql, position, '+', SqlKind.PlusToken, out token) || TokenParser.TryParse(sql, position, '-', SqlKind.MinusToken, out token) || TokenParser.TryParse(sql, position, '*', SqlKind.AsteriskToken, out token) || TokenParser.TryParse(sql, position, '/', SqlKind.SlashToken, out token) || TokenParser.TryParse(sql, position, '^', SqlKind.ExponentToken, out token) || TokenParser.TryParse(sql, position, '%', SqlKind.PercentToken, out token) || TokenParser.TryParse(sql, position, '@', SqlKind.AtToken, out token) || TokenParser.TryParse(sql, position, '!', SqlKind.ExclamationToken, out token) || TokenParser.TryParse(sql, position, '&', SqlKind.AmpersandToken, out token) || TokenParser.TryParse(sql, position, '|', SqlKind.BarToken, out token) || TokenParser.TryParse(sql, position, '#', SqlKind.HashToken, out token) || TokenParser.TryParse(sql, position, '~', SqlKind.TildeToken, out token) || TokenParser.TryParse(sql, position, '=', SqlKind.EqualsToken, out token) || TokenParser.TryParse(sql, position, '<', SqlKind.LessThanEqualsToken, out token) || TokenParser.TryParse(sql, position, '>', SqlKind.GreaterThanToken, out token) || TokenParser.TryParse(sql, position, '(', SqlKind.OpenParenToken, out token) || TokenParser.TryParse(sql, position, ')', SqlKind.CloseParenToken, out token) || TokenParser.TryParse(sql, position, '[', SqlKind.OpenBracketToken, out token) || TokenParser.TryParse(sql, position, ']', SqlKind.CloseBracketToken, out token) || TokenParser.TryParse(sql, position, '.', SqlKind.DotToken, out token) || TokenParser.TryParse(sql, position, ',', SqlKind.CommaToken, out token) || TokenParser.TryParse(sql, position, ';', SqlKind.SemicolonToken, out token) || TokenParser.TryParse(sql, position, ':', SqlKind.ColonToken, out token)) { position = token.End; tokens.Add(token); } else { tokens.Add(RawToken.SingleChar(SqlKind.Unknown, position)); position++; } } return(tokens.ToImmutableArray()); }