parseman 0.55.1 → 0.55.3

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":"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
+ {"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;AA4tDD,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"}
@@ -2800,14 +2800,8 @@ function choice(...args) {
2800
2800
  if (result.committed) return { ok: false, expected, span: { start: pos, end: pos }, committed: true };
2801
2801
  return { ok: false, expected, span: { start: pos, end: pos } };
2802
2802
  }
2803
- return {
2804
- ok: false,
2805
- expected: parsers.flatMap((p) => {
2806
- const r = p.parse(input, pos, ctx);
2807
- return r.ok ? [] : r.expected;
2808
- }),
2809
- span: { start: pos, end: pos }
2810
- };
2803
+ if (ctx._probe !== void 0 || ctx._tolerant) for (const p of parsers) p.parse(input, pos, ctx);
2804
+ return { ok: false, expected: [...scalarExpected], span: { start: pos, end: pos } };
2811
2805
  }
2812
2806
  if (strategy?.tag === "greedyClassify") {
2813
2807
  const superResult = parsers[strategy.superIndex].parse(input, pos, ctx);
@@ -11952,19 +11946,22 @@ function hasDirectBuildDef(p, seen = /* @__PURE__ */ new Set()) {
11952
11946
  return false;
11953
11947
  }
11954
11948
  }
11955
- function mayCommitFailure(p, seen = /* @__PURE__ */ new Set(), resolve) {
11956
- if (seen.has(p)) return false;
11957
- seen.add(p);
11949
+ function mayCommitFailure(p, resolve, memo = /* @__PURE__ */ new Map()) {
11950
+ return reachesMarked(p, (node) => commitFailureSuccessors(node, resolve), memo);
11951
+ }
11952
+ var NO_EDGES = [];
11953
+ function commitFailureSuccessors(p, resolve) {
11958
11954
  const d = p._def;
11959
11955
  switch (d.tag) {
11960
11956
  case "dispatch":
11957
+ case "unknown":
11961
11958
  return true;
11962
11959
  case "choice":
11963
11960
  case "sequence":
11964
- return d.parsers.some((x) => mayCommitFailure(x, seen, resolve));
11961
+ return d.parsers;
11965
11962
  // A contained transaction reports every failure uncommitted.
11966
11963
  case "attempt":
11967
- return d.contain !== true && mayCommitFailure(d.parser, seen, resolve);
11964
+ return d.contain === true ? NO_EDGES : [d.parser];
11968
11965
  case "many":
11969
11966
  case "oneOrMore":
11970
11967
  case "optional":
@@ -11973,31 +11970,77 @@ function mayCommitFailure(p, seen = /* @__PURE__ */ new Set(), resolve) {
11973
11970
  case "field":
11974
11971
  case "grammar":
11975
11972
  case "node":
11976
- return mayCommitFailure(d.parser, seen, resolve);
11977
- case "sepBy":
11978
- return mayCommitFailure(d.parser, seen, resolve) || mayCommitFailure(d.separator, seen, resolve);
11979
11973
  case "token":
11980
11974
  case "leaf":
11981
- return mayCommitFailure(d.parser, seen, resolve);
11982
11975
  case "withCtx":
11983
- return mayCommitFailure(d.parser, seen, resolve);
11976
+ return [d.parser];
11977
+ case "sepBy":
11978
+ return [d.parser, d.separator];
11984
11979
  case "scanTo":
11985
- 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);
11980
+ return [
11981
+ d.sentinel,
11982
+ ...d.skip,
11983
+ ...d.recoverAt === void 0 ? NO_EDGES : [d.recoverAt],
11984
+ ...d.stopAt === void 0 ? NO_EDGES : [d.stopAt]
11985
+ ];
11986
11986
  case "lazy": {
11987
11987
  try {
11988
- return mayCommitFailure(d.thunk(), seen, resolve);
11988
+ return [d.thunk()];
11989
11989
  } catch {
11990
11990
  const name = p._ruleName;
11991
11991
  const target = name === void 0 ? void 0 : resolve?.(name);
11992
- return target === void 0 ? true : mayCommitFailure(target, seen, resolve);
11992
+ return target === void 0 ? true : [target];
11993
11993
  }
11994
11994
  }
11995
- case "unknown":
11996
- return true;
11997
11995
  default:
11998
- return false;
11996
+ return NO_EDGES;
11999
11997
  }
12000
11998
  }
11999
+ function reachesMarked(root, successors, memo) {
12000
+ const known = memo.get(root);
12001
+ if (known !== void 0) return known;
12002
+ const order = /* @__PURE__ */ new Map();
12003
+ const low = [];
12004
+ const found = [];
12005
+ const stack = [];
12006
+ const visit = (node) => {
12007
+ const at = low.length;
12008
+ order.set(node, at);
12009
+ low.push(at);
12010
+ found.push(false);
12011
+ stack.push(node);
12012
+ const next = successors(node);
12013
+ if (next === true) found[at] = true;
12014
+ else {
12015
+ for (const child of next) {
12016
+ if (found[at]) break;
12017
+ const hit = memo.get(child);
12018
+ if (hit !== void 0) {
12019
+ if (hit) found[at] = true;
12020
+ continue;
12021
+ }
12022
+ const seen = order.get(child);
12023
+ if (seen !== void 0) {
12024
+ if (seen < low[at]) low[at] = seen;
12025
+ continue;
12026
+ }
12027
+ const k = visit(child);
12028
+ if (low[k] < low[at]) low[at] = low[k];
12029
+ if (found[k]) found[at] = true;
12030
+ }
12031
+ }
12032
+ if (low[at] === at) {
12033
+ const answer = found[at];
12034
+ let member;
12035
+ do {
12036
+ member = stack.pop();
12037
+ memo.set(member, answer);
12038
+ } while (member !== node);
12039
+ }
12040
+ return at;
12041
+ };
12042
+ return found[visit(root)];
12043
+ }
12001
12044
 
12002
12045
  // src/compiler/direct-projection.ts
12003
12046
  function directArrayProjection(fn, fnSrc, arity) {
@@ -12428,6 +12471,13 @@ var Encoder = class {
12428
12471
  * attempt sites reach it.
12429
12472
  */
12430
12473
  sideWriterMemo = /* @__PURE__ */ new Map();
12474
+ /**
12475
+ * `mayCommitFailure`'s answers, shared by every choice site for the lifetime
12476
+ * of this `Encoder` — exact for the graph and the `winners` resolver it is
12477
+ * encoding, so the rule graph is walked once per encode rather than once per
12478
+ * choice site.
12479
+ */
12480
+ commitFailureMemo = /* @__PURE__ */ new Map();
12431
12481
  labels = void 0;
12432
12482
  /** Trivia table in scope at the row being encoded — codegen's `ctx.activeTrivia`. */
12433
12483
  activeTrivia = void 0;
@@ -12868,62 +12918,11 @@ var Encoder = class {
12868
12918
  }
12869
12919
  /**
12870
12920
  * 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`.
12921
+ * is reachable from `root` — the writer census of `failureNeedsRollback`,
12922
+ * entering each combinator once per `Encoder` (see `reachesMarked`).
12882
12923
  */
12883
12924
  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;
12905
- }
12906
- const seen = order.get(child);
12907
- if (seen !== void 0) {
12908
- if (seen < low[at]) low[at] = seen;
12909
- continue;
12910
- }
12911
- const k = visit(child);
12912
- if (low[k] < low[at]) low[at] = low[k];
12913
- if (found[k]) found[at] = true;
12914
- }
12915
- }
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;
12925
- };
12926
- return found[visit(root)];
12925
+ return reachesMarked(root, (node) => this.sideWriterSuccessors(node), this.sideWriterMemo);
12927
12926
  }
12928
12927
  /** The census's edges out of `node`, or `true` when `node` is itself a writer. */
12929
12928
  sideWriterSuccessors(node) {
@@ -13278,7 +13277,7 @@ var Encoder = class {
13278
13277
  this.code[head + 4 + kids.length + i] = this.expected(deriveExpected(arms[i]));
13279
13278
  }
13280
13279
  this.choiceRollbackMasks.set(head, rollbackMask);
13281
- if (arms.every((arm) => !mayCommitFailure(arm, /* @__PURE__ */ new Set(), rr))) {
13280
+ if (arms.every((arm) => !mayCommitFailure(arm, rr, this.commitFailureMemo))) {
13282
13281
  this.nonCommittingChoiceSites.add(head);
13283
13282
  }
13284
13283
  return head;