@@ -173,6 +173,22 @@ fn fatal_span_char(rdr: @mut StringReader,
173
173
fatal_span ( rdr, from_pos, to_pos, m) ;
174
174
}
175
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
+
176
192
// EFFECT: advance peek_tok and peek_span to refer to the next token.
177
193
// EFFECT: update the interner, maybe.
178
194
fn string_advance_token ( r : @mut StringReader ) {
@@ -390,8 +406,7 @@ fn consume_block_comment(rdr: @mut StringReader)
390
406
if res. is_some ( ) { res } else { consume_whitespace_and_comments ( rdr) }
391
407
}
392
408
393
- fn scan_exponent ( rdr : @mut StringReader ) -> Option < ~str > {
394
- let start_bpos = rdr. last_pos ;
409
+ fn scan_exponent ( rdr : @mut StringReader , start_bpos : BytePos ) -> Option < ~str > {
395
410
let mut c = rdr. curr ;
396
411
let mut rslt = ~"";
397
412
if c == 'e' || c == 'E' {
@@ -507,7 +522,7 @@ fn scan_number(c: char, rdr: @mut StringReader) -> token::Token {
507
522
_ => ( )
508
523
}
509
524
}
510
- match scan_exponent ( rdr) {
525
+ match scan_exponent ( rdr, start_bpos ) {
511
526
Some ( ref s) => {
512
527
is_float = true ;
513
528
num_str. push_str ( * s) ;
@@ -568,7 +583,8 @@ fn scan_numeric_escape(rdr: @mut StringReader, n_hex_digits: uint) -> char {
568
583
let n = rdr. curr ;
569
584
if !is_hex_digit ( n) {
570
585
fatal_span_char ( rdr, rdr. last_pos , rdr. pos ,
571
- ~"illegal numeric character escape", n) ;
586
+ ~"illegal character in numeric character escape",
587
+ n) ;
572
588
}
573
589
bump ( rdr) ;
574
590
accum_int *= 16 ;
@@ -754,27 +770,25 @@ fn next_token_inner(rdr: @mut StringReader) -> token::Token {
754
770
}
755
771
}
756
772
if rdr. curr != '\'' {
757
- fatal_span ( rdr,
758
- // Byte offsetting here is okay because the character
759
- // before position `start` is an ascii single quote.
760
- start - BytePos ( 1 u) ,
761
- rdr. last_pos ,
762
- ~"unterminated character constant") ;
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") ;
763
780
}
764
781
bump ( rdr) ; // advance curr past token
765
782
return token:: LIT_CHAR ( c2 as u32 ) ;
766
783
}
767
784
'"' => {
768
785
let mut accum_str = ~"";
769
- let n = rdr. last_pos ;
786
+ let start_bpos = rdr. last_pos ;
770
787
bump ( rdr) ;
771
788
while rdr. curr != '"' {
772
789
if is_eof ( rdr) {
773
- do with_str_from ( rdr, n) |s| {
774
- fatal_span ( rdr, n, rdr. last_pos ,
775
- fmt ! ( "unterminated double quote string: %s" ,
776
- s) ) ;
777
- }
790
+ fatal_span ( rdr, start_bpos, rdr. last_pos ,
791
+ ~"unterminated double quote string") ;
778
792
}
779
793
780
794
let ch = rdr. curr ;
0 commit comments