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":"choice.d.ts","sourceRoot":"","sources":["../../src/combinators/choice.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EAC+B,QAAQ,EAClD,MAAM,aAAa,CAAA;AAMpB,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,KAAK,CAAA;AACvH,KAAK,SAAS,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI;KACrE,CAAC,IAAI,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAChC,CAAC,MAAM,CAAC,SAAS,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;AAEjD,wBAAgB,MAAM,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EACxH,GAAG,IAAI,EAAE,CAAC,GACT,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CA8M1B;AAgID;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,IAAI,CAWrF;AA6CD,uEAAuE;AACvE,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI,CAKzE;AAED,qEAAqE;AACrE,wBAAgB,eAAe,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAMhG"}
1
+ {"version":3,"file":"choice.d.ts","sourceRoot":"","sources":["../../src/combinators/choice.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EAC+B,QAAQ,EAClD,MAAM,aAAa,CAAA;AAMpB,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,KAAK,CAAA;AACvH,KAAK,SAAS,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI;KACrE,CAAC,IAAI,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAChC,CAAC,MAAM,CAAC,SAAS,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;AAEjD,wBAAgB,MAAM,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EACxH,GAAG,IAAI,EAAE,CAAC,GACT,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CA4M1B;AAgID;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,IAAI,CAWrF;AA6CD,uEAAuE;AACvE,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI,CAKzE;AAED,qEAAqE;AACrE,wBAAgB,eAAe,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAMhG"}
package/dist/index.js CHANGED
@@ -3048,14 +3048,8 @@ function choice(...args) {
3048
3048
  if (result.committed) return { ok: false, expected, span: { start: pos, end: pos }, committed: true };
3049
3049
  return { ok: false, expected, span: { start: pos, end: pos } };
3050
3050
  }
3051
- return {
3052
- ok: false,
3053
- expected: parsers.flatMap((p) => {
3054
- const r = p.parse(input, pos, ctx);
3055
- return r.ok ? [] : r.expected;
3056
- }),
3057
- span: { start: pos, end: pos }
3058
- };
3051
+ if (ctx._probe !== void 0 || ctx._tolerant) for (const p of parsers) p.parse(input, pos, ctx);
3052
+ return { ok: false, expected: [...scalarExpected], span: { start: pos, end: pos } };
3059
3053
  }
3060
3054
  if (strategy?.tag === "greedyClassify") {
3061
3055
  const superResult = parsers[strategy.superIndex].parse(input, pos, ctx);
@@ -6025,19 +6019,22 @@ function hasDirectBuildDef(p, seen = /* @__PURE__ */ new Set()) {
6025
6019
  return false;
6026
6020
  }
6027
6021
  }
6028
- function mayCommitFailure(p, seen = /* @__PURE__ */ new Set(), resolve) {
6029
- if (seen.has(p)) return false;
6030
- seen.add(p);
6022
+ function mayCommitFailure(p, resolve, memo = /* @__PURE__ */ new Map()) {
6023
+ return reachesMarked(p, (node2) => commitFailureSuccessors(node2, resolve), memo);
6024
+ }
6025
+ var NO_EDGES = [];
6026
+ function commitFailureSuccessors(p, resolve) {
6031
6027
  const d = p._def;
6032
6028
  switch (d.tag) {
6033
6029
  case "dispatch":
6030
+ case "unknown":
6034
6031
  return true;
6035
6032
  case "choice":
6036
6033
  case "sequence":
6037
- return d.parsers.some((x) => mayCommitFailure(x, seen, resolve));
6034
+ return d.parsers;
6038
6035
  // A contained transaction reports every failure uncommitted.
6039
6036
  case "attempt":
6040
- return d.contain !== true && mayCommitFailure(d.parser, seen, resolve);
6037
+ return d.contain === true ? NO_EDGES : [d.parser];
6041
6038
  case "many":
6042
6039
  case "oneOrMore":
6043
6040
  case "optional":
@@ -6046,31 +6043,77 @@ function mayCommitFailure(p, seen = /* @__PURE__ */ new Set(), resolve) {
6046
6043
  case "field":
6047
6044
  case "grammar":
6048
6045
  case "node":
6049
- return mayCommitFailure(d.parser, seen, resolve);
6050
- case "sepBy":
6051
- return mayCommitFailure(d.parser, seen, resolve) || mayCommitFailure(d.separator, seen, resolve);
6052
6046
  case "token":
6053
6047
  case "leaf":
6054
- return mayCommitFailure(d.parser, seen, resolve);
6055
6048
  case "withCtx":
6056
- return mayCommitFailure(d.parser, seen, resolve);
6049
+ return [d.parser];
6050
+ case "sepBy":
6051
+ return [d.parser, d.separator];
6057
6052
  case "scanTo":
6058
- 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);
6053
+ return [
6054
+ d.sentinel,
6055
+ ...d.skip,
6056
+ ...d.recoverAt === void 0 ? NO_EDGES : [d.recoverAt],
6057
+ ...d.stopAt === void 0 ? NO_EDGES : [d.stopAt]
6058
+ ];
6059
6059
  case "lazy": {
6060
6060
  try {
6061
- return mayCommitFailure(d.thunk(), seen, resolve);
6061
+ return [d.thunk()];
6062
6062
  } catch {
6063
6063
  const name = p._ruleName;
6064
6064
  const target = name === void 0 ? void 0 : resolve?.(name);
6065
- return target === void 0 ? true : mayCommitFailure(target, seen, resolve);
6065
+ return target === void 0 ? true : [target];
6066
6066
  }
6067
6067
  }
6068
- case "unknown":
6069
- return true;
6070
6068
  default:
6071
- return false;
6069
+ return NO_EDGES;
6072
6070
  }
6073
6071
  }
6072
+ function reachesMarked(root, successors, memo) {
6073
+ const known = memo.get(root);
6074
+ if (known !== void 0) return known;
6075
+ const order = /* @__PURE__ */ new Map();
6076
+ const low = [];
6077
+ const found = [];
6078
+ const stack = [];
6079
+ const visit = (node2) => {
6080
+ const at = low.length;
6081
+ order.set(node2, at);
6082
+ low.push(at);
6083
+ found.push(false);
6084
+ stack.push(node2);
6085
+ const next = successors(node2);
6086
+ if (next === true) found[at] = true;
6087
+ else {
6088
+ for (const child of next) {
6089
+ if (found[at]) break;
6090
+ const hit = memo.get(child);
6091
+ if (hit !== void 0) {
6092
+ if (hit) found[at] = true;
6093
+ continue;
6094
+ }
6095
+ const seen = order.get(child);
6096
+ if (seen !== void 0) {
6097
+ if (seen < low[at]) low[at] = seen;
6098
+ continue;
6099
+ }
6100
+ const k = visit(child);
6101
+ if (low[k] < low[at]) low[at] = low[k];
6102
+ if (found[k]) found[at] = true;
6103
+ }
6104
+ }
6105
+ if (low[at] === at) {
6106
+ const answer = found[at];
6107
+ let member;
6108
+ do {
6109
+ member = stack.pop();
6110
+ memo.set(member, answer);
6111
+ } while (member !== node2);
6112
+ }
6113
+ return at;
6114
+ };
6115
+ return found[visit(root)];
6116
+ }
6074
6117
  function hasSemanticReduction(roots, externalRefs) {
6075
6118
  const seen = /* @__PURE__ */ new Set();
6076
6119
  const visit = (parser2) => {
@@ -7266,6 +7309,13 @@ var Encoder = class {
7266
7309
  * attempt sites reach it.
7267
7310
  */
7268
7311
  sideWriterMemo = /* @__PURE__ */ new Map();
7312
+ /**
7313
+ * `mayCommitFailure`'s answers, shared by every choice site for the lifetime
7314
+ * of this `Encoder` — exact for the graph and the `winners` resolver it is
7315
+ * encoding, so the rule graph is walked once per encode rather than once per
7316
+ * choice site.
7317
+ */
7318
+ commitFailureMemo = /* @__PURE__ */ new Map();
7269
7319
  labels = void 0;
7270
7320
  /** Trivia table in scope at the row being encoded — codegen's `ctx.activeTrivia`. */
7271
7321
  activeTrivia = void 0;
@@ -7706,62 +7756,11 @@ var Encoder = class {
7706
7756
  }
7707
7757
  /**
7708
7758
  * Whether a field, recovered error, interpreted scanner or unresolvable shape
7709
- * is reachable from `root` — the writer census of `failureNeedsRollback`.
7710
- *
7711
- * Reachability over a cyclic graph, decided with Tarjan's strongly connected
7712
- * components so that every node the walk enters leaves with its exact answer
7713
- * memoized: the members of one component reach each other, so they share one
7714
- * answer, settled when the walk returns to the component's first node. A DFS
7715
- * that instead cuts a cycle at its own ancestor path learns nothing it can
7716
- * keep about a node whose walk hit the cut, and re-walks that node along
7717
- * every path that reaches it — exponential over recursive value rules (linking
7718
- * jess's SCSS grammar cost ~290G instructions). This walk enters each node
7719
- * once per `Encoder`.
7759
+ * is reachable from `root` — the writer census of `failureNeedsRollback`,
7760
+ * entering each combinator once per `Encoder` (see `reachesMarked`).
7720
7761
  */
7721
7762
  reachesSideWriter(root) {
7722
- const memo = this.sideWriterMemo;
7723
- const known = memo.get(root);
7724
- if (known !== void 0) return known;
7725
- const order = /* @__PURE__ */ new Map();
7726
- const low = [];
7727
- const found = [];
7728
- const stack = [];
7729
- const visit = (node2) => {
7730
- const at = low.length;
7731
- order.set(node2, at);
7732
- low.push(at);
7733
- found.push(false);
7734
- stack.push(node2);
7735
- const next = this.sideWriterSuccessors(node2);
7736
- if (next === true) found[at] = true;
7737
- else {
7738
- for (const child of next) {
7739
- const hit = memo.get(child);
7740
- if (hit !== void 0) {
7741
- if (hit) found[at] = true;
7742
- continue;
7743
- }
7744
- const seen = order.get(child);
7745
- if (seen !== void 0) {
7746
- if (seen < low[at]) low[at] = seen;
7747
- continue;
7748
- }
7749
- const k = visit(child);
7750
- if (low[k] < low[at]) low[at] = low[k];
7751
- if (found[k]) found[at] = true;
7752
- }
7753
- }
7754
- if (low[at] === at) {
7755
- const answer = found[at];
7756
- let member;
7757
- do {
7758
- member = stack.pop();
7759
- memo.set(member, answer);
7760
- } while (member !== node2);
7761
- }
7762
- return at;
7763
- };
7764
- return found[visit(root)];
7763
+ return reachesMarked(root, (node2) => this.sideWriterSuccessors(node2), this.sideWriterMemo);
7765
7764
  }
7766
7765
  /** The census's edges out of `node`, or `true` when `node` is itself a writer. */
7767
7766
  sideWriterSuccessors(node2) {
@@ -8116,7 +8115,7 @@ var Encoder = class {
8116
8115
  this.code[head + 4 + kids.length + i] = this.expected(deriveExpected(arms[i]));
8117
8116
  }
8118
8117
  this.choiceRollbackMasks.set(head, rollbackMask);
8119
- if (arms.every((arm) => !mayCommitFailure(arm, /* @__PURE__ */ new Set(), rr))) {
8118
+ if (arms.every((arm) => !mayCommitFailure(arm, rr, this.commitFailureMemo))) {
8120
8119
  this.nonCommittingChoiceSites.add(head);
8121
8120
  }
8122
8121
  return head;
@@ -17766,7 +17765,7 @@ function fieldOptionsSrc(def) {
17766
17765
  }
17767
17766
 
17768
17767
  // src/version.ts
17769
- var PARSEMAN_VERSION = "0.55.1";
17768
+ var PARSEMAN_VERSION = "0.55.3";
17770
17769
 
17771
17770
  // src/compiler/compile-linkable-table.ts
17772
17771
  function isLocal(rule) {