@@ -410,37 +410,18 @@ fn scan_number(char c, &reader rdr) -> token::token {
410
410
}
411
411
}
412
412
413
- fn scan_numeric_escape ( & reader rdr) -> char {
414
-
415
- auto n_hex_digits = 0 ;
416
-
417
- assert ( rdr. curr ( ) == '\\' ) ;
418
-
419
- alt ( rdr. next ( ) ) {
420
- case ( 'x' ) { n_hex_digits = 2 ; }
421
- case ( 'u' ) { n_hex_digits = 4 ; }
422
- case ( 'U' ) { n_hex_digits = 8 ; }
423
- case ( ?c) {
424
- rdr. err ( #fmt ( "unknown numeric character escape: %d" , c as int ) ) ;
425
- fail;
426
- }
427
- }
428
-
429
- rdr. bump ( ) ; // advance curr past \
430
-
431
- auto n = rdr. next ( ) ;
413
+ fn scan_numeric_escape ( & reader rdr, uint n_hex_digits ) -> char {
432
414
auto accum_int = 0 ;
433
-
434
- while ( n_hex_digits != 0 ) {
415
+ while ( n_hex_digits != 0 u) {
416
+ auto n = rdr. curr ( ) ;
417
+ rdr. bump ( ) ;
435
418
if ( !is_hex_digit ( n) ) {
436
419
rdr. err ( #fmt ( "illegal numeric character escape: %d" , n as int ) ) ;
437
420
fail;
438
421
}
439
422
accum_int *= 16 ;
440
423
accum_int += hex_digit_val ( n) ;
441
- rdr. bump ( ) ;
442
- n = rdr. next ( ) ;
443
- n_hex_digits -= 1 ;
424
+ n_hex_digits -= 1 u;
444
425
}
445
426
ret accum_int as char ;
446
427
}
@@ -583,76 +564,76 @@ fn next_token(&reader rdr) -> token::token {
583
564
case ( '\'' ) {
584
565
rdr. bump ( ) ;
585
566
auto c2 = rdr. curr ( ) ;
567
+ rdr. bump ( ) ;
586
568
if ( c2 == '\\' ) {
587
- alt ( rdr. next ( ) ) {
569
+ auto escaped = rdr. curr ( ) ;
570
+ rdr. bump ( ) ;
571
+ alt ( escaped) {
588
572
case ( 'n' ) { c2 = '\n' ; }
589
573
case ( 'r' ) { c2 = '\r' ; }
590
574
case ( 't' ) { c2 = '\t' ; }
591
575
case ( '\\' ) { c2 = '\\' ; }
592
576
case ( '\'' ) { c2 = '\'' ; }
593
577
594
- case ( 'x' ) { c2 = scan_numeric_escape ( rdr) ; }
595
- case ( 'u' ) { c2 = scan_numeric_escape ( rdr) ; }
596
- case ( 'U' ) { c2 = scan_numeric_escape ( rdr) ; }
578
+ case ( 'x' ) { c2 = scan_numeric_escape ( rdr, 2 u ) ; }
579
+ case ( 'u' ) { c2 = scan_numeric_escape ( rdr, 4 u ) ; }
580
+ case ( 'U' ) { c2 = scan_numeric_escape ( rdr, 8 u ) ; }
597
581
598
582
case ( ?c2) {
599
583
rdr. err ( #fmt ( "unknown character escape: %d" ,
600
584
c2 as int ) ) ;
601
585
fail;
602
586
}
603
587
}
604
- rdr. bump ( ) ;
605
588
}
606
589
607
- if ( rdr. next ( ) != '\'' ) {
590
+ if ( rdr. curr ( ) != '\'' ) {
608
591
rdr. err ( "unterminated character constant" ) ;
609
592
fail;
610
593
}
611
- rdr. bump ( ) ; // advance curr to closing '
612
594
rdr. bump ( ) ; // advance curr past token
613
595
ret token:: LIT_CHAR ( c2) ;
614
596
}
615
597
616
598
case ( '"' ) {
617
599
rdr. bump ( ) ;
618
600
while ( rdr. curr ( ) != '"' ) {
619
- alt ( rdr. curr ( ) ) {
601
+ auto ch = rdr. curr ( ) ;
602
+ rdr. bump ( ) ;
603
+ alt ( ch) {
620
604
case ( '\\' ) {
621
- alt ( rdr. next ( ) ) {
605
+ auto escaped = rdr. curr ( ) ;
606
+ rdr. bump ( ) ;
607
+ alt ( escaped) {
622
608
case ( 'n' ) {
623
- rdr. bump ( ) ;
624
609
str:: push_byte ( accum_str, '\n' as u8 ) ;
625
610
}
626
611
case ( 'r' ) {
627
- rdr. bump ( ) ;
628
612
str:: push_byte ( accum_str, '\r' as u8 ) ;
629
613
}
630
614
case ( 't' ) {
631
- rdr. bump ( ) ;
632
615
str:: push_byte ( accum_str, '\t' as u8 ) ;
633
616
}
634
617
case ( '\\' ) {
635
- rdr. bump ( ) ;
636
618
str:: push_byte ( accum_str, '\\' as u8 ) ;
637
619
}
638
620
case ( '"' ) {
639
- rdr. bump ( ) ;
640
621
str:: push_byte ( accum_str, '"' as u8 ) ;
641
622
}
642
623
643
624
case ( 'x' ) {
644
625
str:: push_char ( accum_str,
645
- scan_numeric_escape ( rdr) ) ;
626
+ scan_numeric_escape ( rdr, 2 u ) ) ;
646
627
}
647
628
648
629
case ( 'u' ) {
649
630
str:: push_char ( accum_str,
650
- scan_numeric_escape ( rdr) ) ;
631
+ scan_numeric_escape ( rdr, 4 u ) ) ;
651
632
}
652
633
653
634
case ( 'U' ) {
654
635
str:: push_char ( accum_str,
655
- scan_numeric_escape ( rdr) ) ;
636
+ scan_numeric_escape ( rdr, 8 u ) ) ;
656
637
}
657
638
658
639
case ( ?c2) {
@@ -663,10 +644,9 @@ fn next_token(&reader rdr) -> token::token {
663
644
}
664
645
}
665
646
case ( _) {
666
- str:: push_char ( accum_str, rdr . curr ( ) ) ;
647
+ str:: push_char ( accum_str, ch ) ;
667
648
}
668
649
}
669
- rdr. bump ( ) ;
670
650
}
671
651
rdr. bump ( ) ;
672
652
ret token:: LIT_STR ( interner:: intern[ str] ( * rdr. get_interner ( ) ,
0 commit comments