parseman 0.23.0 → 0.24.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"keywords.d.ts","sourceRoot":"","sources":["../../src/combinators/keywords.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAmD,MAAM,aAAa,CAAA;AAK9F,MAAM,MAAM,eAAe,GAAG;IAC5B,gCAAgC;IAChC,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED;;;;;;;GAOG;AACH,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,SAAe,GAAG,UAAU,CAAC,MAAM,CAAC,CAE7E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,SAAe,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,UAAU,CAAC,MAAM,CAAC,CAErF;AAMD;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,GAAE,eAAoB,GAAG,UAAU,CAAC,MAAM,CAAC,CA2CjG"}
1
+ {"version":3,"file":"keywords.d.ts","sourceRoot":"","sources":["../../src/combinators/keywords.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAmD,MAAM,aAAa,CAAA;AAK9F,MAAM,MAAM,eAAe,GAAG;IAC5B,gCAAgC;IAChC,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED;;;;;;;GAOG;AACH,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,SAAe,GAAG,UAAU,CAAC,MAAM,CAAC,CAE7E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,SAAe,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,UAAU,CAAC,MAAM,CAAC,CAErF;AAMD;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,GAAE,eAAoB,GAAG,UAAU,CAAC,MAAM,CAAC,CA0CjG"}
@@ -1 +1 @@
1
- {"version":3,"file":"literal.d.ts","sourceRoot":"","sources":["../../src/combinators/literal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAyC,MAAM,aAAa,CAAA;AAwBpF,MAAM,MAAM,cAAc,GAAG;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B,CAAA;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,cAAmB,GAAG,UAAU,CAAC,MAAM,CAAC,CAkDpF"}
1
+ {"version":3,"file":"literal.d.ts","sourceRoot":"","sources":["../../src/combinators/literal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAyC,MAAM,aAAa,CAAA;AAwBpF,MAAM,MAAM,cAAc,GAAG;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B,CAAA;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,cAAmB,GAAG,UAAU,CAAC,MAAM,CAAC,CAqEpF"}
@@ -1,4 +1,10 @@
1
1
  import type { Combinator } from '../types.ts';
2
+ /**
3
+ * Non-enumerable key on a `rules()` result holding the factory's declaration
4
+ * order (the returned object's key order), which differs from the result's own
5
+ * reference-creation key order. Read by `parseman/spec` for source-order output.
6
+ */
7
+ export declare const RULE_ORDER = "__parsemanRuleOrder";
2
8
  /**
3
9
  * Define named grammar rules without forward declarations.
4
10
  *
@@ -1 +1 @@
1
- {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/combinators/parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAS7C;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,oFAAoF;IACpF,MAAM,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,CAAA;CAC7B,CAAA;AAKD,wBAAgB,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAA;AAClG,wBAAgB,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAA"}
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/combinators/parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAI7C;;;;GAIG;AACH,eAAO,MAAM,UAAU,wBAAwB,CAAA;AAO/C;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,oFAAoF;IACpF,MAAM,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,CAAA;CAC7B,CAAA;AAKD,wBAAgB,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAA;AAClG,wBAAgB,KAAK,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"regex.d.ts","sourceRoot":"","sources":["../../src/combinators/regex.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAyC,QAAQ,EAAE,MAAM,aAAa,CAAA;AAM9F;;;;;;;;;GASG;AACH,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,eAAe,EAAE,OAAO,CAAA;CAAE,CAAA;AAIzG,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,IAAI,CAE3E;AA2DD,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,SAAK,GAAG,UAAU,CAAC,MAAM,CAAC,CAmC9E"}
1
+ {"version":3,"file":"regex.d.ts","sourceRoot":"","sources":["../../src/combinators/regex.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAyC,QAAQ,EAAE,MAAM,aAAa,CAAA;AAM9F;;;;;;;;;GASG;AACH,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,eAAe,EAAE,OAAO,CAAA;CAAE,CAAA;AAIzG,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,IAAI,CAE3E;AA2DD,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,SAAK,GAAG,UAAU,CAAC,MAAM,CAAC,CAiC9E"}
@@ -1 +1 @@
1
- {"version":3,"file":"trivia-skip.d.ts","sourceRoot":"","sources":["../../src/combinators/trivia-skip.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,YAAY,EAAE,MAAM,aAAa,CAAA;AAc3D;;;;;;GAMG;AACH,MAAM,MAAM,UAAU,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,IAAI,CAAA;CAAE,CAAA;AAE5D,iEAAiE;AACjE,MAAM,MAAM,kBAAkB,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAA;AAM3G,oFAAoF;AACpF,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAEpE;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,YAAY,GAAG,kBAAkB,CAGpE;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,kBAAkB,GAAG,IAAI,CAGhF;AAiBD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,MAAM,CAWnF;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,UAAU,CAkCpF;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,MAAM,CAKnF"}
1
+ {"version":3,"file":"trivia-skip.d.ts","sourceRoot":"","sources":["../../src/combinators/trivia-skip.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,YAAY,EAAE,MAAM,aAAa,CAAA;AAe3D;;;;;;GAMG;AACH,MAAM,MAAM,UAAU,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,IAAI,CAAA;CAAE,CAAA;AAE5D,iEAAiE;AACjE,MAAM,MAAM,kBAAkB,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAA;AAM3G,oFAAoF;AACpF,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAEpE;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,YAAY,GAAG,kBAAkB,CAGpE;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,kBAAkB,GAAG,IAAI,CAGhF;AAiBD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,MAAM,CAWnF;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,UAAU,CAkCpF;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,MAAM,CAKnF"}
package/dist/index.cjs CHANGED
@@ -431,24 +431,35 @@ function literal(value, opts = {}) {
431
431
  { lo: firstUpper, hi: firstUpper }
432
432
  ] } : firstSet2;
433
433
  }
434
+ const expected = [JSON.stringify(value)];
435
+ const parse2 = !caseInsensitive && value.length === 1 ? (() => {
436
+ const code = value.charCodeAt(0);
437
+ return function parse3(input, pos, ctx) {
438
+ if (input.charCodeAt(pos) === code) {
439
+ const span = { start: pos, end: pos + 1 };
440
+ if (cstCaptureActive(ctx)) pushCstLeaf(ctx, { _tag: "leaf", value, span });
441
+ return { ok: true, value, span };
442
+ }
443
+ return failAt(ctx, expected, pos);
444
+ };
445
+ })() : function parse3(input, pos, ctx) {
446
+ const end = pos + value.length;
447
+ if (end > input.length) {
448
+ return failAt(ctx, expected, pos);
449
+ }
450
+ const matchedValue = caseInsensitive ? input.slice(pos, end) : value;
451
+ if (caseInsensitive ? asciiFoldEq(matchedValue, value) : input.startsWith(value, pos)) {
452
+ const span = { start: pos, end };
453
+ if (cstCaptureActive(ctx)) pushCstLeaf(ctx, { _tag: "leaf", value: matchedValue, span });
454
+ return { ok: true, value: matchedValue, span };
455
+ }
456
+ return failAt(ctx, expected, pos);
457
+ };
434
458
  return {
435
459
  _tag: "literal",
436
460
  _meta: meta,
437
461
  _def: { tag: "literal", value, caseInsensitive },
438
- parse(input, pos, ctx) {
439
- const end = pos + value.length;
440
- if (end > input.length) {
441
- return failAt(ctx, [JSON.stringify(value)], pos);
442
- }
443
- const matchedValue = caseInsensitive ? input.slice(pos, end) : value;
444
- if (caseInsensitive ? asciiFoldEq(matchedValue, value) : input.startsWith(value, pos)) {
445
- const span = { start: pos, end };
446
- const leaf = { _tag: "leaf", value: matchedValue, span };
447
- if (cstCaptureActive(ctx)) pushCstLeaf(ctx, leaf);
448
- return { ok: true, value: matchedValue, span };
449
- }
450
- return failAt(ctx, [JSON.stringify(value)], pos);
451
- }
462
+ parse: parse2
452
463
  };
453
464
  }
454
465
 
@@ -583,8 +594,7 @@ function regex(pattern, flags = "") {
583
594
  if (scanEnd === null) return failAt(ctx, [`/${source}/`], pos);
584
595
  const value = input.slice(pos, scanEnd);
585
596
  const span2 = { start: pos, end: scanEnd };
586
- const leaf2 = { _tag: "leaf", value, span: span2 };
587
- if (cstCaptureActive(ctx)) pushCstLeaf(ctx, leaf2);
597
+ if (cstCaptureActive(ctx)) pushCstLeaf(ctx, { _tag: "leaf", value, span: span2 });
588
598
  return { ok: true, value, span: span2 };
589
599
  }
590
600
  anchored.lastIndex = pos;
@@ -593,8 +603,7 @@ function regex(pattern, flags = "") {
593
603
  return failAt(ctx, [`/${source}/`], pos);
594
604
  }
595
605
  const span = { start: pos, end: pos + m[0].length };
596
- const leaf = { _tag: "leaf", value: m[0], span };
597
- if (cstCaptureActive(ctx)) pushCstLeaf(ctx, leaf);
606
+ if (cstCaptureActive(ctx)) pushCstLeaf(ctx, { _tag: "leaf", value: m[0], span });
598
607
  return { ok: true, value: m[0], span };
599
608
  }
600
609
  };
@@ -902,8 +911,7 @@ function keywords(words, opts = {}) {
902
911
  }
903
912
  const value = m[0];
904
913
  const span = { start: pos, end: pos + value.length };
905
- const leaf = { _tag: "leaf", value, span };
906
- if (cstCaptureActive(ctx)) pushCstLeaf(ctx, leaf);
914
+ if (cstCaptureActive(ctx)) pushCstLeaf(ctx, { _tag: "leaf", value, span });
907
915
  return { ok: true, value, span };
908
916
  }
909
917
  };
@@ -1393,33 +1401,136 @@ function loopScanner(arms) {
1393
1401
  }
1394
1402
  function regexTriviaScanner(parser2) {
1395
1403
  if (parser2._def.tag !== "regex" || parser2._def.flags) return null;
1396
- const ws = whitespaceSource(parser2._def.source);
1397
- if (ws) return ws;
1398
- return blockCommentSource(parser2._def.source) ? scanBlockComment : null;
1404
+ const source = parser2._def.source;
1405
+ return classRunSource(source) ?? altStarSource(source) ?? (blockCommentSource(source) ? scanBlockComment : null);
1399
1406
  }
1400
- function whitespaceSource(source) {
1401
- const m = /^\[([ \\tnrf]+)\][*+]$/.exec(source);
1402
- if (!m) return null;
1403
- const chars = /* @__PURE__ */ new Set();
1404
- for (let i = 0; i < m[1].length; i++) {
1405
- const ch = m[1][i];
1406
- if (ch !== "\\") {
1407
- chars.add(ch.charCodeAt(0));
1408
- continue;
1407
+ function inRanges2(cp, ranges) {
1408
+ for (let i = 0; i < ranges.length; i++) {
1409
+ const r = ranges[i];
1410
+ if (cp >= r[0] && cp <= r[1]) return true;
1411
+ }
1412
+ return false;
1413
+ }
1414
+ function classScanner(classBody) {
1415
+ const ranges = parseClassRanges(classBody);
1416
+ if (!ranges) return null;
1417
+ return (input, cur) => {
1418
+ let pos = cur;
1419
+ while (pos < input.length && inRanges2(input.charCodeAt(pos), ranges)) pos++;
1420
+ return pos;
1421
+ };
1422
+ }
1423
+ function lineCommentScanner(commentCode) {
1424
+ return (input, cur) => {
1425
+ if (input.charCodeAt(cur) !== commentCode) return cur;
1426
+ let pos = cur + 1;
1427
+ while (pos < input.length) {
1428
+ const cc = input.charCodeAt(pos);
1429
+ if (cc === 10 || cc === 13) break;
1430
+ pos++;
1409
1431
  }
1410
- const esc = m[1][++i];
1411
- if (esc === "t") chars.add(9);
1412
- else if (esc === "n") chars.add(10);
1413
- else if (esc === "r") chars.add(13);
1414
- else if (esc === "f") chars.add(12);
1415
- else return null;
1432
+ return pos;
1433
+ };
1434
+ }
1435
+ function classRunSource(source) {
1436
+ const m = /^\[([^\]^](?:[^\]]|\\.)*)\][*+]$/.exec(source);
1437
+ return m ? classScanner(m[1]) : null;
1438
+ }
1439
+ function classifyTriviaArm(arm) {
1440
+ const cls = /^\[([^\]^](?:[^\]]|\\.)*)\][*+]?$/.exec(arm);
1441
+ if (cls) {
1442
+ const ranges = parseClassRanges(cls[1]);
1443
+ return ranges ? { kind: "class", ranges } : null;
1444
+ }
1445
+ const lc = /^(\\?.)\[\^\\n\\r\]\*$/.exec(arm);
1446
+ if (lc) {
1447
+ const marker = lc[1];
1448
+ return { kind: "comment", code: (marker.length === 2 ? marker[1] : marker[0]).charCodeAt(0) };
1416
1449
  }
1450
+ return null;
1451
+ }
1452
+ function armScanner(arm) {
1453
+ if (arm.kind === "comment") return lineCommentScanner(arm.code);
1454
+ const ranges = arm.ranges;
1455
+ return (input, cur) => {
1456
+ let pos = cur;
1457
+ while (pos < input.length && inRanges2(input.charCodeAt(pos), ranges)) pos++;
1458
+ return pos;
1459
+ };
1460
+ }
1461
+ function fusedTriviaScanner(ranges, commentCodes) {
1462
+ const c0 = commentCodes[0];
1463
+ const single = commentCodes.length === 1;
1417
1464
  return (input, cur) => {
1418
1465
  let pos = cur;
1419
- while (pos < input.length && chars.has(input.charCodeAt(pos))) pos++;
1466
+ const len = input.length;
1467
+ for (; ; ) {
1468
+ const c = input.charCodeAt(pos);
1469
+ if (pos < len && inRanges2(c, ranges)) {
1470
+ pos++;
1471
+ continue;
1472
+ }
1473
+ if (single ? c === c0 : commentCodes.includes(c)) {
1474
+ pos++;
1475
+ while (pos < len) {
1476
+ const cc = input.charCodeAt(pos);
1477
+ if (cc === 10 || cc === 13) break;
1478
+ pos++;
1479
+ }
1480
+ continue;
1481
+ }
1482
+ break;
1483
+ }
1420
1484
  return pos;
1421
1485
  };
1422
1486
  }
1487
+ function splitTopLevelAlts(body) {
1488
+ const arms = [];
1489
+ let inClass = false;
1490
+ let start = 0;
1491
+ for (let i = 0; i < body.length; i++) {
1492
+ const c = body[i];
1493
+ if (c === "\\") {
1494
+ i++;
1495
+ continue;
1496
+ }
1497
+ if (inClass) {
1498
+ if (c === "]") inClass = false;
1499
+ continue;
1500
+ }
1501
+ if (c === "[") inClass = true;
1502
+ else if (c === "(") return null;
1503
+ else if (c === "|") {
1504
+ arms.push(body.slice(start, i));
1505
+ start = i + 1;
1506
+ }
1507
+ }
1508
+ arms.push(body.slice(start));
1509
+ return arms;
1510
+ }
1511
+ function altStarSource(source) {
1512
+ const m = /^\(\?:(.*)\)[*+]$/.exec(source);
1513
+ if (!m) return null;
1514
+ const armSrcs = splitTopLevelAlts(m[1]);
1515
+ if (!armSrcs || armSrcs.length < 2) return null;
1516
+ const arms = [];
1517
+ for (const src of armSrcs) {
1518
+ const arm = classifyTriviaArm(src);
1519
+ if (!arm) return null;
1520
+ arms.push(arm);
1521
+ }
1522
+ const ranges = [];
1523
+ const commentCodes = [];
1524
+ for (const arm of arms) {
1525
+ if (arm.kind === "class") ranges.push(...arm.ranges);
1526
+ else commentCodes.push(arm.code);
1527
+ }
1528
+ if (commentCodes.some((code) => inRanges2(code, ranges))) {
1529
+ return loopScanner(arms.map(armScanner));
1530
+ }
1531
+ if (commentCodes.length === 0) return armScanner({ kind: "class", ranges });
1532
+ return fusedTriviaScanner(ranges, commentCodes);
1533
+ }
1423
1534
  function blockCommentSource(source) {
1424
1535
  return source === "\\/\\*(?:[^*]|\\*(?!\\/))*\\*\\/" || source === "\\/\\*[^]*?\\*\\/";
1425
1536
  }
@@ -1773,6 +1884,7 @@ function markUnusedValues(root) {
1773
1884
  }
1774
1885
 
1775
1886
  // src/combinators/parser.ts
1887
+ var RULE_ORDER = "__parsemanRuleOrder";
1776
1888
  function tagRule(r, key) {
1777
1889
  ;
1778
1890
  r._ruleName = key;
@@ -1817,6 +1929,11 @@ function rules(a, b) {
1817
1929
  for (const key of Object.keys(definitions)) {
1818
1930
  markUnusedValues(cache[key]);
1819
1931
  }
1932
+ Object.defineProperty(cache, RULE_ORDER, {
1933
+ value: Object.keys(definitions),
1934
+ enumerable: false,
1935
+ configurable: true
1936
+ });
1820
1937
  return cache;
1821
1938
  }
1822
1939