@bablr/agast-helpers 0.11.0 → 0.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/builders.js +90 -7
- package/lib/print.js +7 -5
- package/package.json +1 -1
package/lib/builders.js
CHANGED
|
@@ -402,6 +402,8 @@ export const parseObject = (input) => {
|
|
|
402
402
|
|
|
403
403
|
obj[key] = value;
|
|
404
404
|
|
|
405
|
+
while (chr === ' ') chr = str[++p.idx];
|
|
406
|
+
|
|
405
407
|
sep = chr === ',' ? chr : null;
|
|
406
408
|
if (sep) {
|
|
407
409
|
chr = str[++p.idx];
|
|
@@ -429,13 +431,23 @@ export const parseArray = (input) => {
|
|
|
429
431
|
chr = str[++p.idx];
|
|
430
432
|
}
|
|
431
433
|
|
|
432
|
-
let
|
|
433
|
-
chr
|
|
434
|
+
let first = true;
|
|
435
|
+
while (first || chr === ',') {
|
|
436
|
+
if (!first && chr === ',') {
|
|
437
|
+
chr = str[++p.idx];
|
|
438
|
+
while (chr === ' ') {
|
|
439
|
+
chr = str[++p.idx];
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
let value = parseExpression(p);
|
|
443
|
+
chr = str[p.idx];
|
|
434
444
|
|
|
435
|
-
|
|
445
|
+
arr.push(value);
|
|
436
446
|
|
|
437
|
-
|
|
438
|
-
|
|
447
|
+
while (chr === ' ') {
|
|
448
|
+
chr = str[++p.idx];
|
|
449
|
+
}
|
|
450
|
+
first = false;
|
|
439
451
|
}
|
|
440
452
|
|
|
441
453
|
if (chr !== ']') throw new Error();
|
|
@@ -473,12 +485,31 @@ export const parseString = (input) => {
|
|
|
473
485
|
return result.join('');
|
|
474
486
|
};
|
|
475
487
|
|
|
488
|
+
export const parseDigits = (input) => {
|
|
489
|
+
let p = buildParser(input);
|
|
490
|
+
let { str } = p;
|
|
491
|
+
let chr = str[p.idx];
|
|
492
|
+
let digits = [];
|
|
493
|
+
|
|
494
|
+
while (chr >= '0' && chr <= '9') {
|
|
495
|
+
digits.push(chr);
|
|
496
|
+
chr = str[++p.idx];
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
return parseInt(digits.join(''), 10);
|
|
500
|
+
};
|
|
501
|
+
|
|
476
502
|
export const parseUnsignedInteger = (input) => {
|
|
477
503
|
let p = buildParser(input);
|
|
478
504
|
let { str } = p;
|
|
479
505
|
let chr = str[p.idx];
|
|
480
506
|
let digits = [];
|
|
481
507
|
|
|
508
|
+
if (chr === '0') {
|
|
509
|
+
chr = str[++p.idx];
|
|
510
|
+
return 0;
|
|
511
|
+
}
|
|
512
|
+
|
|
482
513
|
while (chr >= '0' && chr <= '9') {
|
|
483
514
|
digits.push(chr);
|
|
484
515
|
chr = str[++p.idx];
|
|
@@ -487,6 +518,58 @@ export const parseUnsignedInteger = (input) => {
|
|
|
487
518
|
return parseInt(digits.join(''), 10);
|
|
488
519
|
};
|
|
489
520
|
|
|
521
|
+
export const parseInteger = (input) => {
|
|
522
|
+
let p = buildParser(input);
|
|
523
|
+
let { str } = p;
|
|
524
|
+
let chr = str[p.idx];
|
|
525
|
+
let negative = false;
|
|
526
|
+
|
|
527
|
+
if (chr === '-') {
|
|
528
|
+
negative = true;
|
|
529
|
+
chr = str[++p.idx];
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
return parseUnsignedInteger(p) * (negative ? -1 : 1);
|
|
533
|
+
};
|
|
534
|
+
|
|
535
|
+
export const parseNumber = (input) => {
|
|
536
|
+
let p = buildParser(input);
|
|
537
|
+
let { str } = p;
|
|
538
|
+
let chr = str[p.idx];
|
|
539
|
+
let startIdx = p.idx;
|
|
540
|
+
|
|
541
|
+
if (chr === '-') {
|
|
542
|
+
chr = str[++p.idx];
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
if (chr == '0') {
|
|
546
|
+
chr = str[++p.idx];
|
|
547
|
+
} else {
|
|
548
|
+
parseDigits(p);
|
|
549
|
+
chr = str[p.idx];
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
if (chr === '.') {
|
|
553
|
+
chr = str[++p.idx];
|
|
554
|
+
parseDigits(p);
|
|
555
|
+
chr = str[p.idx];
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
if (chr === 'e' || chr === 'E') {
|
|
559
|
+
chr = str[++p.idx];
|
|
560
|
+
|
|
561
|
+
if (chr === '+' || chr === '-') {
|
|
562
|
+
chr = str[++p.idx];
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
parseDigits(p);
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
let endIdx = p.idx;
|
|
569
|
+
|
|
570
|
+
return parseFloat(str.slice(startIdx, endIdx));
|
|
571
|
+
};
|
|
572
|
+
|
|
490
573
|
export const parseEscape = (input) => {
|
|
491
574
|
let p = buildParser(input);
|
|
492
575
|
let { str } = p;
|
|
@@ -601,7 +684,7 @@ export const parseExpression = (input) => {
|
|
|
601
684
|
p.idx += 9;
|
|
602
685
|
return -Infinity;
|
|
603
686
|
} else {
|
|
604
|
-
|
|
687
|
+
return parseNumber(p);
|
|
605
688
|
}
|
|
606
689
|
case '+':
|
|
607
690
|
if (str[p.idx + 1] === 'I' && match(p, '+Infinity')) {
|
|
@@ -612,7 +695,7 @@ export const parseExpression = (input) => {
|
|
|
612
695
|
}
|
|
613
696
|
default:
|
|
614
697
|
if (chr >= '0' && chr <= '9') {
|
|
615
|
-
return
|
|
698
|
+
return parseNumber(p);
|
|
616
699
|
} else {
|
|
617
700
|
throw new Error();
|
|
618
701
|
}
|
package/lib/print.js
CHANGED
|
@@ -13,20 +13,22 @@ import {
|
|
|
13
13
|
StreamTag,
|
|
14
14
|
} from './symbols.js';
|
|
15
15
|
import { parseObject } from './builders.js';
|
|
16
|
+
import { arrayValues } from './iterable.js';
|
|
16
17
|
|
|
17
18
|
let { isInteger, isFinite } = Number;
|
|
18
19
|
let { isArray } = Array;
|
|
19
|
-
let { freeze } = Object;
|
|
20
|
+
let { freeze, entries } = Object;
|
|
20
21
|
let isString = (val) => typeof val === 'string';
|
|
21
22
|
let isNumber = (val) => typeof val === 'number';
|
|
22
23
|
let isObject = (val) => val && typeof val === 'object' && !isArray(val);
|
|
23
24
|
|
|
24
|
-
export const printArray = (arr) =>
|
|
25
|
+
export const printArray = (arr) =>
|
|
26
|
+
`[${[...arrayValues(arr)].map((v) => printExpression(v)).join(', ')}]`;
|
|
25
27
|
|
|
26
28
|
export const printObject = (obj) => {
|
|
27
|
-
let
|
|
28
|
-
return
|
|
29
|
-
? `{ ${
|
|
29
|
+
let entries_ = entries(obj);
|
|
30
|
+
return entries_.length
|
|
31
|
+
? `{ ${entries_.map(([k, v]) => `${k}: ${printExpression(v)}`).join(', ')} }`
|
|
30
32
|
: '{}';
|
|
31
33
|
};
|
|
32
34
|
|