예제 #1
0
        internal SqlTokenInfo(SqlTokenKind kind, char value)
        {
            Kind = kind;
            ReadOnlySpan <char> ca = stackalloc char[1] {
                value
            };

            Value = new string(ca);
        }
예제 #2
0
 internal SqlTokenInfo(SqlTokenKind kind, ReadOnlySpan <char> value)
 {
     Kind  = kind;
     Value = new string(value);
 }
예제 #3
0
 internal SqlTokenInfo(SqlTokenKind kind, StringBuilder value)
 {
     Kind  = kind;
     Value = value?.ToString();
 }
예제 #4
0
 internal SqlTokenInfo(SqlTokenKind kind, string value)
 {
     Kind  = kind;
     Value = value;
 }
예제 #5
0
        /// <summary>
        /// Tokenizes the provided sql statement.
        /// </summary>
        /// <param name="reader"></param>
        /// <param name="skipSundry">Do not emit sundry tokens (such as comments and whitespace) in the output.</param>
        private static IReadOnlyCollection <SqlTokenInfo> Tokenize(SqlCharReader reader, bool skipSundry)
        {
            Debug.Assert(!(reader is null));
            Span <char> peekBuffer = stackalloc char[2];

            var tokens = new List <SqlTokenInfo>();

            while (true)
            {
                reader.FillLength(peekBuffer, peekBuffer.Length, out var peekLength);
                if (peekLength <= 0)
                {
                    break;
                }

                SqlTokenInfo token;
                SqlTokenKind kind = Peek(peekBuffer.Slice(0, peekLength));
                switch (kind)
                {
                case SqlTokenKind.Whitespace:
                    token = ReadWhitespace(peekBuffer, peekLength, reader, skipSundry);
                    if (skipSundry)
                    {
                        continue;
                    }
                    break;

                case SqlTokenKind.LineComment:
                    token = ReadLineComment(reader, skipSundry);
                    if (skipSundry)
                    {
                        continue;
                    }
                    break;

                case SqlTokenKind.BlockComment:
                    token = ReadBlockComment(reader, skipSundry);
                    if (skipSundry)
                    {
                        continue;
                    }
                    break;

                case SqlTokenKind.Literal:
                    token = ReadLiteral(peekBuffer, peekLength, reader);
                    break;

                case SqlTokenKind.Symbol:
                    token = ReadSymbol(peekBuffer, peekLength, reader);
                    break;

                case SqlTokenKind.SquareString:
                    token = ReadSquareString(peekBuffer, peekLength, reader);
                    break;

                case SqlTokenKind.QuotedString:
                    token = ReadQuotedString(peekBuffer, peekLength, reader);
                    break;

                default:
                    throw new InvalidOperationException($"Unknown {nameof(SqlTokenKind)}: {kind}");
                }

                tokens.Add(token);
            }

            return(tokens);
        }
예제 #6
0
 internal SqlTokenInfo(SqlTokenKind kind, char[] value, int offset, int count)
 {
     Kind  = kind;
     Value = new string(value, offset, count);
 }
예제 #7
0
 internal SqlTokenInfo(SqlTokenKind kind, params char[] value)
 {
     Kind  = kind;
     Value = value == null ? null : new string(value);
 }