@@ -259,14 +259,14 @@ private static TokenType NextCloserOrComma(WellKnownTextTokenizer tokenizer)
259
259
260
260
private static double NextNumber ( WellKnownTextTokenizer tokenizer )
261
261
{
262
- if ( tokenizer . NextToken ( ) == TokenType . Number )
262
+ if ( tokenizer . NextToken ( ) == TokenType . Word )
263
263
{
264
264
if ( string . Equals ( tokenizer . TokenValue , WellKnownTextTokenizer . NaN , StringComparison . OrdinalIgnoreCase ) )
265
265
return double . NaN ;
266
266
267
267
if ( double . TryParse (
268
268
tokenizer . TokenValue ,
269
- NumberStyles . AllowDecimalPoint | NumberStyles . AllowLeadingSign ,
269
+ NumberStyles . AllowDecimalPoint | NumberStyles . AllowLeadingSign | NumberStyles . AllowExponent ,
270
270
CultureInfo . InvariantCulture , out var d ) )
271
271
return d ;
272
272
}
@@ -278,7 +278,7 @@ private static double NextNumber(WellKnownTextTokenizer tokenizer)
278
278
private static bool IsNumberNext ( WellKnownTextTokenizer tokenizer )
279
279
{
280
280
var token = tokenizer . PeekToken ( ) ;
281
- return token == TokenType . Number ;
281
+ return token == TokenType . Word ;
282
282
}
283
283
}
284
284
@@ -288,7 +288,6 @@ private static bool IsNumberNext(WellKnownTextTokenizer tokenizer)
288
288
internal enum CharacterType : byte
289
289
{
290
290
Whitespace ,
291
- Digit ,
292
291
Alpha ,
293
292
Comment
294
293
}
@@ -300,7 +299,6 @@ internal enum TokenType : byte
300
299
{
301
300
None ,
302
301
Word ,
303
- Number ,
304
302
LParen ,
305
303
RParen ,
306
304
Comma
@@ -339,15 +337,14 @@ static WellKnownTextTokenizer()
339
337
// build a map of ASCII chars and their types
340
338
// Any unmapped ASCII will be considered whitespace
341
339
// and anything > 0 outside of ASCII will be considered alpha.
342
- // Treat + - and . as digit characters to make parsing numbers easier.
343
340
Chars ( 'a' , 'z' , CharacterType . Alpha ) ;
344
341
Chars ( 'A' , 'Z' , CharacterType . Alpha ) ;
345
342
Chars ( 128 + 32 , 255 , CharacterType . Alpha ) ;
346
- Chars ( '0' , '9' , CharacterType . Digit ) ;
343
+ Chars ( '0' , '9' , CharacterType . Alpha ) ;
347
344
Chars ( LParen , RParen , CharacterType . Alpha ) ;
348
- Chars ( Plus , Plus , CharacterType . Digit ) ;
345
+ Chars ( Plus , Plus , CharacterType . Alpha ) ;
349
346
Chars ( Comma , Comma , CharacterType . Alpha ) ;
350
- Chars ( Minus , Dot , CharacterType . Digit ) ;
347
+ Chars ( Minus , Dot , CharacterType . Alpha ) ;
351
348
Chars ( Comment , Comment , CharacterType . Comment ) ;
352
349
}
353
350
@@ -399,7 +396,6 @@ public string TokenString()
399
396
switch ( TokenType )
400
397
{
401
398
case TokenType . Word :
402
- case TokenType . Number :
403
399
return TokenValue ;
404
400
case TokenType . None :
405
401
return "END-OF-STREAM" ;
@@ -514,33 +510,6 @@ public TokenType NextToken()
514
510
{
515
511
var i = 0 ;
516
512
517
- do
518
- {
519
- _buffer . Insert ( i ++ , ( char ) c ) ;
520
- c = Read ( ) ;
521
-
522
- if ( c < 0 )
523
- characterType = CharacterType . Whitespace ;
524
- else if ( c < CharacterTypesLength )
525
- characterType = CharacterTypes [ c ] ;
526
- else
527
- characterType = CharacterType . Alpha ;
528
- } while ( characterType == CharacterType . Alpha ) ;
529
-
530
- _peekChar = c ;
531
- TokenValue = new string ( _buffer . ToArray ( ) , 0 , i ) ;
532
-
533
- // special case for NaN
534
- if ( string . Equals ( TokenValue , NaN , StringComparison . OrdinalIgnoreCase ) )
535
- return TokenType = TokenType . Number ;
536
-
537
- return TokenType = TokenType . Word ;
538
- }
539
-
540
- if ( characterType == CharacterType . Digit )
541
- {
542
- var i = 0 ;
543
- var dots = 0 ;
544
513
do
545
514
{
546
515
_buffer . Insert ( i ++ , ( char ) c ) ;
@@ -550,20 +519,19 @@ public TokenType NextToken()
550
519
characterType = CharacterType . Whitespace ;
551
520
else if ( c < CharacterTypesLength )
552
521
{
522
+ if ( c == LParen || c == RParen || c == Comma )
523
+ break ;
524
+
553
525
characterType = CharacterTypes [ c ] ;
554
- if ( c == Dot )
555
- dots ++ ;
556
526
}
557
527
else
558
528
characterType = CharacterType . Alpha ;
559
- } while ( characterType == CharacterType . Digit ) ;
529
+ } while ( characterType == CharacterType . Alpha ) ;
560
530
561
531
_peekChar = c ;
562
532
TokenValue = new string ( _buffer . ToArray ( ) , 0 , i ) ;
563
533
564
- return dots > 1
565
- ? TokenType = TokenType . Word
566
- : TokenType = TokenType . Number ;
534
+ return TokenType = TokenType . Word ;
567
535
}
568
536
569
537
if ( characterType == CharacterType . Comment )
0 commit comments