parseman 0.54.0 → 0.55.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.
@@ -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":"encode.d.ts","sourceRoot":"","sources":["../../src/table/encode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,UAAU,EAAuB,MAAM,aAAa,CAAA;AAyBhF,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;AA8uDD,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;AAyBhF,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;AA2wDD,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;AA4BrB;;;;;;;;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;AAulDD;;;;;;;;;;;;;;;;;;;;;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;AA4BrB;;;;;;;;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;AAwlDD;;;;;;;;;;;;;;;;;;;;;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"}
@@ -9449,8 +9449,21 @@ function assemble(t, prog, cfg) {
9449
9449
  };
9450
9450
  }
9451
9451
  case OP_WITHCTX: {
9452
- const extra = k[code[ip + 1]];
9452
+ const ki = code[ip + 1];
9453
9453
  const child = link(code[ip + 2]);
9454
+ if (ki < 0) {
9455
+ const derive2 = fns[~ki];
9456
+ return (input, pos, ctx) => {
9457
+ const saved = ctx.state;
9458
+ ctx.state = derive2(saved);
9459
+ try {
9460
+ return child(input, pos, ctx);
9461
+ } finally {
9462
+ ctx.state = saved;
9463
+ }
9464
+ };
9465
+ }
9466
+ const extra = k[ki];
9454
9467
  return (input, pos, ctx) => {
9455
9468
  const saved = ctx.state;
9456
9469
  ctx.state = extra;
@@ -12408,19 +12421,11 @@ var Encoder = class {
12408
12421
  nonCommittingChoiceSites = /* @__PURE__ */ new Set();
12409
12422
  failureRollbackCleanSites = /* @__PURE__ */ new Set();
12410
12423
  /**
12411
- * `hasSideWriter` memo for `failureNeedsRollback`, shared across every call
12412
- * for the lifetime of this `Encoder`. A cached entry is written only when
12413
- * `complete` is true, which means the answer is a path-independent fact
12414
- * about that combinator node — it does not depend on which root's traversal
12415
- * asked, only on the node's own reachable subgraph. Scoping the memo per call
12416
- * (as a local inside `failureNeedsRollback`) was correct but discarded that
12417
- * fact after every arm, so a grammar with many ordered-choice arms / optional
12418
- * / attempt sites re-walked the SAME shared rule graph from scratch for each
12419
- * site — O(sites × graph size) instead of O(graph size). Measured on the
12420
- * scss-parser grammar (composed CSS-base superset, the deepest/largest of the
12421
- * four grammars): 47-50s for one `compileRuleMap` with the per-call memo,
12422
- * versus the whole macro transform completing in under a second once this
12423
- * memo is hoisted here.
12424
+ * `reachesSideWriter`'s answers, shared by every `failureNeedsRollback` call
12425
+ * for the lifetime of this `Encoder`. Every entry is exact — it depends only on
12426
+ * the node's own reachable subgraph, never on which root's walk asked — so each
12427
+ * combinator is walked once per encode however many choice arms, optionals and
12428
+ * attempt sites reach it.
12424
12429
  */
12425
12430
  sideWriterMemo = /* @__PURE__ */ new Map();
12426
12431
  labels = void 0;
@@ -12853,63 +12858,96 @@ var Encoder = class {
12853
12858
  * writer census covers the side sinks that proof deliberately does not model:
12854
12859
  * fields, recovered errors, and interpreted scanners. Strict assemblies do
12855
12860
  * not run repeat recovery, but these rows can still publish through a caller's
12856
- * context. Cycles are safe to stop: revisiting the same combinator cannot
12857
- * discover a writer the first traversal did not already reach.
12861
+ * context.
12858
12862
  */
12859
12863
  failureNeedsRollback(p, autoNot) {
12860
12864
  const refName = p._ruleName;
12861
12865
  const winner = refName === void 0 ? void 0 : this.winners?.[refName];
12862
12866
  const root = winner !== void 0 && !winnerWrapsReference2(winner, p) ? winner : p;
12863
- const sideWriterMemo = this.sideWriterMemo;
12864
- const seen = /* @__PURE__ */ new Set();
12865
- const hasSideWriter = (current) => {
12866
- const cached = sideWriterMemo.get(current);
12867
- if (cached !== void 0) return { found: cached, complete: true };
12868
- if (seen.has(current)) return { found: false, complete: false };
12869
- seen.add(current);
12870
- const def = current._def;
12871
- let result;
12872
- switch (def.tag) {
12873
- case "field":
12874
- case "expect":
12875
- case "recover":
12876
- case "scanTo":
12877
- case "unknown":
12878
- result = { found: true, complete: true };
12879
- break;
12880
- case "lazy": {
12881
- const name = current._ruleName;
12882
- const resolvedWinner = name === void 0 ? void 0 : this.winners?.[name];
12883
- if (resolvedWinner !== void 0 && !winnerWrapsReference2(resolvedWinner, current)) {
12884
- result = hasSideWriter(resolvedWinner);
12885
- break;
12886
- }
12887
- try {
12888
- result = hasSideWriter(def.thunk());
12889
- } catch {
12890
- result = { found: true, complete: true };
12867
+ return mayLeavePartialCapture(root, /* @__PURE__ */ new Set(), true) || this.reachesSideWriter(root) || (autoNot?.length ?? 0) > 0 && capturesLeaf(root);
12868
+ }
12869
+ /**
12870
+ * Whether a field, recovered error, interpreted scanner or unresolvable shape
12871
+ * is reachable from `root` — the writer census of `failureNeedsRollback`.
12872
+ *
12873
+ * Reachability over a cyclic graph, decided with Tarjan's strongly connected
12874
+ * components so that every node the walk enters leaves with its exact answer
12875
+ * memoized: the members of one component reach each other, so they share one
12876
+ * answer, settled when the walk returns to the component's first node. A DFS
12877
+ * that instead cuts a cycle at its own ancestor path learns nothing it can
12878
+ * keep about a node whose walk hit the cut, and re-walks that node along
12879
+ * every path that reaches it — exponential over recursive value rules (linking
12880
+ * jess's SCSS grammar cost ~290G instructions). This walk enters each node
12881
+ * once per `Encoder`.
12882
+ */
12883
+ reachesSideWriter(root) {
12884
+ const memo = this.sideWriterMemo;
12885
+ const known = memo.get(root);
12886
+ if (known !== void 0) return known;
12887
+ const order = /* @__PURE__ */ new Map();
12888
+ const low = [];
12889
+ const found = [];
12890
+ const stack = [];
12891
+ const visit = (node) => {
12892
+ const at = low.length;
12893
+ order.set(node, at);
12894
+ low.push(at);
12895
+ found.push(false);
12896
+ stack.push(node);
12897
+ const next = this.sideWriterSuccessors(node);
12898
+ if (next === true) found[at] = true;
12899
+ else {
12900
+ for (const child of next) {
12901
+ const hit = memo.get(child);
12902
+ if (hit !== void 0) {
12903
+ if (hit) found[at] = true;
12904
+ continue;
12891
12905
  }
12892
- break;
12893
- }
12894
- default: {
12895
- let complete = true;
12896
- result = { found: false, complete: true };
12897
- for (const child of childrenOf(def)) {
12898
- const childResult = hasSideWriter(child);
12899
- if (childResult.found) {
12900
- result = { found: true, complete: true };
12901
- break;
12902
- }
12903
- complete &&= childResult.complete;
12906
+ const seen = order.get(child);
12907
+ if (seen !== void 0) {
12908
+ if (seen < low[at]) low[at] = seen;
12909
+ continue;
12904
12910
  }
12905
- if (!result.found) result = { found: false, complete };
12911
+ const k = visit(child);
12912
+ if (low[k] < low[at]) low[at] = low[k];
12913
+ if (found[k]) found[at] = true;
12906
12914
  }
12907
12915
  }
12908
- seen.delete(current);
12909
- if (result.found || result.complete) sideWriterMemo.set(current, result.found);
12910
- return result;
12916
+ if (low[at] === at) {
12917
+ const answer = found[at];
12918
+ let member;
12919
+ do {
12920
+ member = stack.pop();
12921
+ memo.set(member, answer);
12922
+ } while (member !== node);
12923
+ }
12924
+ return at;
12911
12925
  };
12912
- return mayLeavePartialCapture(root, /* @__PURE__ */ new Set(), true) || hasSideWriter(root).found || (autoNot?.length ?? 0) > 0 && capturesLeaf(root);
12926
+ return found[visit(root)];
12927
+ }
12928
+ /** The census's edges out of `node`, or `true` when `node` is itself a writer. */
12929
+ sideWriterSuccessors(node) {
12930
+ const def = node._def;
12931
+ switch (def.tag) {
12932
+ case "field":
12933
+ case "expect":
12934
+ case "recover":
12935
+ case "scanTo":
12936
+ case "unknown":
12937
+ return true;
12938
+ case "lazy": {
12939
+ const name = node._ruleName;
12940
+ const winner = name === void 0 ? void 0 : this.winners?.[name];
12941
+ if (winner !== void 0 && !winnerWrapsReference2(winner, node)) return [winner];
12942
+ try {
12943
+ return [def.thunk()];
12944
+ } catch {
12945
+ return true;
12946
+ }
12947
+ }
12948
+ default:
12949
+ return childrenOf(def);
12950
+ }
12913
12951
  }
12914
12952
  /** A first set becomes a char class string, or −1 for `any`. */
12915
12953
  charClass(fs) {
@@ -13426,6 +13464,9 @@ var Encoder = class {
13426
13464
  this.expected([adjacencyExpected(d)])
13427
13465
  );
13428
13466
  case "withCtx": {
13467
+ if (typeof d.extra === "function") {
13468
+ return this.emit(OP_WITHCTX, ~this.fn(d.extra, d.extraSrc ?? null), this.node(d.parser).ip);
13469
+ }
13429
13470
  if (!emittableConst(d.extra)) {
13430
13471
  this.runtimeOnly.add("withCtx(extra) \u2014 the state object is not serialisable");
13431
13472
  }