@@ -235,6 +235,7 @@ function kv<T>(
235
235
) : ParserComponent < { [ key : string ] : unknown } > {
236
236
const Separator = character ( separator ) ;
237
237
return ( scanner : Scanner ) : ParseResult < { [ key : string ] : unknown } > => {
238
+ const position = scanner . position ;
238
239
const key = keyParser ( scanner ) ;
239
240
if ( ! key . ok ) return failure ( ) ;
240
241
const sep = Separator ( scanner ) ;
@@ -243,9 +244,12 @@ function kv<T>(
243
244
}
244
245
const value = valueParser ( scanner ) ;
245
246
if ( ! value . ok ) {
246
- throw new SyntaxError (
247
- `Value of key/value pair is invalid data format` ,
248
- ) ;
247
+ const lineEndIndex = scanner . source . indexOf ( "\n" , scanner . position ) ;
248
+ const endPosition = lineEndIndex > 0
249
+ ? lineEndIndex
250
+ : scanner . source . length ;
251
+ const line = scanner . source . slice ( position , endPosition ) ;
252
+ throw new SyntaxError ( `Cannot parse value on line '${ line } '` ) ;
249
253
}
250
254
return success ( unflat ( key . body , value . body ) ) ;
251
255
} ;
@@ -520,7 +524,7 @@ export function symbols(scanner: Scanner): ParseResult<unknown> {
520
524
521
525
export const dottedKey = join ( or ( [ bareKey , basicString , literalString ] ) , "." ) ;
522
526
523
- const BINARY_REGEXP = / 0 b [ 0 1 _ ] + / y;
527
+ const BINARY_REGEXP = / 0 b [ 0 1 ] + (?: _ [ 0 1 ] + ) * \b / y;
524
528
export function binary ( scanner : Scanner ) : ParseResult < number | string > {
525
529
scanner . skipWhitespaces ( ) ;
526
530
const match = scanner . match ( BINARY_REGEXP ) ?. [ 0 ] ;
@@ -531,7 +535,7 @@ export function binary(scanner: Scanner): ParseResult<number | string> {
531
535
return isNaN ( number ) ? failure ( ) : success ( number ) ;
532
536
}
533
537
534
- const OCTAL_REGEXP = / 0 o [ 0 - 7 _ ] + / y;
538
+ const OCTAL_REGEXP = / 0 o [ 0 - 7 ] + (?: _ [ 0 - 7 ] + ) * \b / y;
535
539
export function octal ( scanner : Scanner ) : ParseResult < number | string > {
536
540
scanner . skipWhitespaces ( ) ;
537
541
const match = scanner . match ( OCTAL_REGEXP ) ?. [ 0 ] ;
@@ -542,7 +546,7 @@ export function octal(scanner: Scanner): ParseResult<number | string> {
542
546
return isNaN ( number ) ? failure ( ) : success ( number ) ;
543
547
}
544
548
545
- const HEX_REGEXP = / 0 x [ 0 - 9 a - f _ ] + / yi;
549
+ const HEX_REGEXP = / 0 x [ 0 - 9 a - f ] + (?: _ [ 0 - 9 a - f ] + ) * \b / yi;
546
550
export function hex ( scanner : Scanner ) : ParseResult < number | string > {
547
551
scanner . skipWhitespaces ( ) ;
548
552
const match = scanner . match ( HEX_REGEXP ) ?. [ 0 ] ;
@@ -553,7 +557,7 @@ export function hex(scanner: Scanner): ParseResult<number | string> {
553
557
return isNaN ( number ) ? failure ( ) : success ( number ) ;
554
558
}
555
559
556
- const INTEGER_REGEXP = / [ + - ] ? [ 0 - 9 _ ] + / y;
560
+ const INTEGER_REGEXP = / [ + - ] ? [ 0 - 9 ] + (?: _ [ 0 - 9 ] + ) * \b / y;
557
561
export function integer ( scanner : Scanner ) : ParseResult < number | string > {
558
562
scanner . skipWhitespaces ( ) ;
559
563
const match = scanner . match ( INTEGER_REGEXP ) ?. [ 0 ] ;
@@ -564,7 +568,8 @@ export function integer(scanner: Scanner): ParseResult<number | string> {
564
568
return success ( int ) ;
565
569
}
566
570
567
- const FLOAT_REGEXP = / [ + - ] ? [ 0 - 9 _ ] + (?: \. [ 0 - 9 _ ] + ) ? (?: e [ + - ] ? [ 0 - 9 _ ] + ) ? / yi;
571
+ const FLOAT_REGEXP =
572
+ / [ + - ] ? [ 0 - 9 ] + (?: _ [ 0 - 9 ] + ) * (?: \. [ 0 - 9 ] + (?: _ [ 0 - 9 ] + ) * ) ? (?: e [ + - ] ? [ 0 - 9 ] + (?: _ [ 0 - 9 ] + ) * ) ? \b / yi;
568
573
export function float ( scanner : Scanner ) : ParseResult < number > {
569
574
scanner . skipWhitespaces ( ) ;
570
575
const match = scanner . match ( FLOAT_REGEXP ) ?. [ 0 ] ;
@@ -576,7 +581,7 @@ export function float(scanner: Scanner): ParseResult<number> {
576
581
return success ( float ) ;
577
582
}
578
583
579
- const DATE_TIME_REGEXP = / \d { 4 } - \d { 2 } - \d { 2 } (?: [ 0 - 9 T Z . : + - ] + ) ? / y;
584
+ const DATE_TIME_REGEXP = / \d { 4 } - \d { 2 } - \d { 2 } (?: [ 0 - 9 T Z . : + - ] + ) ? \b / y;
580
585
export function dateTime ( scanner : Scanner ) : ParseResult < Date > {
581
586
scanner . skipWhitespaces ( ) ;
582
587
// example: 1979-05-27
@@ -591,7 +596,7 @@ export function dateTime(scanner: Scanner): ParseResult<Date> {
591
596
return success ( date ) ;
592
597
}
593
598
594
- const LOCAL_TIME_REGEXP = / ( \d { 2 } ) : ( \d { 2 } ) : ( \d { 2 } ) (?: \. [ 0 - 9 ] + ) ? / y;
599
+ const LOCAL_TIME_REGEXP = / ( \d { 2 } ) : ( \d { 2 } ) : ( \d { 2 } ) (?: \. [ 0 - 9 ] + ) ? \b / y;
595
600
export function localTime ( scanner : Scanner ) : ParseResult < string > {
596
601
scanner . skipWhitespaces ( ) ;
597
602
0 commit comments