291 return math.Inf(1) |
291 return math.Inf(1) |
292 case tokenNan: |
292 case tokenNan: |
293 return math.NaN() |
293 return math.NaN() |
294 case tokenInteger: |
294 case tokenInteger: |
295 cleanedVal := cleanupNumberToken(tok.val) |
295 cleanedVal := cleanupNumberToken(tok.val) |
296 var err error |
296 base := 10 |
297 var val int64 |
297 s := cleanedVal |
|
298 checkInvalidUnderscore := numberContainsInvalidUnderscore |
298 if len(cleanedVal) >= 3 && cleanedVal[0] == '0' { |
299 if len(cleanedVal) >= 3 && cleanedVal[0] == '0' { |
299 switch cleanedVal[1] { |
300 switch cleanedVal[1] { |
300 case 'x': |
301 case 'x': |
301 err = hexNumberContainsInvalidUnderscore(tok.val) |
302 checkInvalidUnderscore = hexNumberContainsInvalidUnderscore |
302 if err != nil { |
303 base = 16 |
303 p.raiseError(tok, "%s", err) |
|
304 } |
|
305 val, err = strconv.ParseInt(cleanedVal[2:], 16, 64) |
|
306 case 'o': |
304 case 'o': |
307 err = numberContainsInvalidUnderscore(tok.val) |
305 base = 8 |
308 if err != nil { |
|
309 p.raiseError(tok, "%s", err) |
|
310 } |
|
311 val, err = strconv.ParseInt(cleanedVal[2:], 8, 64) |
|
312 case 'b': |
306 case 'b': |
313 err = numberContainsInvalidUnderscore(tok.val) |
307 base = 2 |
314 if err != nil { |
|
315 p.raiseError(tok, "%s", err) |
|
316 } |
|
317 val, err = strconv.ParseInt(cleanedVal[2:], 2, 64) |
|
318 default: |
308 default: |
319 panic("invalid base") // the lexer should catch this first |
309 panic("invalid base") // the lexer should catch this first |
320 } |
310 } |
321 } else { |
311 s = cleanedVal[2:] |
322 err = numberContainsInvalidUnderscore(tok.val) |
312 } |
323 if err != nil { |
313 |
324 p.raiseError(tok, "%s", err) |
314 err := checkInvalidUnderscore(tok.val) |
325 } |
|
326 val, err = strconv.ParseInt(cleanedVal, 10, 64) |
|
327 } |
|
328 if err != nil { |
315 if err != nil { |
329 p.raiseError(tok, "%s", err) |
316 p.raiseError(tok, "%s", err) |
330 } |
317 } |
331 return val |
318 |
|
319 var val interface{} |
|
320 val, err = strconv.ParseInt(s, base, 64) |
|
321 if err == nil { |
|
322 return val |
|
323 } |
|
324 |
|
325 if s[0] != '-' { |
|
326 if val, err = strconv.ParseUint(s, base, 64); err == nil { |
|
327 return val |
|
328 } |
|
329 } |
|
330 p.raiseError(tok, "%s", err) |
332 case tokenFloat: |
331 case tokenFloat: |
333 err := numberContainsInvalidUnderscore(tok.val) |
332 err := numberContainsInvalidUnderscore(tok.val) |
334 if err != nil { |
333 if err != nil { |
335 p.raiseError(tok, "%s", err) |
334 p.raiseError(tok, "%s", err) |
336 } |
335 } |