@@ -306,40 +306,44 @@ func (p *parser) parseSecondary() Node {
306
306
case Number :
307
307
p .next ()
308
308
value := strings .Replace (token .Value , "_" , "" , - 1 )
309
- if strings .Contains (value , "x" ) {
309
+ var node Node
310
+ valueLower := strings .ToLower (value )
311
+ switch {
312
+ case strings .HasPrefix (valueLower , "0x" ):
310
313
number , err := strconv .ParseInt (value , 0 , 64 )
311
314
if err != nil {
312
315
p .error ("invalid hex literal: %v" , err )
313
316
}
314
- if number > math .MaxInt {
315
- p .error ("integer literal is too large" )
316
- return nil
317
- }
318
- node := & IntegerNode {Value : int (number )}
319
- node .SetLocation (token .Location )
320
- return node
321
- } else if strings .ContainsAny (value , ".eE" ) {
317
+ node = p .toIntegerNode (number )
318
+ case strings .ContainsAny (valueLower , ".e" ):
322
319
number , err := strconv .ParseFloat (value , 64 )
323
320
if err != nil {
324
321
p .error ("invalid float literal: %v" , err )
325
322
}
326
- node := & FloatNode {Value : number }
327
- node .SetLocation (token .Location )
328
- return node
329
- } else {
323
+ node = p .toFloatNode (number )
324
+ case strings .HasPrefix (valueLower , "0b" ):
325
+ number , err := strconv .ParseInt (value , 0 , 64 )
326
+ if err != nil {
327
+ p .error ("invalid binary literal: %v" , err )
328
+ }
329
+ node = p .toIntegerNode (number )
330
+ case strings .HasPrefix (valueLower , "0o" ):
331
+ number , err := strconv .ParseInt (value , 0 , 64 )
332
+ if err != nil {
333
+ p .error ("invalid octal literal: %v" , err )
334
+ }
335
+ node = p .toIntegerNode (number )
336
+ default :
330
337
number , err := strconv .ParseInt (value , 10 , 64 )
331
338
if err != nil {
332
339
p .error ("invalid integer literal: %v" , err )
333
340
}
334
- if number > math .MaxInt {
335
- p .error ("integer literal is too large" )
336
- return nil
337
- }
338
- node := & IntegerNode {Value : int (number )}
341
+ node = p .toIntegerNode (number )
342
+ }
343
+ if node != nil {
339
344
node .SetLocation (token .Location )
340
- return node
341
345
}
342
-
346
+ return node
343
347
case String :
344
348
p .next ()
345
349
node := & StringNode {Value : token .Value }
@@ -359,6 +363,22 @@ func (p *parser) parseSecondary() Node {
359
363
return p .parsePostfixExpression (node )
360
364
}
361
365
366
+ func (p * parser ) toIntegerNode (number int64 ) Node {
367
+ if number > math .MaxInt {
368
+ p .error ("integer literal is too large" )
369
+ return nil
370
+ }
371
+ return & IntegerNode {Value : int (number )}
372
+ }
373
+
374
+ func (p * parser ) toFloatNode (number float64 ) Node {
375
+ if number > math .MaxFloat64 {
376
+ p .error ("float literal is too large" )
377
+ return nil
378
+ }
379
+ return & FloatNode {Value : number }
380
+ }
381
+
362
382
func (p * parser ) parseCall (token Token ) Node {
363
383
var node Node
364
384
if p .current .Is (Bracket , "(" ) {
0 commit comments