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