parseman 0.47.0 → 0.47.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.
Files changed (57) hide show
  1. package/dist/analysis/diagnostics.cjs +133 -45
  2. package/dist/analysis/diagnostics.cjs.map +2 -2
  3. package/dist/analysis/diagnostics.js +133 -45
  4. package/dist/analysis/diagnostics.js.map +2 -2
  5. package/dist/cli/index.cjs +133 -45
  6. package/dist/cli/index.cjs.map +2 -2
  7. package/dist/cli/index.js +133 -45
  8. package/dist/cli/index.js.map +2 -2
  9. package/dist/combinators/first-set.d.ts.map +1 -1
  10. package/dist/combinators/sequence.d.ts.map +1 -1
  11. package/dist/combinators/trivia-skip.d.ts +5 -0
  12. package/dist/combinators/trivia-skip.d.ts.map +1 -1
  13. package/dist/index.cjs +134 -46
  14. package/dist/index.cjs.map +2 -2
  15. package/dist/index.js +134 -46
  16. package/dist/index.js.map +2 -2
  17. package/dist/language-service/index.cjs +3 -1
  18. package/dist/language-service/index.cjs.map +1 -1
  19. package/dist/language-service/index.js +3 -1
  20. package/dist/language-service/index.js.map +1 -1
  21. package/dist/plugin/index.cjs +134 -46
  22. package/dist/plugin/index.cjs.map +2 -2
  23. package/dist/plugin/index.js +134 -46
  24. package/dist/plugin/index.js.map +2 -2
  25. package/dist/spec/index.cjs +55 -7
  26. package/dist/spec/index.cjs.map +1 -1
  27. package/dist/spec/index.js +55 -7
  28. package/dist/spec/index.js.map +1 -1
  29. package/dist/table/assemble.d.ts.map +1 -1
  30. package/dist/table/emit-assembly.d.ts +2 -2
  31. package/dist/table/emit-assembly.d.ts.map +1 -1
  32. package/dist/table/emit.d.ts.map +1 -1
  33. package/dist/table/exec.d.ts.map +1 -1
  34. package/dist/table/index.cjs +1566 -1478
  35. package/dist/table/index.cjs.map +3 -3
  36. package/dist/table/index.js +1566 -1478
  37. package/dist/table/index.js.map +3 -3
  38. package/dist/table/ops.d.ts +8 -1
  39. package/dist/table/ops.d.ts.map +1 -1
  40. package/dist/table/program.d.ts +4 -1
  41. package/dist/table/program.d.ts.map +1 -1
  42. package/dist/version.d.ts +1 -1
  43. package/package.json +2 -1
  44. package/src/combinators/first-set.ts +29 -3
  45. package/src/combinators/sequence.ts +23 -7
  46. package/src/combinators/trivia-skip.ts +31 -0
  47. package/src/table/assemble.ts +30 -18
  48. package/src/table/child-slots.ts +2 -2
  49. package/src/table/emit-assembly.ts +36 -25
  50. package/src/table/emit.ts +12 -1
  51. package/src/table/encode.ts +4 -4
  52. package/src/table/exec.ts +20 -12
  53. package/src/table/ops.ts +9 -1
  54. package/src/table/program.ts +22 -1
  55. package/src/table/site-labels.ts +2 -2
  56. package/src/table/stamp.ts +2 -2
  57. package/src/version.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"first-set.d.ts","sourceRoot":"","sources":["../../src/combinators/first-set.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,QAAQ,EAAE,UAAU,EAAa,MAAM,aAAa,CAAA;AAE7E;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,UAAU,CAAC,OAAO,CAAC,GAAG,SAAS,CAAA;AAS3E,wBAAgB,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAKxD;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,CAS5D;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAE/C;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAQnG;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,QAAQ,CAE1D;AAED,wBAAgB,GAAG,IAAI,QAAQ,CAE9B;AAED,wBAAgB,KAAK,IAAI,QAAQ,CAEhC;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,EACtB,IAAI,GAAE,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAa,EAC1C,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAgDT;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,OAAO,CAMpE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,OAAO,CAEnE;AA6BD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,SAAS,UAAU,CAAC,OAAO,CAAC,EAAE,GAAG,QAAQ,CAalF;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,UAAU,CACxB,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,EACtB,IAAI,GAAE,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAa,EAC1C,OAAO,CAAC,EAAE,WAAW,GACpB,QAAQ,CAsDV"}
1
+ {"version":3,"file":"first-set.d.ts","sourceRoot":"","sources":["../../src/combinators/first-set.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,QAAQ,EAAE,UAAU,EAAa,MAAM,aAAa,CAAA;AAE7E;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,UAAU,CAAC,OAAO,CAAC,GAAG,SAAS,CAAA;AAS3E,wBAAgB,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAKxD;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,CAS5D;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAE/C;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAQnG;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,QAAQ,CAE1D;AAED,wBAAgB,GAAG,IAAI,QAAQ,CAE9B;AAED,wBAAgB,KAAK,IAAI,QAAQ,CAEhC;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,EACtB,IAAI,GAAE,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAa,EAC1C,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAWT;AAmDD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,OAAO,CAMpE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,OAAO,CAEnE;AA6BD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,SAAS,UAAU,CAAC,OAAO,CAAC,EAAE,GAAG,QAAQ,CAalF;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,UAAU,CACxB,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,EACtB,IAAI,GAAE,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAa,EAC1C,OAAO,CAAC,EAAE,WAAW,GACpB,QAAQ,CAUV"}
@@ -1 +1 @@
1
- {"version":3,"file":"sequence.d.ts","sourceRoot":"","sources":["../../src/combinators/sequence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAoD,MAAM,aAAa,CAAA;AAM/F,KAAK,aAAa,CAAC,CAAC,SAAS,UAAU,CAAC,OAAO,CAAC,EAAE,IAAI;KACnD,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;CAC7D,CAAA;AAED,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,EAChF,GAAG,OAAO,EAAE,CAAC,GACZ,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAgN9B"}
1
+ {"version":3,"file":"sequence.d.ts","sourceRoot":"","sources":["../../src/combinators/sequence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAoD,MAAM,aAAa,CAAA;AAO/F,KAAK,aAAa,CAAC,CAAC,SAAS,UAAU,CAAC,OAAO,CAAC,EAAE,IAAI;KACnD,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;CAC7D,CAAA;AAED,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,EAChF,GAAG,OAAO,EAAE,CAAC,GACZ,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CA+N9B"}
@@ -32,6 +32,11 @@ export declare function saveTriviaMark(ctx: ParseContext): TriviaRollbackMark;
32
32
  */
33
33
  export declare function rollbackTriviaAt(ctx: ParseContext, raw: number, tlog: number, leaves: number, fields: number, errors: number, log: number, rootLog: number): void;
34
34
  export declare function rollbackTrivia(ctx: ParseContext, mark: TriviaRollbackMark): void;
35
+ /**
36
+ * Remove only the trivia rows appended by an ambient scan, preserving effects
37
+ * appended later by a successful zero-width child.
38
+ */
39
+ export declare function rollbackScannedTriviaAt(ctx: ParseContext, tlogStart: number, tlogEnd: number, logStart: number, logEnd: number, rootLogStart: number, rootLogEnd: number): void;
35
40
  /**
36
41
  * A ZERO-WIDTH LOOKAHEAD's mark: everything `saveTriviaMark` covers, plus the
37
42
  * completions probe's current best failure.
@@ -1 +1 @@
1
- {"version":3,"file":"trivia-skip.d.ts","sourceRoot":"","sources":["../../src/combinators/trivia-skip.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAe,MAAM,aAAa,CAAA;AAmBnF;;;;;;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,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAA;AAG5I,MAAM,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;AAmBtE,oFAAoF;AACpF,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAEpE;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,YAAY,GAAG,kBAAkB,CAWpE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,YAAY,EACjB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,GACd,IAAI,CAIN;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,kBAAkB,GAAG,IAAI,CAKhF;AAiBD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,aAAa,GAAG,kBAAkB,GAAG;IAAE,SAAS,EAAE,SAAS,GAAG,IAAI,CAAA;CAAE,CAAA;AAEhF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,YAAY,GAAG,aAAa,CAElE;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,CAG9E;AA0ED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,MAAM,CAwBnF;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,UAAU,CAoGpF;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,CAAC,EAAE,iBAAiB,EACpB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,YAAY,GAChB,MAAM,CAUR;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,MAAM,CAKnF;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,MAAM,CAcpF;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,iBAAiB,GAAG,IAAI,CAevF"}
1
+ {"version":3,"file":"trivia-skip.d.ts","sourceRoot":"","sources":["../../src/combinators/trivia-skip.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAe,MAAM,aAAa,CAAA;AAmBnF;;;;;;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,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAA;AAG5I,MAAM,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;AAmBtE,oFAAoF;AACpF,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAEpE;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,YAAY,GAAG,kBAAkB,CAWpE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,YAAY,EACjB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,GACd,IAAI,CAIN;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,kBAAkB,GAAG,IAAI,CAKhF;AAQD;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,YAAY,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,GACjB,IAAI,CAWN;AAiBD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,aAAa,GAAG,kBAAkB,GAAG;IAAE,SAAS,EAAE,SAAS,GAAG,IAAI,CAAA;CAAE,CAAA;AAEhF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,YAAY,GAAG,aAAa,CAElE;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,CAG9E;AA0ED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,MAAM,CAwBnF;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,UAAU,CAoGpF;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,CAAC,EAAE,iBAAiB,EACpB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,YAAY,GAChB,MAAM,CAUR;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,MAAM,CAKnF;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,MAAM,CAcpF;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,iBAAiB,GAAG,IAAI,CAevF"}
package/dist/index.cjs CHANGED
@@ -177,6 +177,13 @@ function empty() {
177
177
  function matchesEmpty(p, seen = /* @__PURE__ */ new Set(), resolve) {
178
178
  if (seen.has(p)) return true;
179
179
  seen.add(p);
180
+ try {
181
+ return matchesEmptyBody(p, seen, resolve);
182
+ } finally {
183
+ seen.delete(p);
184
+ }
185
+ }
186
+ function matchesEmptyBody(p, seen, resolve) {
180
187
  const me = (c) => matchesEmpty(c, seen, resolve);
181
188
  const d = p._def;
182
189
  switch (d.tag) {
@@ -278,6 +285,13 @@ function sequenceFirstSet(parsers) {
278
285
  function firstSetOf(p, seen = /* @__PURE__ */ new Set(), resolve) {
279
286
  if (seen.has(p)) return any();
280
287
  seen.add(p);
288
+ try {
289
+ return firstSetBody(p, seen, resolve);
290
+ } finally {
291
+ seen.delete(p);
292
+ }
293
+ }
294
+ function firstSetBody(p, seen, resolve) {
281
295
  const fs = (c) => firstSetOf(c, seen, resolve);
282
296
  const empties = (c) => matchesEmpty(c, /* @__PURE__ */ new Set(), resolve);
283
297
  const d = p._def;
@@ -1769,6 +1783,23 @@ function rollbackTrivia(ctx, mark) {
1769
1783
  if (ctx._triviaLog && ctx._triviaLog.length !== mark.log) ctx._triviaLog.length = mark.log;
1770
1784
  if (ctx._rootTriviaLog && ctx._rootTriviaLog.length !== mark.rootLog) ctx._rootTriviaLog.length = mark.rootLog;
1771
1785
  }
1786
+ function removeNumberRange(values, start, end) {
1787
+ if (values === void 0 || end <= start) return;
1788
+ if (values.length > end) values.copyWithin(start, end);
1789
+ values.length -= end - start;
1790
+ }
1791
+ function rollbackScannedTriviaAt(ctx, tlogStart, tlogEnd, logStart, logEnd, rootLogStart, rootLogEnd) {
1792
+ const b = ctx._cstBuf;
1793
+ if (b !== void 0) {
1794
+ const tlog = b.tl;
1795
+ removeNumberRange(tlog, tlogStart, tlogEnd);
1796
+ if (tlog !== void 0 && tlog.length === 0) b.tl = void 0;
1797
+ } else {
1798
+ removeNumberRange(ctx._cstTriviaLog, tlogStart, tlogEnd);
1799
+ }
1800
+ removeNumberRange(ctx._triviaLog, logStart, logEnd);
1801
+ removeNumberRange(ctx._rootTriviaLog, rootLogStart, rootLogEnd);
1802
+ }
1772
1803
  function parseTriviaNoCapture(triviaP, input, cur, ctx) {
1773
1804
  const probeCtx = createDetachedParseContext(ctx.trackLines, ctx.state);
1774
1805
  probeCtx._lineIndex = ctx._lineIndex;
@@ -2473,7 +2504,9 @@ function sequence(...parsers) {
2473
2504
  continue;
2474
2505
  }
2475
2506
  if (ctx.trivia && i > 0) {
2476
- const mark = saveTriviaMark(ctx);
2507
+ const mTlog = cstTlLen(ctx);
2508
+ const mLog = ctx._triviaLog?.length ?? 0;
2509
+ const mRootLog = ctx._rootTriviaLog?.length ?? 0;
2477
2510
  let scanEnd;
2478
2511
  if (needsDeferredTriviaCommit(ctx)) {
2479
2512
  const scan = scanTrivia(input, cur, ctx);
@@ -2482,10 +2515,13 @@ function sequence(...parsers) {
2482
2515
  } else {
2483
2516
  scanEnd = advanceTrivia(input, cur, ctx);
2484
2517
  }
2518
+ const scanTlog = cstTlLen(ctx);
2519
+ const scanLog = ctx._triviaLog?.length ?? 0;
2520
+ const scanRootLog = ctx._rootTriviaLog?.length ?? 0;
2485
2521
  const result2 = parsers[i].parse(input, scanEnd, ctx);
2486
2522
  if (!result2.ok) return result2;
2487
2523
  if (result2.span.end > scanEnd) cur = result2.span.end;
2488
- else rollbackTrivia(ctx, mark);
2524
+ else rollbackScannedTriviaAt(ctx, mTlog, scanTlog, mLog, scanLog, mRootLog, scanRootLog);
2489
2525
  if (values !== void 0) values.push(result2.value);
2490
2526
  continue;
2491
2527
  }
@@ -2516,7 +2552,9 @@ function sequence(...parsers) {
2516
2552
  }
2517
2553
  if (ctx.trivia && i > 0) {
2518
2554
  let scanEnd;
2519
- const mark = saveTriviaMark(ctx);
2555
+ const mTlog = cstTlLen(ctx);
2556
+ const mLog = ctx._triviaLog?.length ?? 0;
2557
+ const mRootLog = ctx._rootTriviaLog?.length ?? 0;
2520
2558
  if (needsDeferredTriviaCommit(ctx)) {
2521
2559
  const scan = scanTrivia(input, cur, ctx);
2522
2560
  scan.commit();
@@ -2524,10 +2562,13 @@ function sequence(...parsers) {
2524
2562
  } else {
2525
2563
  scanEnd = advanceTrivia(input, cur, ctx);
2526
2564
  }
2565
+ const scanTlog = cstTlLen(ctx);
2566
+ const scanLog = ctx._triviaLog?.length ?? 0;
2567
+ const scanRootLog = ctx._rootTriviaLog?.length ?? 0;
2527
2568
  const result2 = parsers[i].parse(input, scanEnd, ctx);
2528
2569
  if (!result2.ok) return result2;
2529
2570
  if (result2.span.end > scanEnd) cur = result2.span.end;
2530
- else rollbackTrivia(ctx, mark);
2571
+ else rollbackScannedTriviaAt(ctx, mTlog, scanTlog, mLog, scanLog, mRootLog, scanRootLog);
2531
2572
  if (values !== void 0) values.push(result2.value);
2532
2573
  continue;
2533
2574
  }
@@ -2555,7 +2596,9 @@ function sequence(...parsers) {
2555
2596
  for (let i = 0; i < parsers.length; i++) {
2556
2597
  if (ctx.trivia && i > 0) {
2557
2598
  let scanEnd;
2558
- let mark = saveTriviaMark(ctx);
2599
+ const mTlog = cstTlLen(ctx);
2600
+ const mLog = ctx._triviaLog?.length ?? 0;
2601
+ const mRootLog = ctx._rootTriviaLog?.length ?? 0;
2559
2602
  if (needsDeferredTriviaCommit(ctx)) {
2560
2603
  const scan = scanTrivia(input, cur, ctx);
2561
2604
  scan.commit();
@@ -2563,12 +2606,15 @@ function sequence(...parsers) {
2563
2606
  } else {
2564
2607
  scanEnd = advanceTrivia(input, cur, ctx);
2565
2608
  }
2609
+ const scanTlog = cstTlLen(ctx);
2610
+ const scanLog = ctx._triviaLog?.length ?? 0;
2611
+ const scanRootLog = ctx._rootTriviaLog?.length ?? 0;
2566
2612
  const result2 = parsers[i].parse(input, scanEnd, ctx);
2567
2613
  if (!result2.ok) return result2;
2568
2614
  if (result2.span.end > scanEnd) {
2569
2615
  cur = result2.span.end;
2570
2616
  } else {
2571
- rollbackTrivia(ctx, mark);
2617
+ rollbackScannedTriviaAt(ctx, mTlog, scanTlog, mLog, scanLog, mRootLog, scanRootLog);
2572
2618
  }
2573
2619
  if (values !== void 0) values.push(result2.value);
2574
2620
  continue;
@@ -5190,6 +5236,7 @@ var OP_LIVE = 37;
5190
5236
  var OP_ATTEMPT = 38;
5191
5237
  var OP_LABEL = 39;
5192
5238
  var OP_COV = 40;
5239
+ var OP_SCOPE_PLAIN = 41;
5193
5240
  var OP_DISPATCH = 25;
5194
5241
  var OP_ROUTED = 26;
5195
5242
  var OP_NAMES = {
@@ -5232,7 +5279,8 @@ var OP_NAMES = {
5232
5279
  [OP_LIVE]: "LIVE",
5233
5280
  [OP_ATTEMPT]: "ATTEMPT",
5234
5281
  [OP_LABEL]: "LABEL",
5235
- [OP_COV]: "COV"
5282
+ [OP_COV]: "COV",
5283
+ [OP_SCOPE_PLAIN]: "SCOPE_PLAIN"
5236
5284
  };
5237
5285
 
5238
5286
  // src/table/program.ts
@@ -5290,6 +5338,15 @@ function expandCompact(p) {
5290
5338
  ...p.a === void 0 ? {} : { asm: p.a }
5291
5339
  });
5292
5340
  }
5341
+ function validateDispatchSpec(spec, arity, fallbackRouted) {
5342
+ const invalid = (arms) => {
5343
+ for (const arm of arms) if (!Number.isInteger(arm) || arm < 0 || arm >= arity) return true;
5344
+ return false;
5345
+ };
5346
+ if (spec === void 0 || !Number.isInteger(arity) || arity < 0 || fallbackRouted !== 0 && fallbackRouted !== 1 || spec.routed.length !== arity || spec.routed.some((value) => value !== 0 && value !== 1) || invalid(spec.byKey.values()) || invalid(spec.byFold.values()) || spec.match.some((matcher) => invalid([matcher[3]]))) {
5347
+ throw new TypeError("table: malformed dispatch");
5348
+ }
5349
+ }
5293
5350
  var TABLE_RUNTIME = /* @__PURE__ */ Symbol("parseman.tableRuntime");
5294
5351
  function ownTableProgram(prog, resolved) {
5295
5352
  return { ...prog, [TABLE_RUNTIME]: { resolved } };
@@ -5848,7 +5905,7 @@ var Encoder = class {
5848
5905
  this.carryTriviaMeta(amb);
5849
5906
  this.carryTriviaMeta(p);
5850
5907
  if (p._def.tag === "grammar") this.carryTriviaMeta(p._def.triviaParser);
5851
- this.rules[name] = amb === void 0 ? body : this.emit(OP_SCOPE, this.triviaSlot(amb), body);
5908
+ this.rules[name] = amb === void 0 ? body : this.emit(OP_SCOPE_PLAIN, this.triviaSlot(amb), body);
5852
5909
  }
5853
5910
  /**
5854
5911
  * The row a cross-rule `g.X` reference jumps to — the target's body, RE-WRAPPED
@@ -5891,7 +5948,7 @@ var Encoder = class {
5891
5948
  const amb = p._meta.grammarTrivia ?? target._meta.grammarTrivia;
5892
5949
  if (amb === void 0 || this.activeTrivia !== void 0) return ip;
5893
5950
  if (!hasOwnTriviaBoundary(target)) return ip;
5894
- return this.emit(OP_SCOPE, this.triviaSlot(amb), ip);
5951
+ return this.emit(OP_SCOPE_PLAIN, this.triviaSlot(amb), ip);
5895
5952
  }
5896
5953
  node(p) {
5897
5954
  const lazyRef = p._def.tag === "lazy";
@@ -6296,6 +6353,7 @@ var Encoder = class {
6296
6353
  return [ip + 1];
6297
6354
  case OP_SCOPE:
6298
6355
  case OP_SCOPE_CAP:
6356
+ case OP_SCOPE_PLAIN:
6299
6357
  case OP_WITHCTX:
6300
6358
  case OP_XFORM:
6301
6359
  case OP_LEAF:
@@ -7489,6 +7547,7 @@ function childSlots(code, ip, out) {
7489
7547
  case OP_GATE:
7490
7548
  case OP_SCOPE:
7491
7549
  case OP_SCOPE_CAP:
7550
+ case OP_SCOPE_PLAIN:
7492
7551
  case OP_WITHCTX:
7493
7552
  case OP_XFORM:
7494
7553
  case OP_NODE:
@@ -7577,7 +7636,7 @@ function reachableSites(code, roots) {
7577
7636
  }
7578
7637
  function transfer(code, ip, at, hostCst) {
7579
7638
  const op = code[ip];
7580
- if (op === OP_SCOPE || op === OP_SCOPE_CAP) {
7639
+ if (op === OP_SCOPE || op === OP_SCOPE_CAP || op === OP_SCOPE_PLAIN) {
7581
7640
  const ki = code[ip + 1];
7582
7641
  const tri = ki < 0 ? TRI_NONE : ki;
7583
7642
  const cap = op === OP_SCOPE_CAP ? CAP_ON : at.cap;
@@ -7658,6 +7717,7 @@ var EMITTED_PARAMS = [
7658
7717
  "pushCstLeaf",
7659
7718
  "pushCstChild",
7660
7719
  "rollbackTriviaAt",
7720
+ "rollbackScannedTriviaAt",
7661
7721
  "failAt",
7662
7722
  "classHas",
7663
7723
  "consumeTrivia",
@@ -7801,19 +7861,24 @@ if(ctx._errors!==undefined&&ctx._errors.length!==${t}er)ctx._errors.length=${t}e
7801
7861
  if (!s.fd && !s.er) return `if(${t}n)rollbackTriviaAt(ctx,${t}raw,${t}tl,${t}lv,0,undefined,${t}lg,${t}rt)`;
7802
7862
  return `if(${t}n){rollbackTriviaAt(ctx,${t}raw,${t}tl,${t}lv,${s.fd ? `${t}fd` : "0"},${s.er ? `${t}er` : "undefined"},${t}lg,${t}rt)}`;
7803
7863
  }
7804
- function emitTerm(callee, dst, t, l, skip, s) {
7864
+ function emitTerm(callee, dst, t, l, skip) {
7805
7865
  const fast = `const ${t}v=${callee}(input,cur,ctx)
7806
7866
  if(${t}v===FAIL)return FAIL
7807
7867
  ${dst}=${t}v
7808
7868
  cur=EC.e`;
7809
7869
  if (l.tri === TRI_NONE) return fast;
7810
- const scanned = `${emitMark(t, l.buf, s)}
7870
+ const scanned = `const ${t}tl=ctx._cstBuf!==undefined?(ctx._cstBuf.tl!==undefined?ctx._cstBuf.tl.length:0):(ctx._cstTriviaLog!==undefined?ctx._cstTriviaLog.length:0)
7871
+ const ${t}lg=ctx._triviaLog!==undefined?ctx._triviaLog.length:0
7872
+ const ${t}rt=ctx._rootTriviaLog!==undefined?ctx._rootTriviaLog.length:0
7811
7873
  const ${t}s=${skip}(input,cur,ctx)
7874
+ const ${t}stl=ctx._cstBuf!==undefined?(ctx._cstBuf.tl!==undefined?ctx._cstBuf.tl.length:0):(ctx._cstTriviaLog!==undefined?ctx._cstTriviaLog.length:0)
7875
+ const ${t}slg=ctx._triviaLog!==undefined?ctx._triviaLog.length:0
7876
+ const ${t}srt=ctx._rootTriviaLog!==undefined?ctx._rootTriviaLog.length:0
7812
7877
  const ${t}v=${callee}(input,${t}s,ctx)
7813
7878
  if(${t}v===FAIL)return FAIL
7814
7879
  ${dst}=${t}v
7815
7880
  if(EC.e>${t}s)cur=EC.e
7816
- else{${emitRollback(t, l.buf, s)}}`;
7881
+ else{rollbackScannedTriviaAt(ctx,${t}tl,${t}stl,${t}lg,${t}slg,${t}rt,${t}srt)}`;
7817
7882
  if (l.tri !== TRI_UNKNOWN) return scanned;
7818
7883
  return `if(ctx.trivia===undefined){
7819
7884
  ${fast}
@@ -7976,7 +8041,7 @@ ${cfg.probe ? `failAt(ctx,${xf},pos)
7976
8041
  const op = code[ip];
7977
8042
  if (op === OP_GATE && (cfg.tolerant || cfg.probe)) return code[ip + 2];
7978
8043
  if (op === OP_RULE) return code[ip + 1];
7979
- if (op === OP_SCOPE && code[ip + 3] === 0 && code[ip + 1] >= 0 && labels.at(ip).tri === code[ip + 1]) {
8044
+ if ((op === OP_SCOPE_PLAIN || op === OP_SCOPE && code[ip + 3] === 0) && code[ip + 1] >= 0 && labels.at(ip).tri === code[ip + 1]) {
7980
8045
  return code[ip + 2];
7981
8046
  }
7982
8047
  return void 0;
@@ -8144,10 +8209,11 @@ return r.value
8144
8209
  }`;
8145
8210
  }
8146
8211
  case OP_SCOPE:
8147
- case OP_SCOPE_CAP: {
8212
+ case OP_SCOPE_CAP:
8213
+ case OP_SCOPE_PLAIN: {
8148
8214
  const ki = code[ip + 1];
8149
8215
  const cap = op === OP_SCOPE_CAP;
8150
- const flags = code[ip + 3];
8216
+ const flags = op === OP_SCOPE_PLAIN ? 0 : code[ip + 3];
8151
8217
  const child = link(code[ip + 2]);
8152
8218
  const scanFor = swapLegal && ki >= 0 && !triviaLabelled[ki] ? hoist("ts", `TRIVIASCAN[${ki}]`) : "null";
8153
8219
  const tri = ki < 0 ? "undefined" : hoist("tv", `TRIVIA[${ki}]`);
@@ -8301,7 +8367,7 @@ return v
8301
8367
  const vn = `v${i}`;
8302
8368
  parts.push(`let ${vn}`);
8303
8369
  if (REC2) parts.push(pub(i));
8304
- parts.push(emitTerm(kids[i], vn, tmp(), L, skipFor(L), sinks));
8370
+ parts.push(emitTerm(kids[i], vn, tmp(), L, skipFor(L)));
8305
8371
  names.push(vn);
8306
8372
  }
8307
8373
  parts.push("EC.e=cur");
@@ -8402,11 +8468,11 @@ return FAIL
8402
8468
  const other = otherIp >= 0 ? link(otherIp) : void 0;
8403
8469
  const otherRouted = code[ip + 4] === 1;
8404
8470
  const n = code[ip + 5];
8471
+ validateDispatchSpec(spec, n, code[ip + 4]);
8405
8472
  const armBase = ip + 6;
8406
8473
  const arms = [];
8407
8474
  for (let i = 0; i < n; i++) arms.push(link(code[armBase + i]));
8408
8475
  const bk = hoist("bk", `DSP[${di}].byKey`);
8409
- const rt = hoist("rt", `DSP[${di}].routed`);
8410
8476
  const dx = hoist("dx", `DSP[${di}].expected`);
8411
8477
  const claims = (m) => {
8412
8478
  switch (m[0]) {
@@ -8430,6 +8496,15 @@ ${spec.match.map((m, i) => `${i === 0 ? "" : "else "}if(${claims(m)})arm=${m[3]}
8430
8496
  ` : "";
8431
8497
  const m1 = tmp();
8432
8498
  const m2 = tmp();
8499
+ const routedCall = (target) => `{const savedRouted=ctx._routed
8500
+ ${emitRollback(m1, L.buf, sinks)}
8501
+ ${emitMark(m2, L.buf, sinks, false)}
8502
+ ctx._routed={value:key,span:{start:pos,end:selEnd}}
8503
+ try{v=${target}(input,pos,ctx)}finally{ctx._routed=savedRouted}
8504
+ break}`;
8505
+ const plainCall = (target) => `v=${target}(input,selEnd,ctx);break`;
8506
+ const armCases = arms.map((target, i) => `case ${i}:${spec.routed[i] === 1 ? routedCall(target) : plainCall(target)}`).join("\n");
8507
+ const fallbackCase = other === void 0 ? "" : `default:${otherRouted ? routedCall(other) : plainCall(other)}`;
8433
8508
  return `${head}
8434
8509
  ${emitMark(m1, L.buf, sinks)}
8435
8510
  const sv=${selector}(input,pos,ctx)
@@ -8437,24 +8512,16 @@ if(sv===FAIL)return FAIL
8437
8512
  const selEnd=EC.e
8438
8513
  const key=sv
8439
8514
  let arm=${bk}.get(key)
8440
- ${fold}${chain}let ur
8515
+ ${fold}${chain}
8441
8516
  if(arm===undefined){
8442
- ${other === void 0 ? `ctx._fe=selEnd;ctx._fx=${dx};return FAIL` : `ur=${String(otherRouted)}`}
8443
- }else ur=${rt}[arm]===1
8444
- const savedRouted=ctx._routed
8445
- ${emitMark(m2, L.buf, sinks)}
8446
- if(ur){
8447
- ${emitRollback(m1, L.buf, sinks)}
8448
- ${emitMark(m2, L.buf, sinks, false)}
8449
- ctx._routed={value:key,span:{start:pos,end:selEnd}}
8517
+ ${other === void 0 ? `ctx._fe=selEnd;ctx._fx=${dx};return FAIL` : ""}
8450
8518
  }
8451
- const at=ur?pos:selEnd
8519
+ ${emitMark(m2, L.buf, sinks)}
8452
8520
  let v
8453
8521
  switch(arm){
8454
- ${arms.map((a, i) => `case ${i}:v=${a}(input,at,ctx);break`).join("\n")}
8455
- ${other === void 0 ? "" : `default:v=${other}(input,at,ctx)`}
8522
+ ${armCases}
8523
+ ${fallbackCase}
8456
8524
  }
8457
- if(ur)ctx._routed=savedRouted
8458
8525
  if(v===FAIL){
8459
8526
  ${emitRollback(m2, L.buf, sinks)}
8460
8527
  ctx._fc=true
@@ -8930,7 +8997,7 @@ function committed(c) {
8930
8997
  }
8931
8998
  function stampRuleMap(prog, d, artifactMetadata = {}, resolved = resolveTable(prog)) {
8932
8999
  const triviaOfRule = (ip) => {
8933
- if (prog.code[ip] !== OP_SCOPE) return void 0;
9000
+ if (prog.code[ip] !== OP_SCOPE_PLAIN && prog.code[ip] !== OP_SCOPE) return void 0;
8934
9001
  const slot = prog.code[ip + 1];
8935
9002
  return slot < 0 ? void 0 : resolved.trivia[slot];
8936
9003
  };
@@ -9144,20 +9211,19 @@ function assemble(t, prog, cfg) {
9144
9211
  TERMV = v2;
9145
9212
  return EC.e > scanEnd2 ? EC.e : cur;
9146
9213
  }
9147
- const need = markCst(ctx);
9148
- const mRaw = MRAW;
9149
- const mTl = MTL;
9150
- const mLv = MLV;
9151
- const mFl = need ? ctx._fields?.length ?? 0 : 0;
9152
- const mEr = need ? ctx._errors?.length ?? 0 : 0;
9214
+ const need = rollbackNeeded(ctx);
9215
+ const mTl = need ? cstTlLen(ctx) : 0;
9153
9216
  const mLog = need ? ctx._triviaLog?.length ?? 0 : 0;
9154
9217
  const mRoot = need ? ctx._rootTriviaLog?.length ?? 0 : 0;
9155
9218
  const scanEnd = skipTrivia(input, cur, ctx);
9219
+ const scanTl = need ? cstTlLen(ctx) : 0;
9220
+ const scanLog = need ? ctx._triviaLog?.length ?? 0 : 0;
9221
+ const scanRoot = need ? ctx._rootTriviaLog?.length ?? 0 : 0;
9156
9222
  const v = child(input, scanEnd, ctx);
9157
9223
  if (v === FAIL) return -1;
9158
9224
  TERMV = v;
9159
9225
  if (EC.e > scanEnd) return EC.e;
9160
- if (need) rollbackTriviaAt(ctx, mRaw, mTl, mLv, mFl, mEr, mLog, mRoot);
9226
+ if (need) rollbackScannedTriviaAt(ctx, mTl, scanTl, mLog, scanLog, mRoot, scanRoot);
9161
9227
  return cur;
9162
9228
  }
9163
9229
  function committed2(c) {
@@ -9571,7 +9637,8 @@ function assemble(t, prog, cfg) {
9571
9637
  };
9572
9638
  }
9573
9639
  case OP_SCOPE:
9574
- case OP_SCOPE_CAP: {
9640
+ case OP_SCOPE_CAP:
9641
+ case OP_SCOPE_PLAIN: {
9575
9642
  const ki = code[ip + 1];
9576
9643
  const scopeTrivia = ki < 0 ? void 0 : trivia2[ki];
9577
9644
  const scopeLabels = scopeTrivia?._meta.triviaKindLabels;
@@ -9605,7 +9672,7 @@ function assemble(t, prog, cfg) {
9605
9672
  SCAN = savedScan;
9606
9673
  return v;
9607
9674
  };
9608
- return scopeRootPolicy(scopePiece, code[ip + 3]);
9675
+ return scopeRootPolicy(scopePiece, code[ip] === OP_SCOPE_PLAIN ? 0 : code[ip + 3]);
9609
9676
  }
9610
9677
  case OP_ROUTED: {
9611
9678
  const fb = code[ip + 1];
@@ -10521,15 +10588,21 @@ function assemble(t, prog, cfg) {
10521
10588
  target = arms[arm];
10522
10589
  usesRouted = routed2[arm] === 1;
10523
10590
  }
10524
- const savedRouted = ctx._routed;
10525
10591
  let mark = saveTriviaMark(ctx);
10592
+ let v;
10526
10593
  if (usesRouted) {
10594
+ const savedRouted = ctx._routed;
10527
10595
  rollbackTrivia(ctx, selectorMark);
10528
10596
  mark = saveTriviaMark(ctx);
10529
10597
  ctx._routed = { value: key, span: { start: pos, end: selEnd } };
10598
+ try {
10599
+ v = target(input, pos, ctx);
10600
+ } finally {
10601
+ ctx._routed = savedRouted;
10602
+ }
10603
+ } else {
10604
+ v = target(input, selEnd, ctx);
10530
10605
  }
10531
- const v = target(input, usesRouted ? pos : selEnd, ctx);
10532
- if (usesRouted) ctx._routed = savedRouted;
10533
10606
  if (v === FAIL) {
10534
10607
  rollbackTrivia(ctx, mark);
10535
10608
  ctx._fc = true;
@@ -10675,6 +10748,11 @@ function assemble(t, prog, cfg) {
10675
10748
  if (s.sentinel !== void 0) extraIps.push(s.sentinel[0]);
10676
10749
  }
10677
10750
  for (const set of prog.scanSkip ?? []) for (const r of set) extraIps.push(r[0]);
10751
+ const validationRoots = [...Object.values(prog.rules), ...extraIps];
10752
+ for (const ip of reachableSites(code, validationRoots)) {
10753
+ if (code[ip] !== OP_DISPATCH) continue;
10754
+ validateDispatchSpec(dsp[code[ip + 2]], code[ip + 5], code[ip + 4]);
10755
+ }
10678
10756
  const pre = cfg.hostCaptureTrivia === void 0 ? prog.asm?.find((a) => a.key === cfgKey(cfg)) : void 0;
10679
10757
  if (pre !== void 0) {
10680
10758
  const pools = rebuildPools(t.cc, t.fx, pre.plan);
@@ -10701,6 +10779,7 @@ function assemble(t, prog, cfg) {
10701
10779
  pushCstLeaf,
10702
10780
  pushCstChild,
10703
10781
  rollbackTriviaAt,
10782
+ rollbackScannedTriviaAt,
10704
10783
  failAt,
10705
10784
  classHas,
10706
10785
  consumeTrivia,
@@ -10771,6 +10850,7 @@ function assemble(t, prog, cfg) {
10771
10850
  pushCstLeaf,
10772
10851
  pushCstChild,
10773
10852
  rollbackTriviaAt,
10853
+ rollbackScannedTriviaAt,
10774
10854
  failAt,
10775
10855
  classHas,
10776
10856
  consumeTrivia,
@@ -11003,6 +11083,14 @@ function tableRules(source, artifactMetadata = {}) {
11003
11083
  function jsString(s) {
11004
11084
  return JSON.stringify(s);
11005
11085
  }
11086
+ function emitClassPool(classes) {
11087
+ const array = `[${classes.map(jsString).join(",")}]`;
11088
+ if (classes.length < 2) return array;
11089
+ const delimiter = "|/~?^`".split("").find((ch2) => classes.every((spec) => !spec.includes(ch2)));
11090
+ if (delimiter === void 0) return array;
11091
+ const split = `${jsString(classes.join(delimiter))}.split(${jsString(delimiter)})`;
11092
+ return split.length < array.length ? split : array;
11093
+ }
11006
11094
  function emitConst(v) {
11007
11095
  if (v instanceof RegExp) return `/${v.source}/${v.flags}`;
11008
11096
  if (typeof v === "string") return jsString(v);
@@ -11081,7 +11169,7 @@ function programFields(prog, fns, opts = {}) {
11081
11169
  ...emitAssemblies(prog, opts.assemblies ?? []),
11082
11170
  `c:[${prog.code.join(",")}],`,
11083
11171
  `k:[${prog.k.map(emitConst).join(",")}],`,
11084
- `x:[${prog.cc.map(jsString).join(",")}],`,
11172
+ `x:${emitClassPool(prog.cc)},`,
11085
11173
  `e:[${prog.fx.map((f) => `[${f.map(jsString).join(",")}]`).join(",")}],`,
11086
11174
  `d:[${prog.disp.map((a) => `[${a.join(",")}]`).join(",")}],`,
11087
11175
  `r:${JSON.stringify(prog.rules)},`,
@@ -13433,7 +13521,7 @@ function compileRuleMap(ruleMap, opts = {}) {
13433
13521
  }
13434
13522
 
13435
13523
  // src/version.ts
13436
- var PARSEMAN_VERSION = "0.47.0";
13524
+ var PARSEMAN_VERSION = "0.47.1";
13437
13525
 
13438
13526
  // src/compiler/compile-linkable-table.ts
13439
13527
  function isLocal(rule) {