parseman 0.50.6 → 0.51.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.
Files changed (59) hide show
  1. package/dist/analysis/choice-cost.d.ts.map +1 -1
  2. package/dist/analysis/commitment.d.ts.map +1 -1
  3. package/dist/analysis/diagnostics.js +214 -67
  4. package/dist/analysis/diagnostics.js.map +2 -2
  5. package/dist/analysis/duplication.d.ts.map +1 -1
  6. package/dist/analysis/gating.d.ts.map +1 -1
  7. package/dist/cli/index.js +220 -68
  8. package/dist/cli/index.js.map +2 -2
  9. package/dist/combinators/dispatch.d.ts.map +1 -1
  10. package/dist/combinators/first-set.d.ts +2 -26
  11. package/dist/combinators/first-set.d.ts.map +1 -1
  12. package/dist/combinators/scanTo.d.ts +23 -1
  13. package/dist/combinators/scanTo.d.ts.map +1 -1
  14. package/dist/compiler/fields.d.ts.map +1 -1
  15. package/dist/compiler/grammar-coverage-ids.d.ts.map +1 -1
  16. package/dist/compiler/ir-serialize.d.ts.map +1 -1
  17. package/dist/compiler/token-capability.js +40 -29
  18. package/dist/compiler/token-capability.js.map +1 -1
  19. package/dist/coverage.d.ts.map +1 -1
  20. package/dist/cst/reflection.d.ts.map +1 -1
  21. package/dist/index.js +241 -74
  22. package/dist/index.js.map +2 -2
  23. package/dist/plugin/index.js +228 -71
  24. package/dist/plugin/index.js.map +2 -2
  25. package/dist/spec/index.js +164 -48
  26. package/dist/spec/index.js.map +2 -2
  27. package/dist/table/assemble.d.ts.map +1 -1
  28. package/dist/table/emit.d.ts.map +1 -1
  29. package/dist/table/encode.d.ts.map +1 -1
  30. package/dist/table/exec.d.ts.map +1 -1
  31. package/dist/table/index.js +220 -68
  32. package/dist/table/index.js.map +2 -2
  33. package/dist/table/program.d.ts +2 -0
  34. package/dist/table/program.d.ts.map +1 -1
  35. package/dist/types.d.ts +2 -0
  36. package/dist/types.d.ts.map +1 -1
  37. package/dist/version.d.ts +1 -1
  38. package/package.json +1 -1
  39. package/src/analysis/choice-cost.ts +6 -1
  40. package/src/analysis/commitment.ts +10 -2
  41. package/src/analysis/duplication.ts +7 -2
  42. package/src/analysis/gating.ts +6 -1
  43. package/src/analysis/rebuild.ts +1 -1
  44. package/src/combinators/dispatch.ts +4 -1
  45. package/src/combinators/first-set.ts +58 -36
  46. package/src/combinators/scanTo.ts +163 -9
  47. package/src/compiler/fields.ts +8 -2
  48. package/src/compiler/grammar-coverage-ids.ts +6 -1
  49. package/src/compiler/ir-serialize.ts +7 -2
  50. package/src/compiler/token-alphabet.ts +1 -1
  51. package/src/coverage.ts +7 -1
  52. package/src/cst/reflection.ts +6 -1
  53. package/src/table/assemble.ts +11 -1
  54. package/src/table/emit.ts +4 -0
  55. package/src/table/encode.ts +16 -8
  56. package/src/table/exec.ts +7 -1
  57. package/src/table/program.ts +2 -0
  58. package/src/types.ts +1 -1
  59. package/src/version.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"assemble.d.ts","sourceRoot":"","sources":["../../src/table/assemble.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"assemble.d.ts","sourceRoot":"","sources":["../../src/table/assemble.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../src/table/emit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAG/D,OAAO,EAAU,KAAK,MAAM,EAAE,MAAM,eAAe,CAAA;AAyHnD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,EAAE,CAMhE;AAkFD,MAAM,MAAM,WAAW,GAAG;IACxB,oCAAoC;IACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB;;;;;;;OAOG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACvC;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACtC,8CAA8C;IAC9C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAC7B,CAAA;AAmED,wBAAgB,eAAe,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,GAAE,WAAgB,GAAG,MAAM,CAYlF;AAED,MAAM,MAAM,qBAAqB,GAAG,WAAW,GAAG;IAChD;;;;;;;;OAQG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,4EAA4E;IAC5E,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CACjC,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,GAAE,qBAA0B,GAAG,MAAM,CAWhG;AAED,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG;IAC5C;;;OAGG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAClD,CAAA;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,GAAE,iBAAsB,GAAG,MAAM,CA0B5F;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAExD"}
1
+ {"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../src/table/emit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAG/D,OAAO,EAAU,KAAK,MAAM,EAAE,MAAM,eAAe,CAAA;AA2HnD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,EAAE,CAMhE;AAoFD,MAAM,MAAM,WAAW,GAAG;IACxB,oCAAoC;IACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB;;;;;;;OAOG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACvC;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACtC,8CAA8C;IAC9C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAC7B,CAAA;AAmED,wBAAgB,eAAe,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,GAAE,WAAgB,GAAG,MAAM,CAYlF;AAED,MAAM,MAAM,qBAAqB,GAAG,WAAW,GAAG;IAChD;;;;;;;;OAQG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,4EAA4E;IAC5E,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CACjC,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,GAAE,qBAA0B,GAAG,MAAM,CAWhG;AAED,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG;IAC5C;;;OAGG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAClD,CAAA;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,GAAE,iBAAsB,GAAG,MAAM,CA0B5F;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAExD"}
@@ -1 +1 @@
1
- {"version":3,"file":"encode.d.ts","sourceRoot":"","sources":["../../src/table/encode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,UAAU,EAAuB,MAAM,aAAa,CAAA;AAwBhF,OAAO,KAAK,EAAmE,YAAY,EAAc,MAAM,cAAc,CAAA;AAS7H,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAA;AA0B9E,8EAA8E;AAC9E,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,YAAY,GAAG,EAAE,MAAM,EAAqE;CAC7F;AAED,8EAA8E;AAC9E,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,GAAG,KAAK,CAAA;IACjC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;IAC7B;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAC3B;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,mBAAmB,CAAA;CACxC,CAAA;AAutDD,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,EAC5C,QAAQ,GAAE,aAAkB,GAC3B,YAAY,CAEd;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,EAC5C,QAAQ,GAAE,aAAkB,GAC3B;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAA;CAAE,CA+BnD"}
1
+ {"version":3,"file":"encode.d.ts","sourceRoot":"","sources":["../../src/table/encode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,UAAU,EAAuB,MAAM,aAAa,CAAA;AAwBhF,OAAO,KAAK,EAAmE,YAAY,EAAc,MAAM,cAAc,CAAA;AAS7H,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAA;AA0B9E,8EAA8E;AAC9E,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,YAAY,GAAG,EAAE,MAAM,EAAqE;CAC7F;AAED,8EAA8E;AAC9E,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,GAAG,KAAK,CAAA;IACjC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;IAC7B;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAC3B;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,mBAAmB,CAAA;CACxC,CAAA;AA+tDD,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,EAC5C,QAAQ,GAAE,aAAkB,GAC3B,YAAY,CAEd;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,EAC5C,QAAQ,GAAE,aAAkB,GAC3B;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAA;CAAE,CA+BnD"}
@@ -1 +1 @@
1
- {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/table/exec.ts"],"names":[],"mappings":"AA6CA,OAAO,EAEL,KAAK,cAAc,EACF,KAAK,YAAY,EAAE,KAAK,SAAS,EACnD,MAAM,cAAc,CAAA;AA0BrB;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,EAAE;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,UAAU,CAAA;IAChB,+EAA+E;IAC/E,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAA;IAChC;;;;;;;;;;;OAWG;IACH,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,MAAM,CAAA;IACpB,sFAAsF;IACtF,eAAe,EAAE,MAAM,CAAA;IACvB,YAAY,EAAE,MAAM,CAAA;IACpB,qFAAqF;IACrF,YAAY,EAAE,MAAM,CAAA;CAC+H,CAAA;AAUrJ,wBAAgB,kBAAkB,IAAI,IAAI,CASzC;AA4jDD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,SAAS,CACvB,MAAM,EAAE,YAAY,GAAG,cAAc;AACrC;;;;;;;;GAQG;AACH,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAO,EACjC,gBAAgB,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAM,GACvD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CA8B3B"}
1
+ {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/table/exec.ts"],"names":[],"mappings":"AA6CA,OAAO,EAEL,KAAK,cAAc,EACF,KAAK,YAAY,EAAE,KAAK,SAAS,EACnD,MAAM,cAAc,CAAA;AA0BrB;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,EAAE;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,UAAU,CAAA;IAChB,+EAA+E;IAC/E,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAA;IAChC;;;;;;;;;;;OAWG;IACH,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,MAAM,CAAA;IACpB,sFAAsF;IACtF,eAAe,EAAE,MAAM,CAAA;IACvB,YAAY,EAAE,MAAM,CAAA;IACpB,qFAAqF;IACrF,YAAY,EAAE,MAAM,CAAA;CAC+H,CAAA;AAUrJ,wBAAgB,kBAAkB,IAAI,IAAI,CASzC;AAkkDD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,SAAS,CACvB,MAAM,EAAE,YAAY,GAAG,cAAc;AACrC;;;;;;;;GAQG;AACH,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAO,EACjC,gBAAgB,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAM,GACvD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CA8B3B"}
@@ -1,12 +1,12 @@
1
1
  // src/combinators/first-set.ts
2
- function classifyFinalChoice(arms, resolve) {
2
+ function classifyFinalChoice(arms, resolve, activeTrivia) {
3
3
  const firstSets = [];
4
4
  const nullable2 = [];
5
5
  let exclusive = true;
6
6
  for (const arm of arms) {
7
7
  const empty2 = matchesEmpty(arm, /* @__PURE__ */ new Set(), resolve);
8
8
  nullable2.push(empty2);
9
- firstSets.push(empty2 ? { kind: "any" } : firstSetOf(arm, /* @__PURE__ */ new Set(), resolve));
9
+ firstSets.push(empty2 ? { kind: "any" } : firstSetOf(arm, /* @__PURE__ */ new Set(), resolve, activeTrivia));
10
10
  if (empty2) exclusive = false;
11
11
  }
12
12
  if (exclusive) {
@@ -67,7 +67,7 @@ function intersects(a, b) {
67
67
  return false;
68
68
  }
69
69
  function fromChar(code) {
70
- return { kind: "ranges", ranges: [{ lo: code, hi: code }] };
70
+ return fromRange(code, code);
71
71
  }
72
72
  function startsFirstSet(combinator, input, pos) {
73
73
  const fs = combinator._meta.firstSet;
@@ -160,11 +160,10 @@ function matchesEmptyBody(p, seen, resolve) {
160
160
  }
161
161
  }
162
162
  function isZeroWidthAssertion(p) {
163
- const tag = p._def.tag;
164
- return tag === "not" || tag === "adjacency";
163
+ return p._tag === "not" || p._tag === "adjacency";
165
164
  }
166
165
  function isPositiveLookahead(p) {
167
- return p._def.tag === "peek";
166
+ return p._tag === "peek";
168
167
  }
169
168
  function narrowBy(acc, constraint) {
170
169
  if (constraint.kind === "any") return acc;
@@ -180,34 +179,42 @@ function narrowBy(acc, constraint) {
180
179
  return ranges.length === 0 ? { kind: "empty" } : { kind: "ranges", ranges };
181
180
  }
182
181
  function applyAssertion(fs, assertion) {
183
- if (assertion === null) return fs;
184
- if (fs.kind === "empty") return assertion;
185
- return narrowBy(fs, assertion) ?? fs;
182
+ return assertion === null ? fs : fs.kind === "empty" ? assertion : narrowBy(fs, assertion);
186
183
  }
187
- function sequenceFirstSet(parsers) {
188
- let fs = empty();
189
- let assertion = null;
190
- for (const p of parsers) {
184
+ function sequenceSet(parsers, fs, empties, trivia2) {
185
+ const afterBoundary = (i) => {
186
+ const rest = at(i);
187
+ return trivia2 ? union(rest, fs(trivia2)) : rest;
188
+ };
189
+ const at = (i) => {
190
+ const p = parsers[i];
191
191
  if (isPositiveLookahead(p)) {
192
- assertion = narrowBy(assertion, p._meta.firstSet);
193
- continue;
192
+ const constraint = fs(p);
193
+ return i + 1 === parsers.length ? constraint : applyAssertion(afterBoundary(i + 1), constraint);
194
194
  }
195
- if (!isZeroWidthAssertion(p)) fs = union(fs, p._meta.firstSet);
196
- if (!matchesEmpty(p)) return applyAssertion(fs, assertion);
197
- }
198
- return applyAssertion(fs, assertion);
195
+ if (isZeroWidthAssertion(p)) {
196
+ return i + 1 === parsers.length ? empty() : afterBoundary(i + 1);
197
+ }
198
+ const first = fs(p);
199
+ if (!empties(p) || i + 1 === parsers.length) return first;
200
+ return union(first, afterBoundary(i + 1));
201
+ };
202
+ return at(0);
203
+ }
204
+ function sequenceFirstSet(parsers) {
205
+ return sequenceSet(parsers, (p) => p._meta.firstSet, matchesEmpty);
199
206
  }
200
- function firstSetOf(p, seen = /* @__PURE__ */ new Set(), resolve) {
207
+ function firstSetOf(p, seen = /* @__PURE__ */ new Set(), resolve, activeTrivia) {
201
208
  if (seen.has(p)) return any();
202
209
  seen.add(p);
203
210
  try {
204
- return firstSetBody(p, seen, resolve);
211
+ return firstSetBody(p, seen, resolve, activeTrivia);
205
212
  } finally {
206
213
  seen.delete(p);
207
214
  }
208
215
  }
209
- function firstSetBody(p, seen, resolve) {
210
- const fs = (c) => firstSetOf(c, seen, resolve);
216
+ function firstSetBody(p, seen, resolve, activeTrivia) {
217
+ const fs = (c) => firstSetOf(c, seen, resolve, activeTrivia);
211
218
  const empties = (c) => matchesEmpty(c, /* @__PURE__ */ new Set(), resolve);
212
219
  const d = p._def;
213
220
  switch (d.tag) {
@@ -233,17 +240,7 @@ function firstSetBody(p, seen, resolve) {
233
240
  return out;
234
241
  }
235
242
  case "sequence": {
236
- let out = empty();
237
- let assertion = null;
238
- for (const term of d.parsers) {
239
- if (isPositiveLookahead(term)) {
240
- assertion = narrowBy(assertion, fs(term));
241
- continue;
242
- }
243
- if (!isZeroWidthAssertion(term)) out = union(out, fs(term));
244
- if (!empties(term)) return applyAssertion(out, assertion);
245
- }
246
- return applyAssertion(out, assertion);
243
+ return sequenceSet(d.parsers, fs, empties, activeTrivia);
247
244
  }
248
245
  case "peek": {
249
246
  const inner = d.parser;
@@ -258,12 +255,16 @@ function firstSetBody(p, seen, resolve) {
258
255
  case "token":
259
256
  case "leaf":
260
257
  case "node":
261
- case "grammar":
262
- case "expect":
263
- return fs(d.parser);
264
258
  case "sepBy":
259
+ case "expect":
265
260
  return fs(d.parser);
266
- // both min 0 and min 1 start with the item
261
+ case "grammar":
262
+ return firstSetOf(
263
+ d.parser,
264
+ seen,
265
+ resolve,
266
+ d.clearTrivia ? null : d.triviaParser ?? activeTrivia
267
+ );
267
268
  default:
268
269
  return p._meta.firstSet;
269
270
  }
@@ -3499,7 +3500,7 @@ function resolveScanSkip(explicitSkip, raw, ctx) {
3499
3500
  out.push(...explicitSkip);
3500
3501
  return out;
3501
3502
  }
3502
- function scanTo(sentinel, { skip, raw = false, orEOF = false } = {}) {
3503
+ function scanTo(sentinel, { skip, raw = false, orEOF = false, recoverAt, stopAt } = {}) {
3503
3504
  const meta = {
3504
3505
  firstSet: any(),
3505
3506
  canMatchNewline: true,
@@ -3509,7 +3510,15 @@ function scanTo(sentinel, { skip, raw = false, orEOF = false } = {}) {
3509
3510
  return {
3510
3511
  _tag: "scanTo",
3511
3512
  _meta: meta,
3512
- _def: { tag: "scanTo", sentinel, skip: explicitSkip, raw, orEOF },
3513
+ _def: {
3514
+ tag: "scanTo",
3515
+ sentinel,
3516
+ skip: explicitSkip,
3517
+ raw,
3518
+ orEOF,
3519
+ ...recoverAt === void 0 ? {} : { recoverAt },
3520
+ ...stopAt === void 0 ? {} : { stopAt }
3521
+ },
3513
3522
  parse(input, pos, ctx) {
3514
3523
  let cur = pos;
3515
3524
  const skip2 = resolveScanSkip(explicitSkip, raw, ctx);
@@ -3521,28 +3530,130 @@ function scanTo(sentinel, { skip, raw = false, orEOF = false } = {}) {
3521
3530
  pushCstLeaf(ctx, leaf);
3522
3531
  }
3523
3532
  };
3524
- while (cur < input.length) {
3525
- const s = sentinel.parse(input, cur, probeCtx);
3526
- if (s.ok) {
3533
+ if (recoverAt === void 0 && stopAt === void 0) {
3534
+ while (cur < input.length) {
3535
+ const s = sentinel.parse(input, cur, probeCtx);
3536
+ if (s.ok) {
3537
+ if (ctx.trackLines) recordLineRangeFromContext(ctx, input, pos, cur);
3538
+ emit(cur);
3539
+ return { ok: true, value: input.slice(pos, cur), span: { start: pos, end: cur } };
3540
+ }
3541
+ let advanced = false;
3542
+ for (const skipper of skip2) {
3543
+ const r = skipper.parse(input, cur, probeCtx);
3544
+ if (r.ok && r.span.end > cur) {
3545
+ cur = r.span.end;
3546
+ advanced = true;
3547
+ break;
3548
+ }
3549
+ }
3550
+ if (!advanced) cur++;
3551
+ }
3552
+ if (orEOF) {
3527
3553
  if (ctx.trackLines) recordLineRangeFromContext(ctx, input, pos, cur);
3528
3554
  emit(cur);
3529
3555
  return { ok: true, value: input.slice(pos, cur), span: { start: pos, end: cur } };
3530
3556
  }
3557
+ const sentDef2 = sentinel._def;
3558
+ const expected2 = sentDef2.tag === "literal" ? [JSON.stringify(sentDef2.value)] : ["sentinel"];
3559
+ return { ok: false, expected: expected2, span: { start: pos, end: cur } };
3560
+ }
3561
+ let recovery = -1;
3562
+ let firstSentinel = -1;
3563
+ let sentinelCount = 0;
3564
+ let recoveryErrorCount = -1;
3565
+ let sentinelErrorCount = -1;
3566
+ const succeed = (end) => {
3567
+ if (ctx.trackLines) recordLineRangeFromContext(ctx, input, pos, end);
3568
+ emit(end);
3569
+ return { ok: true, value: input.slice(pos, end), span: { start: pos, end } };
3570
+ };
3571
+ const recoveredEnd = () => {
3572
+ const acceptSentinel = firstSentinel >= 0 && (sentinelCount & 1) === 1;
3573
+ const errors = ctx._errors;
3574
+ if (errors !== void 0) {
3575
+ const keep = acceptSentinel ? sentinelErrorCount : recoveryErrorCount;
3576
+ if (keep >= 0 && errors.length > keep) errors.length = keep;
3577
+ }
3578
+ return acceptSentinel ? firstSentinel : recovery;
3579
+ };
3580
+ while (cur < input.length) {
3581
+ const sentinelProbeErrorCount = ctx._errors?.length ?? -1;
3582
+ const s = sentinel.parse(input, cur, probeCtx);
3583
+ const sentinelProbeErrors = ctx._errors;
3584
+ if (sentinelProbeErrors !== void 0 && sentinelProbeErrorCount >= 0 && sentinelProbeErrors.length > sentinelProbeErrorCount) {
3585
+ sentinelProbeErrors.length = sentinelProbeErrorCount;
3586
+ }
3587
+ if (s.ok) {
3588
+ if (recovery < 0) return succeed(cur);
3589
+ if (s.span.end <= cur) {
3590
+ throw new TypeError("scanTo recovery requires a sentinel that consumes input");
3591
+ }
3592
+ if (firstSentinel < 0) {
3593
+ firstSentinel = cur;
3594
+ sentinelErrorCount = sentinelProbeErrorCount;
3595
+ }
3596
+ sentinelCount++;
3597
+ cur = s.span.end;
3598
+ continue;
3599
+ }
3600
+ if (stopAt !== void 0) {
3601
+ const errorCount = ctx._errors?.length ?? -1;
3602
+ const stop = stopAt.parse(input, cur, probeCtx);
3603
+ const errors = ctx._errors;
3604
+ if (errors !== void 0 && errorCount >= 0 && errors.length > errorCount) {
3605
+ errors.length = errorCount;
3606
+ }
3607
+ if (stop.ok) {
3608
+ if (recovery < 0) {
3609
+ recovery = cur;
3610
+ recoveryErrorCount = errorCount;
3611
+ }
3612
+ return succeed(recoveredEnd());
3613
+ }
3614
+ }
3531
3615
  let advanced = false;
3532
3616
  for (const skipper of skip2) {
3617
+ const errorCount = ctx._errors?.length ?? -1;
3533
3618
  const r = skipper.parse(input, cur, probeCtx);
3534
3619
  if (r.ok && r.span.end > cur) {
3535
3620
  cur = r.span.end;
3536
3621
  advanced = true;
3537
3622
  break;
3538
3623
  }
3624
+ const errors = ctx._errors;
3625
+ if (errors !== void 0 && errorCount >= 0 && errors.length > errorCount) {
3626
+ errors.length = errorCount;
3627
+ }
3539
3628
  }
3540
- if (!advanced) cur++;
3629
+ if (advanced) continue;
3630
+ if (recoverAt !== void 0) {
3631
+ const errorCount = ctx._errors?.length ?? -1;
3632
+ const recover = recoverAt.parse(input, cur, probeCtx);
3633
+ const errors = ctx._errors;
3634
+ if (errors !== void 0 && errorCount >= 0 && errors.length > errorCount) {
3635
+ errors.length = errorCount;
3636
+ }
3637
+ if (recover.ok) {
3638
+ if (recover.span.end <= cur) {
3639
+ throw new TypeError("scanTo recoverAt must consume input");
3640
+ }
3641
+ if (recovery < 0) {
3642
+ recovery = cur;
3643
+ recoveryErrorCount = errorCount;
3644
+ }
3645
+ if (firstSentinel >= 0 && (sentinelCount & 1) === 1) {
3646
+ return succeed(recoveredEnd());
3647
+ }
3648
+ cur = recover.span.end;
3649
+ continue;
3650
+ }
3651
+ }
3652
+ cur++;
3541
3653
  }
3654
+ if (recovery >= 0) return succeed(recoveredEnd());
3542
3655
  if (orEOF) {
3543
- if (ctx.trackLines) recordLineRangeFromContext(ctx, input, pos, cur);
3544
- emit(cur);
3545
- return { ok: true, value: input.slice(pos, cur), span: { start: pos, end: cur } };
3656
+ return succeed(cur);
3546
3657
  }
3547
3658
  const sentDef = sentinel._def;
3548
3659
  const expected = sentDef.tag === "literal" ? [JSON.stringify(sentDef.value)] : ["sentinel"];
@@ -3919,7 +4030,7 @@ function parserHasOwnFields(p, seen = /* @__PURE__ */ new Set()) {
3919
4030
  case "grammar":
3920
4031
  return parserHasOwnFields(d.parser, seen) || (d.triviaParser ? parserHasOwnFields(d.triviaParser, seen) : false);
3921
4032
  case "scanTo":
3922
- return parserHasOwnFields(d.sentinel, seen) || d.skip.some((x) => parserHasOwnFields(x, seen));
4033
+ return parserHasOwnFields(d.sentinel, seen) || d.skip.some((x) => parserHasOwnFields(x, seen)) || d.recoverAt !== void 0 && parserHasOwnFields(d.recoverAt, seen) || d.stopAt !== void 0 && parserHasOwnFields(d.stopAt, seen);
3923
4034
  case "recover":
3924
4035
  return parserHasOwnFields(d.parser, seen) || parserHasOwnFields(d.sentinel, seen);
3925
4036
  case "routed":
@@ -3973,7 +4084,7 @@ function parserUsesRouted(parser, seen = /* @__PURE__ */ new Set()) {
3973
4084
  case "grammar":
3974
4085
  return parserUsesRouted(def.parser, seen) || (def.triviaParser ? parserUsesRouted(def.triviaParser, seen) : false);
3975
4086
  case "scanTo":
3976
- return parserUsesRouted(def.sentinel, seen) || def.skip.some((entry) => parserUsesRouted(entry, seen));
4087
+ return parserUsesRouted(def.sentinel, seen) || def.skip.some((entry) => parserUsesRouted(entry, seen)) || def.recoverAt !== void 0 && parserUsesRouted(def.recoverAt, seen) || def.stopAt !== void 0 && parserUsesRouted(def.stopAt, seen);
3977
4088
  case "recover":
3978
4089
  return parserUsesRouted(def.parser, seen) || parserUsesRouted(def.sentinel, seen);
3979
4090
  case "lazy":
@@ -8247,6 +8358,8 @@ function assemble(t, prog, cfg) {
8247
8358
  for (const s of prog.scans ?? []) {
8248
8359
  for (const r of s.skip) labelExtraIps.push(r[0]);
8249
8360
  if (s.sentinel !== void 0) labelExtraIps.push(s.sentinel[0]);
8361
+ if (s.recoverAt !== void 0) labelExtraIps.push(s.recoverAt[0]);
8362
+ if (s.stopAt !== void 0) labelExtraIps.push(s.stopAt[0]);
8250
8363
  }
8251
8364
  for (const set of prog.scanSkip ?? []) for (const r of set) labelExtraIps.push(r[0]);
8252
8365
  const closureLabels = computeSiteLabels(
@@ -10932,6 +11045,8 @@ function assemble(t, prog, cfg) {
10932
11045
  for (const s of prog.scans ?? []) {
10933
11046
  for (const r of s.skip) extraIps.push(r[0]);
10934
11047
  if (s.sentinel !== void 0) extraIps.push(s.sentinel[0]);
11048
+ if (s.recoverAt !== void 0) extraIps.push(s.recoverAt[0]);
11049
+ if (s.stopAt !== void 0) extraIps.push(s.stopAt[0]);
10935
11050
  }
10936
11051
  for (const set of prog.scanSkip ?? []) for (const r of set) extraIps.push(r[0]);
10937
11052
  const roots = [...Object.values(prog.rules), ...extraIps];
@@ -11143,7 +11258,13 @@ function assemble(t, prog, cfg) {
11143
11258
  continue;
11144
11259
  }
11145
11260
  const sentDef = typeof s.sent === "string" ? { tag: "literal", value: s.sent, caseInsensitive: false } : void 0;
11146
- scansArr.push(scanTo(subtreeComb(s.sentinel, sentDef), { skip, raw, orEOF: (s.flags & 2) !== 0 }));
11261
+ scansArr.push(scanTo(subtreeComb(s.sentinel, sentDef), {
11262
+ skip,
11263
+ raw,
11264
+ orEOF: (s.flags & 2) !== 0,
11265
+ ...s.recoverAt === void 0 ? {} : { recoverAt: subtreeComb(s.recoverAt) },
11266
+ ...s.stopAt === void 0 ? {} : { stopAt: subtreeComb(s.stopAt) }
11267
+ }));
11147
11268
  }
11148
11269
  const scans = scansArr;
11149
11270
  const scanSkip = (prog.scanSkip ?? []).map((set) => set.map((r) => subtreeComb(r)));
@@ -11336,7 +11457,12 @@ function childrenOf(d) {
11336
11457
  case "recover":
11337
11458
  return [d.parser, d.sentinel];
11338
11459
  case "scanTo":
11339
- return [d.sentinel, ...d.skip];
11460
+ return [
11461
+ d.sentinel,
11462
+ ...d.skip,
11463
+ ...d.recoverAt === void 0 ? [] : [d.recoverAt],
11464
+ ...d.stopAt === void 0 ? [] : [d.stopAt]
11465
+ ];
11340
11466
  case "grammar":
11341
11467
  return d.triviaParser ? [d.parser, d.triviaParser] : [d.parser];
11342
11468
  case "routed":
@@ -11607,7 +11733,7 @@ function hasNodeDef(p, seen = /* @__PURE__ */ new Set()) {
11607
11733
  case "sepBy":
11608
11734
  return hasNodeDef(d.parser, seen) || hasNodeDef(d.separator, seen);
11609
11735
  case "scanTo":
11610
- return hasNodeDef(d.sentinel, seen) || d.skip.some((x) => hasNodeDef(x, seen));
11736
+ return hasNodeDef(d.sentinel, seen) || d.skip.some((x) => hasNodeDef(x, seen)) || d.recoverAt !== void 0 && hasNodeDef(d.recoverAt, seen) || d.stopAt !== void 0 && hasNodeDef(d.stopAt, seen);
11611
11737
  case "recover":
11612
11738
  return hasNodeDef(d.parser, seen) || hasNodeDef(d.sentinel, seen);
11613
11739
  case "expect":
@@ -11656,7 +11782,7 @@ function hasDirectBuildDef(p, seen = /* @__PURE__ */ new Set()) {
11656
11782
  case "sepBy":
11657
11783
  return hasDirectBuildDef(d.parser, seen) || hasDirectBuildDef(d.separator, seen);
11658
11784
  case "scanTo":
11659
- return hasDirectBuildDef(d.sentinel, seen) || d.skip.some((x) => hasDirectBuildDef(x, seen));
11785
+ return hasDirectBuildDef(d.sentinel, seen) || d.skip.some((x) => hasDirectBuildDef(x, seen)) || d.recoverAt !== void 0 && hasDirectBuildDef(d.recoverAt, seen) || d.stopAt !== void 0 && hasDirectBuildDef(d.stopAt, seen);
11660
11786
  case "recover":
11661
11787
  return hasDirectBuildDef(d.parser, seen) || hasDirectBuildDef(d.sentinel, seen);
11662
11788
  case "routed":
@@ -11693,7 +11819,7 @@ function mayCommitFailure(p, seen = /* @__PURE__ */ new Set(), resolve) {
11693
11819
  case "withCtx":
11694
11820
  return mayCommitFailure(d.parser, seen, resolve);
11695
11821
  case "scanTo":
11696
- return mayCommitFailure(d.sentinel, seen, resolve) || d.skip.some((x) => mayCommitFailure(x, seen, resolve));
11822
+ return mayCommitFailure(d.sentinel, seen, resolve) || d.skip.some((x) => mayCommitFailure(x, seen, resolve)) || d.recoverAt !== void 0 && mayCommitFailure(d.recoverAt, seen, resolve) || d.stopAt !== void 0 && mayCommitFailure(d.stopAt, seen, resolve);
11697
11823
  case "lazy": {
11698
11824
  try {
11699
11825
  return mayCommitFailure(d.thunk(), seen, resolve);
@@ -12471,7 +12597,9 @@ var Encoder = class {
12471
12597
  followClass(parsers, i) {
12472
12598
  let fs = { kind: "empty" };
12473
12599
  const rr = this.refResolver();
12474
- for (let j = i + 1; j < parsers.length; j++) fs = union(fs, firstSetOf(parsers[j], /* @__PURE__ */ new Set(), rr));
12600
+ for (let j = i + 1; j < parsers.length; j++) {
12601
+ fs = union(fs, firstSetOf(parsers[j], /* @__PURE__ */ new Set(), rr, this.activeTrivia));
12602
+ }
12475
12603
  return this.charClass(fs);
12476
12604
  }
12477
12605
  constant(v) {
@@ -12688,7 +12816,7 @@ var Encoder = class {
12688
12816
  */
12689
12817
  subtree(c) {
12690
12818
  const ip = this.node(c).ip;
12691
- const fs = firstSetOf(c, /* @__PURE__ */ new Set(), this.refResolver());
12819
+ const fs = firstSetOf(c, /* @__PURE__ */ new Set(), this.refResolver(), this.activeTrivia);
12692
12820
  return [ip, fs.kind === "empty" ? -2 : this.charClass(fs)];
12693
12821
  }
12694
12822
  /** Pool one scan spec. One per combinator: `node()` memoizes by identity. */
@@ -12834,6 +12962,8 @@ var Encoder = class {
12834
12962
  flags: (d.raw ? 1 : 0) | (d.orEOF ? 2 : 0),
12835
12963
  skip: d.skip.map((c) => this.subtree(c)),
12836
12964
  sentinel: this.subtree(d.sentinel),
12965
+ ...d.recoverAt === void 0 ? {} : { recoverAt: this.subtree(d.recoverAt) },
12966
+ ...d.stopAt === void 0 ? {} : { stopAt: this.subtree(d.stopAt) },
12837
12967
  sent: sentDef.tag === "literal" ? sentDef.value : null
12838
12968
  }));
12839
12969
  }
@@ -12907,12 +13037,12 @@ var Encoder = class {
12907
13037
  return this.covWrap(gated, armCovIds?.[src], 1);
12908
13038
  });
12909
13039
  const rr = this.refResolver();
12910
- const finalChoice = classifyFinalChoice(arms, rr);
13040
+ const finalChoice = classifyFinalChoice(arms, rr, this.activeTrivia);
12911
13041
  const transactionalFirst = arms.map((arm, i) => {
12912
13042
  if (!finalChoice.nullable[i]) return void 0;
12913
13043
  const def = arm._def;
12914
13044
  if (def.tag !== "attempt" || matchesEmpty(def.parser, /* @__PURE__ */ new Set(), rr)) return void 0;
12915
- return firstSetOf(def.parser, /* @__PURE__ */ new Set(), rr);
13045
+ return firstSetOf(def.parser, /* @__PURE__ */ new Set(), rr, this.activeTrivia);
12916
13046
  });
12917
13047
  const gateFirst = finalChoice.firstSets.map((first, i) => transactionalFirst[i] ?? first);
12918
13048
  const classes = gateFirst.map((first, i) => finalChoice.nullable[i] && transactionalFirst[i] === void 0 ? -1 : this.charClass(first));
@@ -12959,7 +13089,7 @@ var Encoder = class {
12959
13089
  case "oneOrMore": {
12960
13090
  const child = this.node(d.parser).ip;
12961
13091
  const rr = this.refResolver();
12962
- const itemClass = matchesEmpty(d.parser, /* @__PURE__ */ new Set(), rr) ? -1 : this.existingCharClass(firstSetOf(d.parser, /* @__PURE__ */ new Set(), rr));
13092
+ const itemClass = matchesEmpty(d.parser, /* @__PURE__ */ new Set(), rr) ? -1 : this.existingCharClass(firstSetOf(d.parser, /* @__PURE__ */ new Set(), rr, this.activeTrivia));
12963
13093
  const op = d.valueUnused ? OP_REPV : OP_REP;
12964
13094
  const min = d.tag === "many" ? 0 : d.min;
12965
13095
  return this.rec ? this.emit(op, child, min, d.max ?? -1, -1, 0, this.expected(deriveExpected(d.parser)), itemClass) : this.emit(op, child, min, d.max ?? -1, -1, 0);
@@ -12977,7 +13107,7 @@ var Encoder = class {
12977
13107
  sep,
12978
13108
  flags,
12979
13109
  this.expected(deriveExpected(d.parser)),
12980
- this.charClass(firstSetOf(d.separator, /* @__PURE__ */ new Set(), this.refResolver()))
13110
+ this.charClass(firstSetOf(d.separator, /* @__PURE__ */ new Set(), this.refResolver(), this.activeTrivia))
12981
13111
  );
12982
13112
  }
12983
13113
  return d.min >= 2 ? this.emit(OP_REP, child, d.min, d.max ?? -1, sep, flags, this.expected(deriveExpected(d.parser))) : this.emit(OP_REP, child, d.min, d.max ?? -1, sep, flags);
@@ -13032,7 +13162,7 @@ var Encoder = class {
13032
13162
  d.tags === void 0 ? -1 : this.constant(d.tags)
13033
13163
  );
13034
13164
  if (matchesEmpty(d.parser)) return body;
13035
- const fs = d.parser._def.tag === "lazy" ? firstSetOf(d.parser, /* @__PURE__ */ new Set(), this.refResolver()) : d.parser._meta.firstSet;
13165
+ const fs = d.parser._def.tag === "lazy" ? firstSetOf(d.parser, /* @__PURE__ */ new Set(), this.refResolver(), this.activeTrivia) : d.parser._meta.firstSet;
13036
13166
  if (fs.kind === "any") return body;
13037
13167
  const cls = this.charClass(fs);
13038
13168
  if (cls < 0) return body;
@@ -13146,7 +13276,7 @@ var Encoder = class {
13146
13276
  case "attempt": {
13147
13277
  const inner = this.emit(OP_ATTEMPT, this.node(d.parser).ip);
13148
13278
  if (!this.failureNeedsRollback(d.parser, void 0)) this.failureRollbackCleanSites.add(inner);
13149
- const fs = d.parser._def.tag === "lazy" ? firstSetOf(d.parser, /* @__PURE__ */ new Set(), this.refResolver()) : d.parser._meta.firstSet;
13279
+ const fs = d.parser._def.tag === "lazy" ? firstSetOf(d.parser, /* @__PURE__ */ new Set(), this.refResolver(), this.activeTrivia) : d.parser._meta.firstSet;
13150
13280
  if (fs.kind === "any" || matchesEmpty(d.parser)) return inner;
13151
13281
  const cls = this.charClass(fs);
13152
13282
  if (cls < 0) return inner;
@@ -13267,6 +13397,8 @@ var Encoder = class {
13267
13397
  const refs = [];
13268
13398
  for (const s of this.scans) {
13269
13399
  if (s.sentinel !== void 0) refs.push(s.sentinel);
13400
+ if (s.recoverAt !== void 0) refs.push(s.recoverAt);
13401
+ if (s.stopAt !== void 0) refs.push(s.stopAt);
13270
13402
  refs.push(...s.skip);
13271
13403
  }
13272
13404
  for (const set of this.scanSkipSets) refs.push(...set);
@@ -13286,7 +13418,9 @@ var Encoder = class {
13286
13418
  this.scans = this.scans.map((s) => ({
13287
13419
  ...s,
13288
13420
  skip: s.skip.map(res),
13289
- ...s.sentinel === void 0 ? {} : { sentinel: res(s.sentinel) }
13421
+ ...s.sentinel === void 0 ? {} : { sentinel: res(s.sentinel) },
13422
+ ...s.recoverAt === void 0 ? {} : { recoverAt: res(s.recoverAt) },
13423
+ ...s.stopAt === void 0 ? {} : { stopAt: res(s.stopAt) }
13290
13424
  }));
13291
13425
  this.scanSkipSets = this.scanSkipSets.map((set) => set.map(res));
13292
13426
  }
@@ -13414,6 +13548,8 @@ function emitRef(r) {
13414
13548
  function emitScanSpec(s) {
13415
13549
  const parts = [`kind:${s.kind}`, `flags:${s.flags}`, `skip:[${s.skip.map(emitRef).join(",")}]`];
13416
13550
  if (s.sentinel !== void 0) parts.push(`sentinel:${emitRef(s.sentinel)}`);
13551
+ if (s.recoverAt !== void 0) parts.push(`recoverAt:${emitRef(s.recoverAt)}`);
13552
+ if (s.stopAt !== void 0) parts.push(`stopAt:${emitRef(s.stopAt)}`);
13417
13553
  if (s.sent !== void 0) parts.push(`sent:${s.sent === null ? "null" : jsString(s.sent)}`);
13418
13554
  if (s.open !== void 0) parts.push(`open:${jsString(s.open)}`);
13419
13555
  if (s.close !== void 0) parts.push(`close:${jsString(s.close)}`);
@@ -13440,6 +13576,8 @@ function emitAssemblies(prog, cfgs) {
13440
13576
  for (const s of prog.scans ?? []) {
13441
13577
  for (const r of s.skip) extraIps.push(r[0]);
13442
13578
  if (s.sentinel !== void 0) extraIps.push(s.sentinel[0]);
13579
+ if (s.recoverAt !== void 0) extraIps.push(s.recoverAt[0]);
13580
+ if (s.stopAt !== void 0) extraIps.push(s.stopAt[0]);
13443
13581
  }
13444
13582
  for (const set of prog.scanSkip ?? []) for (const r of set) extraIps.push(r[0]);
13445
13583
  const out = [];
@@ -13608,7 +13746,12 @@ function children(def, winners) {
13608
13746
  case "sepBy":
13609
13747
  return [def.parser, def.separator];
13610
13748
  case "scanTo":
13611
- return [def.sentinel, ...def.skip];
13749
+ return [
13750
+ def.sentinel,
13751
+ ...def.skip,
13752
+ ...def.recoverAt === void 0 ? [] : [def.recoverAt],
13753
+ ...def.stopAt === void 0 ? [] : [def.stopAt]
13754
+ ];
13612
13755
  case "lazy": {
13613
13756
  let resolved;
13614
13757
  try {
@@ -13721,7 +13864,7 @@ function payloadKey(p, d) {
13721
13864
  case "expect":
13722
13865
  return `expect\0${d.label ?? ""}\0${d.expected.join("")}`;
13723
13866
  case "scanTo":
13724
- return `scanTo\0${d.raw}\0${d.orEOF}`;
13867
+ return `scanTo\0${d.raw}\0${d.orEOF}\0${d.recoverAt !== void 0}\0${d.stopAt !== void 0}`;
13725
13868
  case "guard":
13726
13869
  return `guard\0${fnKey(d.predSrc, d.predicate)}`;
13727
13870
  case "adjacency":
@@ -13836,8 +13979,12 @@ function segment(d, index) {
13836
13979
  return index === 0 ? "sepBy.item" : "sepBy.sep";
13837
13980
  case "recover":
13838
13981
  return index === 0 ? "recover.body" : "recover.sentinel";
13839
- case "scanTo":
13840
- return index === 0 ? "scanTo.sentinel" : `scanTo.skip[${index - 1}]`;
13982
+ case "scanTo": {
13983
+ if (index === 0) return "scanTo.sentinel";
13984
+ if (index <= d.skip.length) return `scanTo.skip[${index - 1}]`;
13985
+ if (d.recoverAt !== void 0 && index === d.skip.length + 1) return "scanTo.recoverAt";
13986
+ return "scanTo.stopAt";
13987
+ }
13841
13988
  default:
13842
13989
  return d.tag;
13843
13990
  }
@@ -15097,7 +15244,12 @@ function childrenOf2(def) {
15097
15244
  case "sepBy":
15098
15245
  return [def.parser, def.separator];
15099
15246
  case "scanTo":
15100
- return [def.sentinel, ...def.skip];
15247
+ return [
15248
+ def.sentinel,
15249
+ ...def.skip,
15250
+ ...def.recoverAt === void 0 ? [] : [def.recoverAt],
15251
+ ...def.stopAt === void 0 ? [] : [def.stopAt]
15252
+ ];
15101
15253
  case "routed":
15102
15254
  return def.fallback ? [def.fallback] : [];
15103
15255
  case "literal":