示例#1
0
        protected TextSpan ReadBatchVariable(TextSpan head)
        {
            if (!TryNextChar('(', out var lrent))
            {
                return(TextSpan.Empty);
            }

            head = head.Concat(lrent);

            var identifier = ReadIdentifier(head);

            if (identifier.Length == 2)
            {
                return(TextSpan.Empty);
            }

            if (!TryNextChar(')', out var rrent))
            {
                return(TextSpan.Empty);
            }

            var token = identifier.Concat(rrent);

            token.Type = SqlToken.BatchVariable.ToString();
            return(token);
        }
示例#2
0
        private TextSpan ReadMagnetCompareSymbol(TextSpan head)
        {
            var startIndex = GetOffset();
            var index      = 0;
            var sb         = new StringBuilder();

            sb.Append(GetSpanString(head));
            do
            {
                var ch = PeekCh(index);
                if (ch == char.MinValue)
                {
                    break;
                }
                if (!char.IsWhiteSpace(ch))
                {
                    sb.Append(ch);
                    break;
                }
                index++;
            } while (true);

            var tail = new TextSpan
            {
                Offset = startIndex,
                Length = index + 1
            };

            var peekSymbol = sb.ToString();

            if (index > 0 && _symbolToTokenTypeMap.ContainsKey(peekSymbol))
            {
                SetOffset(tail.Offset + tail.Length);
                var span = head.Concat(tail);
                span.Type = _symbolToTokenTypeMap[peekSymbol];
                return(span);
            }

            return(TextSpan.Empty);
        }
示例#3
0
        protected override bool TryScanNext(TextSpan headSpan, out TextSpan tokenSpan)
        {
            tokenSpan = TextSpan.Empty;

            var head = GetSpanString(headSpan)[0];

            if (head == ':' && TryNextChar('r', out var refSpan))
            {
                tokenSpan      = headSpan.Concat(refSpan);
                tokenSpan      = ReadBatchReferenceFile(tokenSpan);
                tokenSpan.Type = SqlToken.BatchRefFile.ToString();
                return(true);
            }

            if (head == 'N' && TryNextChar('\'', out var head2))
            {
                headSpan = headSpan.Concat(head2);
                if (!TryRead(ReadQuoteString, headSpan, out var nstring))
                {
                    ThrowHelper.ThrowScanException(this, $"Scan NString Error.");
                }
                nstring.Type = SqlToken.NString.ToString();
                tokenSpan    = nstring;
                return(true);
            }

            if (head == '0' && TryNextChar('x', out var hexHead))
            {
                headSpan = headSpan.Concat(hexHead);
                if (!TryRead(ReadHexNumber, headSpan, out var hexString))
                {
                    ThrowHelper.ThrowScanException(this, $"Scan HexString Error.");
                }
                tokenSpan = hexString;
                return(true);
            }

            if (char.IsDigit(head))
            {
                if (!TryRead(ReadNumber, headSpan, out var numberString))
                {
                    ThrowHelper.ThrowScanException(this, $"Scan number Error.");
                }

                if (TryNextChar('.', out var floatHead))
                {
                    headSpan = numberString.Concat(floatHead);
                    if (!TryRead(ReadNumber, headSpan, out var floatString))
                    {
                        ThrowHelper.ThrowScanException(this, $"Scan float Error.");
                    }
                    tokenSpan      = floatString;
                    tokenSpan.Type = SqlToken.Number.ToString();
                    return(true);
                }

                tokenSpan      = numberString;
                tokenSpan.Type = SqlToken.Number.ToString();
                return(true);
            }

            if (head == '[' && TryRead(ReadSqlIdentifier, headSpan, out var sqlIdentifier))
            {
                tokenSpan = sqlIdentifier;
                return(true);
            }

            var nextChar = PeekCh();

            if (head == ':' && char.IsLetter(nextChar) && TryRead(ReadIdentifier, headSpan, out var scriptIdentifier))
            {
                scriptIdentifier.Type = GetTokenType(scriptIdentifier, SqlToken.ScriptIdentifier);
                tokenSpan             = scriptIdentifier;
                return(true);
            }

            if (head == '/' && TryRead(ReadMultiComment, headSpan, out var multiComment))
            {
                tokenSpan = multiComment;
                return(true);
            }

            if (head == '-' && TryNextChar('-', out var singleHead))
            {
                headSpan = headSpan.Concat(singleHead);
                if (!TryRead(ReadSingleComment, headSpan, out var singleComment))
                {
                    ThrowHelper.ThrowScanException(this, $"Scan single comment Error.");
                }
                tokenSpan = singleComment;
                return(true);
            }

            if (head == '\"' && TryRead(ReadDoubleQuoteString, headSpan, out var doubleQuoteString))
            {
                tokenSpan = doubleQuoteString;
                return(true);
            }

            if (head == '\'' && TryRead(ReadQuoteString, headSpan, out var quoteString))
            {
                tokenSpan = quoteString;
                return(true);
            }

            if (head == '@' && TryNextChar('@', out var atHead2))
            {
                headSpan = headSpan.Concat(atHead2);
                if (!TryRead(ReadIdentifier, headSpan, out var sysVariable))
                {
                    throw new ScanException("Expect @@xxxx");
                }
                tokenSpan      = sysVariable;
                tokenSpan.Type = SqlToken.SystemVariable.ToString();
                return(true);
            }

            if (head == '@' && TryRead(ReadIdentifier, headSpan, out var variable))
            {
                tokenSpan      = variable;
                tokenSpan.Type = SqlToken.Variable.ToString();
                return(true);
            }

            if (head == '#' && TryRead(ReadIdentifier, headSpan, out var tmpTable))
            {
                tokenSpan      = tmpTable;
                tokenSpan.Type = SqlToken.TempTable.ToString();
                return(true);
            }

            if (head == '$' && TryRead(ReadBatchVariable, headSpan, out var nameSpan))
            {
                tokenSpan = nameSpan;
                return(true);
            }

            if (_magnetHeadChars.Contains(head) && TryRead(ReadMagnetCompareSymbol, headSpan, out var magnetSymbol))
            {
                tokenSpan = magnetSymbol;
                return(true);
            }

            return(false);
        }