@@ -149,46 +149,6 @@ impl reader for TtReader {
149
149
fn dup ( @mut self ) -> @mut reader { dup_tt_reader ( self ) as @mut reader }
150
150
}
151
151
152
- // report a lexical error spanning [`from_pos`, `to_pos`)
153
- fn fatal_span ( rdr : @mut StringReader ,
154
- from_pos : BytePos ,
155
- to_pos : BytePos ,
156
- m : ~str )
157
- -> ! {
158
- rdr. peek_span = codemap:: mk_sp ( from_pos, to_pos) ;
159
- rdr. fatal ( m) ;
160
- }
161
-
162
- // report a lexical error spanning [`from_pos`, `to_pos`), appending an
163
- // escaped character to the error message
164
- fn fatal_span_char ( rdr : @mut StringReader ,
165
- from_pos : BytePos ,
166
- to_pos : BytePos ,
167
- m : ~str ,
168
- c : char )
169
- -> ! {
170
- let mut m = m;
171
- m. push_str ( ": " ) ;
172
- char:: escape_default ( c, |c| m. push_char ( c) ) ;
173
- fatal_span ( rdr, from_pos, to_pos, m) ;
174
- }
175
-
176
- // report a lexical error spanning [`from_pos`, `to_pos`), appending the
177
- // offending string to the error message
178
- fn fatal_span_verbose ( rdr : @mut StringReader ,
179
- from_pos : BytePos ,
180
- to_pos : BytePos ,
181
- m : ~str )
182
- -> ! {
183
- let mut m = m;
184
- m. push_str ( ": " ) ;
185
- let s = rdr. src . slice (
186
- byte_offset ( rdr, from_pos) . to_uint ( ) ,
187
- byte_offset ( rdr, to_pos) . to_uint ( ) ) ;
188
- m. push_str ( s) ;
189
- fatal_span ( rdr, from_pos, to_pos, m) ;
190
- }
191
-
192
152
// EFFECT: advance peek_tok and peek_span to refer to the next token.
193
153
// EFFECT: update the interner, maybe.
194
154
fn string_advance_token ( r : @mut StringReader ) {
@@ -367,8 +327,7 @@ fn consume_block_comment(rdr: @mut StringReader)
367
327
bump ( rdr) ;
368
328
}
369
329
if is_eof ( rdr) {
370
- fatal_span ( rdr, start_bpos, rdr. last_pos ,
371
- ~"unterminated block doc-comment") ;
330
+ rdr. fatal ( ~"unterminated block doc-comment") ;
372
331
} else {
373
332
bump ( rdr) ;
374
333
bump ( rdr) ;
@@ -385,12 +344,8 @@ fn consume_block_comment(rdr: @mut StringReader)
385
344
}
386
345
}
387
346
} else {
388
- let start_bpos = rdr. last_pos - BytePos ( 2 u) ;
389
347
loop {
390
- if is_eof ( rdr) {
391
- fatal_span ( rdr, start_bpos, rdr. last_pos ,
392
- ~"unterminated block comment") ;
393
- }
348
+ if is_eof ( rdr) { rdr. fatal ( ~"unterminated block comment") ; }
394
349
if rdr. curr == '*' && nextch ( rdr) == '/' {
395
350
bump ( rdr) ;
396
351
bump ( rdr) ;
@@ -406,7 +361,7 @@ fn consume_block_comment(rdr: @mut StringReader)
406
361
if res. is_some ( ) { res } else { consume_whitespace_and_comments ( rdr) }
407
362
}
408
363
409
- fn scan_exponent ( rdr : @mut StringReader , start_bpos : BytePos ) -> Option < ~str > {
364
+ fn scan_exponent ( rdr : @mut StringReader ) -> Option < ~str > {
410
365
let mut c = rdr. curr ;
411
366
let mut rslt = ~"";
412
367
if c == 'e' || c == 'E' {
@@ -420,10 +375,7 @@ fn scan_exponent(rdr: @mut StringReader, start_bpos: BytePos) -> Option<~str> {
420
375
let exponent = scan_digits ( rdr, 10 u) ;
421
376
if exponent. len ( ) > 0 u {
422
377
return Some ( rslt + exponent) ;
423
- } else {
424
- fatal_span ( rdr, start_bpos, rdr. last_pos ,
425
- ~"scan_exponent: bad fp literal") ;
426
- }
378
+ } else { rdr. fatal ( ~"scan_exponent: bad fp literal") ; }
427
379
} else { return None :: < ~str > ; }
428
380
}
429
381
@@ -447,7 +399,6 @@ fn scan_number(c: char, rdr: @mut StringReader) -> token::Token {
447
399
let mut base = 10 u;
448
400
let mut c = c;
449
401
let mut n = nextch ( rdr) ;
450
- let start_bpos = rdr. last_pos ;
451
402
if c == '0' && n == 'x' {
452
403
bump ( rdr) ;
453
404
bump ( rdr) ;
@@ -491,13 +442,11 @@ fn scan_number(c: char, rdr: @mut StringReader) -> token::Token {
491
442
else { either:: Right ( ast:: ty_u64) } ;
492
443
}
493
444
if num_str. len ( ) == 0 u {
494
- fatal_span ( rdr, start_bpos, rdr. last_pos ,
495
- ~"no valid digits found for number") ;
445
+ rdr. fatal ( ~"no valid digits found for number") ;
496
446
}
497
447
let parsed = match from_str_radix :: < u64 > ( num_str, base as uint ) {
498
448
Some ( p) => p,
499
- None => fatal_span ( rdr, start_bpos, rdr. last_pos ,
500
- ~"int literal is too large")
449
+ None => rdr. fatal ( ~"int literal is too large")
501
450
} ;
502
451
503
452
match tp {
@@ -515,14 +464,12 @@ fn scan_number(c: char, rdr: @mut StringReader) -> token::Token {
515
464
}
516
465
if is_float {
517
466
match base {
518
- 16 u => fatal_span ( rdr, start_bpos, rdr. last_pos ,
519
- ~"hexadecimal float literal is not supported") ,
520
- 2 u => fatal_span ( rdr, start_bpos, rdr. last_pos ,
521
- ~"binary float literal is not supported") ,
467
+ 16 u => rdr. fatal ( ~"hexadecimal float literal is not supported") ,
468
+ 2 u => rdr. fatal ( ~"binary float literal is not supported") ,
522
469
_ => ( )
523
470
}
524
471
}
525
- match scan_exponent ( rdr, start_bpos ) {
472
+ match scan_exponent ( rdr) {
526
473
Some ( ref s) => {
527
474
is_float = true ;
528
475
num_str. push_str ( * s) ;
@@ -560,13 +507,11 @@ fn scan_number(c: char, rdr: @mut StringReader) -> token::Token {
560
507
return token:: LIT_FLOAT_UNSUFFIXED ( str_to_ident ( num_str) ) ;
561
508
} else {
562
509
if num_str. len ( ) == 0 u {
563
- fatal_span ( rdr, start_bpos, rdr. last_pos ,
564
- ~"no valid digits found for number") ;
510
+ rdr. fatal ( ~"no valid digits found for number") ;
565
511
}
566
512
let parsed = match from_str_radix :: < u64 > ( num_str, base as uint ) {
567
513
Some ( p) => p,
568
- None => fatal_span ( rdr, start_bpos, rdr. last_pos ,
569
- ~"int literal is too large")
514
+ None => rdr. fatal ( ~"int literal is too large")
570
515
} ;
571
516
572
517
debug ! ( "lexing %s as an unsuffixed integer literal" ,
@@ -578,23 +523,19 @@ fn scan_number(c: char, rdr: @mut StringReader) -> token::Token {
578
523
fn scan_numeric_escape ( rdr : @mut StringReader , n_hex_digits : uint ) -> char {
579
524
let mut accum_int = 0 ;
580
525
let mut i = n_hex_digits;
581
- let start_bpos = rdr. last_pos ;
582
526
while i != 0 u {
583
527
let n = rdr. curr ;
528
+ bump ( rdr) ;
584
529
if !is_hex_digit ( n) {
585
- fatal_span_char ( rdr, rdr. last_pos , rdr. pos ,
586
- ~"illegal character in numeric character escape",
587
- n) ;
530
+ rdr. fatal ( fmt ! ( "illegal numeric character escape: %d" , n as int) ) ;
588
531
}
589
- bump ( rdr) ;
590
532
accum_int *= 16 ;
591
533
accum_int += hex_digit_val ( n) ;
592
534
i -= 1 u;
593
535
}
594
536
match char:: from_u32 ( accum_int as u32 ) {
595
537
Some ( x) => x,
596
- None => fatal_span ( rdr, start_bpos, rdr. last_pos ,
597
- ~"illegal numeric character escape")
538
+ None => rdr. fatal ( fmt ! ( "illegal numeric character escape" ) )
598
539
}
599
540
}
600
541
@@ -750,7 +691,6 @@ fn next_token_inner(rdr: @mut StringReader) -> token::Token {
750
691
if c2 == '\\' {
751
692
// '\X' for some X must be a character constant:
752
693
let escaped = rdr. curr ;
753
- let escaped_pos = rdr. last_pos ;
754
694
bump ( rdr) ;
755
695
match escaped {
756
696
'n' => { c2 = '\n' ; }
@@ -764,39 +704,32 @@ fn next_token_inner(rdr: @mut StringReader) -> token::Token {
764
704
'u' => { c2 = scan_numeric_escape ( rdr, 4 u) ; }
765
705
'U' => { c2 = scan_numeric_escape ( rdr, 8 u) ; }
766
706
c2 => {
767
- fatal_span_char ( rdr, escaped_pos, rdr. last_pos ,
768
- ~"unknown character escape", c2) ;
707
+ rdr. fatal ( fmt ! ( "unknown character escape: %d" , c2 as int) ) ;
769
708
}
770
709
}
771
710
}
772
711
if rdr. curr != '\'' {
773
- fatal_span_verbose ( rdr,
774
- // Byte offsetting here is okay because the
775
- // character before position `start` is an
776
- // ascii single quote.
777
- start - BytePos ( 1 u) ,
778
- rdr. last_pos ,
779
- ~"unterminated character constant") ;
712
+ rdr. fatal ( ~"unterminated character constant") ;
780
713
}
781
714
bump ( rdr) ; // advance curr past token
782
715
return token:: LIT_CHAR ( c2 as u32 ) ;
783
716
}
784
717
'"' => {
785
718
let mut accum_str = ~"";
786
- let start_bpos = rdr. last_pos ;
719
+ let n = rdr. last_pos ;
787
720
bump ( rdr) ;
788
721
while rdr. curr != '"' {
789
722
if is_eof ( rdr) {
790
- fatal_span ( rdr, start_bpos, rdr. last_pos ,
791
- ~"unterminated double quote string") ;
723
+ do with_str_from ( rdr, n) |s| {
724
+ rdr. fatal ( fmt ! ( "unterminated double quote string: %s" , s) ) ;
725
+ }
792
726
}
793
727
794
728
let ch = rdr. curr ;
795
729
bump ( rdr) ;
796
730
match ch {
797
731
'\\' => {
798
732
let escaped = rdr. curr ;
799
- let escaped_pos = rdr. last_pos ;
800
733
bump ( rdr) ;
801
734
match escaped {
802
735
'n' => accum_str. push_char ( '\n' ) ,
@@ -817,8 +750,7 @@ fn next_token_inner(rdr: @mut StringReader) -> token::Token {
817
750
accum_str. push_char ( scan_numeric_escape ( rdr, 8 u) ) ;
818
751
}
819
752
c2 => {
820
- fatal_span_char ( rdr, escaped_pos, rdr. last_pos ,
821
- ~"unknown string escape", c2) ;
753
+ rdr. fatal ( fmt ! ( "unknown string escape: %d" , c2 as int) ) ;
822
754
}
823
755
}
824
756
}
@@ -854,8 +786,11 @@ fn next_token_inner(rdr: @mut StringReader) -> token::Token {
854
786
'^' => { return binop ( rdr, token:: CARET ) ; }
855
787
'%' => { return binop ( rdr, token:: PERCENT ) ; }
856
788
c => {
857
- fatal_span_char ( rdr, rdr. last_pos , rdr. pos ,
858
- ~"unknown start of token", c) ;
789
+ // So the error span points to the unrecognized character
790
+ rdr. peek_span = codemap:: mk_sp ( rdr. last_pos , rdr. pos ) ;
791
+ let mut cs = ~"";
792
+ char:: escape_default ( c, |c| cs. push_char ( c) ) ;
793
+ rdr. fatal ( fmt ! ( "unknown start of token: %s" , cs) ) ;
859
794
}
860
795
}
861
796
}
0 commit comments