@@ -158,10 +158,15 @@ fn consume_block_comment(rdr: reader) {
158
158
be consume_whitespace_and_comments ( rdr) ;
159
159
}
160
160
161
- fn digits_to_string ( s : str ) -> int {
161
+ fn string_to_int ( s : str ) -> int {
162
+ let negative = false ;
163
+ if str:: char_at ( s, 0 u) == '-' {
164
+ negative = true ;
165
+ s = str:: substr ( s, 1 u, str:: byte_len ( s) - 1 u) ;
166
+ }
162
167
let accum_int: int = 0 ;
163
168
for c: u8 in s { accum_int *= 10 ; accum_int += dec_digit_val ( c as char ) ; }
164
- ret accum_int;
169
+ ret if negative { - accum_int } else { accum_int } ;
165
170
}
166
171
167
172
fn scan_exponent ( rdr : reader ) -> option:: t < str > {
@@ -182,6 +187,17 @@ fn scan_exponent(rdr: reader) -> option::t<str> {
182
187
} else { ret none :: < str > ; }
183
188
}
184
189
190
+ fn scan_dec_digits_with_prefix ( rdr : reader ) -> str {
191
+ let negative = false ;
192
+ if rdr. curr ( ) == '-' {
193
+ negative = true ;
194
+ rdr. bump ( ) ;
195
+ }
196
+ let digits = scan_dec_digits ( rdr) ;
197
+ if negative { str:: unshift_char ( digits, '-' ) }
198
+ ret digits;
199
+ }
200
+
185
201
fn scan_dec_digits ( rdr : reader ) -> str {
186
202
let c = rdr. curr ( ) ;
187
203
let rslt: str = "" ;
@@ -196,7 +212,6 @@ fn scan_dec_digits(rdr: reader) -> str {
196
212
fn scan_number ( c : char , rdr : reader ) -> token:: token {
197
213
let accum_int = 0 ;
198
214
let num_str: str = "" ;
199
- let is_dec_integer: bool = false ;
200
215
let n = rdr. next ( ) ;
201
216
if c == '0' && n == 'x' {
202
217
rdr. bump ( ) ;
@@ -216,8 +231,10 @@ fn scan_number(c: char, rdr: reader) -> token::token {
216
231
rdr. bump ( ) ;
217
232
c = rdr. curr ( ) ;
218
233
}
219
- } else { num_str = scan_dec_digits ( rdr) ; is_dec_integer = true ; }
220
- if is_dec_integer { accum_int = digits_to_string ( num_str) ; }
234
+ } else {
235
+ num_str = scan_dec_digits_with_prefix ( rdr) ;
236
+ accum_int = string_to_int ( num_str) ;
237
+ }
221
238
c = rdr. curr ( ) ;
222
239
n = rdr. next ( ) ;
223
240
if c == 'u' || c == 'i' {
@@ -341,7 +358,9 @@ fn next_token_inner(rdr: reader) -> token::token {
341
358
ret token:: IDENT ( interner:: intern :: < str > ( * rdr. get_interner ( ) ,
342
359
accum_str) , is_mod_name) ;
343
360
}
344
- if is_dec_digit ( c) { ret scan_number ( c, rdr) ; }
361
+ if is_dec_digit ( c) || ( c == '-' && is_dec_digit ( rdr. next ( ) ) ) {
362
+ ret scan_number ( c, rdr) ;
363
+ }
345
364
fn binop ( rdr : reader , op : token:: binop ) -> token:: token {
346
365
rdr. bump ( ) ;
347
366
if rdr. curr ( ) == '=' {
0 commit comments