private void ReadNumber(bool startsWithNumber = false) { var isDouble = false; var endsWithNumber = false; while (true) { if (char.IsDigit(Current)) { if (_position == _start) { startsWithNumber = true; } endsWithNumber = true; _position++; continue; } if (Current == '.') { endsWithNumber = false; if (isDouble) { _position++; break; } isDouble = true; _position++; continue; } break; } var length = _position - _start; var text = _text.ToString(_start, length); if (!endsWithNumber) { var span = new TextSpan(_start, length); var location = new TextLocation(_text, span); _diagnostics.ReportInvalidExpressionTerm(location, text); _value = 0; _kind = SyntaxKind.NumberToken; } if (isDouble) { if (!double.TryParse(text, out var doubleValue)) { var span = new TextSpan(_start, length); var location = new TextLocation(_text, span); _diagnostics.ReportInvalidNumber(location, text, TypeSymbol.Double); } _value = doubleValue; _kind = SyntaxKind.NumberToken; } else { if (!int.TryParse(text, out var intValue)) { var span = new TextSpan(_start, length); var location = new TextLocation(_text, span); _diagnostics.ReportInvalidNumber(location, text, TypeSymbol.Int); } _value = intValue; _kind = SyntaxKind.NumberToken; } }