@@ -394,38 +394,7 @@ impl<'a> Tokenizer<'a> {
394
394
}
395
395
}
396
396
// numbers
397
- '0' ..='9' => {
398
- let mut seen_decimal = false ;
399
- let mut s = peeking_take_while ( chars, |ch| match ch {
400
- '0' ..='9' => true ,
401
- '.' if !seen_decimal => {
402
- seen_decimal = true ;
403
- true
404
- }
405
- _ => false ,
406
- } ) ;
407
- // If in e-notation, parse the e-notation with special care given to negative exponents.
408
- match chars. peek ( ) {
409
- Some ( 'e' ) | Some ( 'E' ) => {
410
- s. push ( 'E' ) ;
411
- // Consume the e-notation signifier.
412
- chars. next ( ) ;
413
- if let Some ( '-' ) = chars. peek ( ) {
414
- s. push ( '-' ) ;
415
- // Consume the negative sign.
416
- chars. next ( ) ;
417
- }
418
- let e = peeking_take_while ( chars, |ch| match ch {
419
- '0' ..='9' => true ,
420
- _ => false ,
421
- } ) ;
422
- s. push_str ( & e) ;
423
- }
424
- _ => { }
425
- }
426
-
427
- Ok ( Some ( Token :: Number ( s) ) )
428
- }
397
+ '0' ..='9' => self . tokenize_number ( chars, false ) ,
429
398
// punctuation
430
399
'(' => self . consume_and_return ( chars, Token :: LParen ) ,
431
400
')' => self . consume_and_return ( chars, Token :: RParen ) ,
@@ -518,7 +487,13 @@ impl<'a> Tokenizer<'a> {
518
487
}
519
488
}
520
489
'=' => self . consume_and_return ( chars, Token :: Eq ) ,
521
- '.' => self . consume_and_return ( chars, Token :: Period ) ,
490
+ '.' => {
491
+ chars. next ( ) ; // consume '.'
492
+ match chars. peek ( ) {
493
+ Some ( '0' ..='9' ) => self . tokenize_number ( chars, true ) ,
494
+ _ => Ok ( Some ( Token :: Period ) ) ,
495
+ }
496
+ }
522
497
'!' => {
523
498
chars. next ( ) ; // consume
524
499
match chars. peek ( ) {
@@ -660,6 +635,49 @@ impl<'a> Tokenizer<'a> {
660
635
Ok ( Some ( Token :: Parameter ( n) ) )
661
636
}
662
637
638
+ fn tokenize_number (
639
+ & self ,
640
+ chars : & mut Peekable < Chars < ' _ > > ,
641
+ seen_decimal : bool ,
642
+ ) -> Result < Option < Token > , TokenizerError > {
643
+ let mut seen_decimal = seen_decimal;
644
+ let mut s = if seen_decimal {
645
+ "." . to_string ( )
646
+ } else {
647
+ String :: default ( )
648
+ } ;
649
+
650
+ s. push_str ( & peeking_take_while ( chars, |ch| match ch {
651
+ '0' ..='9' => true ,
652
+ '.' if !seen_decimal => {
653
+ seen_decimal = true ;
654
+ true
655
+ }
656
+ _ => false ,
657
+ } ) ) ;
658
+ // If in e-notation, parse the e-notation with special care given to negative exponents.
659
+ match chars. peek ( ) {
660
+ Some ( 'e' ) | Some ( 'E' ) => {
661
+ s. push ( 'E' ) ;
662
+ // Consume the e-notation signifier.
663
+ chars. next ( ) ;
664
+ if let Some ( '-' ) = chars. peek ( ) {
665
+ s. push ( '-' ) ;
666
+ // Consume the negative sign.
667
+ chars. next ( ) ;
668
+ }
669
+ let e = peeking_take_while ( chars, |ch| match ch {
670
+ '0' ..='9' => true ,
671
+ _ => false ,
672
+ } ) ;
673
+ s. push_str ( & e) ;
674
+ }
675
+ _ => { }
676
+ }
677
+
678
+ Ok ( Some ( Token :: Number ( s) ) )
679
+ }
680
+
663
681
fn consume_and_return (
664
682
& self ,
665
683
chars : & mut Peekable < Chars < ' _ > > ,
0 commit comments