@@ -212,6 +212,25 @@ struct Tokenizer {
212
212
}
213
213
}
214
214
215
+ Token ParseNumber (bool is_pos) {
216
+ std::stringstream ss;
217
+ while (More () && IsNumeric (Peek ())) {
218
+ ss << Next ();
219
+ }
220
+
221
+ bool is_float = false ;
222
+
223
+ // Remove trailing floating point prefix.
224
+ if (More () && Peek () == ' f' ) {
225
+ ss << Next ();
226
+ while (More () && IsNumeric (Peek ())) {
227
+ ss << Next ();
228
+ }
229
+ is_float = true ;
230
+ }
231
+ return ParseNumber (is_pos, is_float, ss.str ());
232
+ }
233
+
215
234
bool MatchString (const std::string& string) {
216
235
int start = this ->pos ;
217
236
@@ -340,38 +359,28 @@ struct Tokenizer {
340
359
auto token = NewToken (TokenType::kWhitespace );
341
360
Next ();
342
361
return token;
343
- } else if (IsDigit (next) || next == ' -' ) {
362
+ } else if (next == ' -' ) {
344
363
int negs = 0 ;
345
364
while (More () && Peek () == ' -' ) {
346
365
Next ();
347
366
negs++;
348
367
}
349
- // If there isn't a number right after either,
350
- // this is really slow for lexing, should replace
351
- // with multi-token return or something.
352
- if (negs && !IsDigit (Peek ())) {
368
+ bool is_neg = negs % 2 == 1 ;
369
+ if (More () && IsDigit (Peek ())) {
370
+ return ParseNumber (!is_neg);
371
+ } else if (More () && MatchString (" inff" )) {
372
+ return ParseNumber (!is_neg, true , " inff" );
373
+ } else {
374
+ // If there isn't a number right after either,
375
+ // this is really slow for lexing, should replace
376
+ // with multi-token return or something.
353
377
pos = pos - (negs - 1 );
354
378
return NewToken (TokenType::kMinus );
355
379
}
356
-
357
- bool is_neg = negs % 2 == 1 ;
358
- std::stringstream ss;
359
- while (More () && IsNumeric (Peek ())) {
360
- ss << Next ();
361
- }
362
-
363
- bool is_float = false ;
364
-
365
- // Remove trailing floating point prefix.
366
- if (More () && Peek () == ' f' ) {
367
- ss << Next ();
368
- while (More () && IsNumeric (Peek ())) {
369
- ss << Next ();
370
- }
371
- is_float = true ;
372
- }
373
-
374
- return ParseNumber (!is_neg, is_float, ss.str ());
380
+ } else if (IsDigit (next)) {
381
+ return ParseNumber (true );
382
+ } else if (MatchString (" inff" )) {
383
+ return ParseNumber (true , true , " inff" );
375
384
} else if (next == ' .' ) {
376
385
auto token = NewToken (TokenType::kPeriod );
377
386
Next ();
@@ -404,10 +413,6 @@ struct Tokenizer {
404
413
auto token = NewToken (TokenType::kPlus );
405
414
Next ();
406
415
return token;
407
- } else if (next == ' -' ) {
408
- auto token = NewToken (TokenType::kMinus );
409
- Next ();
410
- return token;
411
416
} else if (next == ' *' ) {
412
417
auto token = NewToken (TokenType::kStar );
413
418
Next ();
0 commit comments