@@ -216,16 +216,51 @@ literal_. The grammar for recognizing the two kinds of literals is mixed.
216
216
217
217
#### Integer literals
218
218
219
+ > ** <sup >Lexer</sup >**
220
+ > INTEGER_LITERAL :
221
+ >   ;  ; ( DEC_LITERAL | BIN_LITERAL | OCT_LITERAL | HEX_LITERAL )
222
+ > INTEGER_SUFFIX<sup >?</sup >
223
+ >
224
+ > DEC_LITERAL :
225
+ >   ;  ; DEC_DIGIT (DEC_DIGIT|` _ ` )<sup >\* </sup >
226
+ >
227
+ > BIN_LITERAL :
228
+ >   ;  ; ` 0b ` (BIN_DIGIT|` _ ` )<sup >\* </sup > BIN_DIGIT (BIN_DIGIT|` _ ` )<sup >\* </sup >
229
+ >
230
+ > OCT_LITERAL :
231
+ >   ;  ; ` 0o ` (OCT_DIGIT|` _ ` )<sup >\* </sup > OCT_DIGIT (OCT_DIGIT|` _ ` )<sup >\* </sup >
232
+ >
233
+ > HEX_LITERAL :
234
+ >   ;  ; ` 0x ` (HEX_DIGIT|` _ ` )<sup >\* </sup > HEX_DIGIT (HEX_DIGIT|` _ ` )<sup >\* </sup >
235
+ >
236
+ > BIN_DIGIT : [ ` 0 ` -` 1 ` ]
237
+ >
238
+ > OCT_DIGIT : [ ` 0 ` -` 7 ` ]
239
+ >
240
+ > DEC_DIGIT : [ ` 0 ` -` 9 ` ]
241
+ >
242
+ > HEX_DIGIT : [ ` 0 ` -` 9 ` ` a ` -` f ` ` A ` -` F ` ]
243
+ >
244
+ > INTEGER_SUFFIX :
245
+ >   ;  ;   ;  ; ` u8 ` | ` u16 ` | ` u32 ` | ` u64 ` | ` usize `
246
+ >   ;  ; | ` i8 ` | ` u16 ` | ` i32 ` | ` i64 ` | ` usize `
247
+
248
+ <!-- FIXME: separate the DECIMAL_LITERAL with no prefix or suffix (used on tuple indexing and float_literal -->
249
+ <!-- FIXME: u128 and i128 -->
250
+
219
251
An _ integer literal_ has one of four forms:
220
252
221
253
* A _ decimal literal_ starts with a * decimal digit* and continues with any
222
254
mixture of * decimal digits* and _ underscores_ .
223
255
* A _ hex literal_ starts with the character sequence ` U+0030 ` ` U+0078 `
224
- (` 0x ` ) and continues as any mixture of hex digits and underscores.
256
+ (` 0x ` ) and continues as any mixture (with at least one digit) of hex digits
257
+ and underscores.
225
258
* An _ octal literal_ starts with the character sequence ` U+0030 ` ` U+006F `
226
- (` 0o ` ) and continues as any mixture of octal digits and underscores.
259
+ (` 0o ` ) and continues as any mixture (with at least one digit) of octal digits
260
+ and underscores.
227
261
* A _ binary literal_ starts with the character sequence ` U+0030 ` ` U+0062 `
228
- (` 0b ` ) and continues as any mixture of binary digits and underscores.
262
+ (` 0b ` ) and continues as any mixture (with at least one digit) of binary digits
263
+ and underscores.
229
264
230
265
Like any literal, an integer literal may be followed (immediately,
231
266
without any spaces) by an _ integer suffix_ , which forcibly sets the
@@ -247,15 +282,49 @@ The type of an _unsuffixed_ integer literal is determined by type inference:
247
282
Examples of integer literals of various forms:
248
283
249
284
``` rust
285
+ 123 ; // type i32
250
286
123i32 ; // type i32
251
287
123u32 ; // type u32
252
288
123_u32 ; // type u32
289
+ let a : u64 = 123 ; // type u64
290
+
291
+ 0xff ; // type i32
253
292
0xff_u8 ; // type u8
293
+
294
+ 0o70 ; // type i32
254
295
0o70_i16 ; // type i16
255
- 0b1111_1111_1001_0000_i32 ; // type i32
296
+
297
+ 0b1111_1111_1001_0000 ; // type i32
298
+ 0b1111_1111_1001_0000i32 ; // type i64
299
+ 0b________1 ; // type i32
300
+
256
301
0usize ; // type usize
257
302
```
258
303
304
+ Examples of invalid integer literals:
305
+
306
+ ``` rust,ignore
307
+ // invalid suffixes
308
+
309
+ 0invalidSuffix;
310
+
311
+ // uses numbers of the wrong base
312
+
313
+ 123AFB43;
314
+ 0b0102;
315
+ 0o0581;
316
+
317
+ // integers too big for their type (they overflow)
318
+
319
+ 128_i8;
320
+ 256_u8;
321
+
322
+ // bin, hex and octal literals must have at least one digit
323
+
324
+ 0b_;
325
+ 0b____;
326
+ ```
327
+
259
328
Note that the Rust syntax considers ` -1i8 ` as an application of the [ unary minus
260
329
operator] to an integer literal ` 1i8 ` , rather than
261
330
a single integer literal.
0 commit comments