예제 #1
0
            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);
            }
예제 #2
0
        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());
        }