parseman 0.51.1 → 0.52.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 (64) hide show
  1. package/dist/analysis/commitment.d.ts.map +1 -1
  2. package/dist/analysis/diagnostics.js +101 -35
  3. package/dist/analysis/diagnostics.js.map +1 -1
  4. package/dist/cli/index.js +103 -37
  5. package/dist/cli/index.js.map +1 -1
  6. package/dist/combinators/attempt.d.ts +11 -1
  7. package/dist/combinators/attempt.d.ts.map +1 -1
  8. package/dist/combinators/map.d.ts.map +1 -1
  9. package/dist/combinators/node.d.ts +6 -2
  10. package/dist/combinators/node.d.ts.map +1 -1
  11. package/dist/combinators/token.d.ts +8 -8
  12. package/dist/combinators/token.d.ts.map +1 -1
  13. package/dist/compiler/token-capability.js +4 -0
  14. package/dist/compiler/token-capability.js.map +1 -1
  15. package/dist/coverage.d.ts.map +1 -1
  16. package/dist/cst/trivia-kinds.d.ts.map +1 -1
  17. package/dist/index.d.ts +2 -1
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +107 -40
  20. package/dist/index.js.map +1 -1
  21. package/dist/plugin/evaluator.d.ts.map +1 -1
  22. package/dist/plugin/index.js +107 -41
  23. package/dist/plugin/index.js.map +1 -1
  24. package/dist/spec/index.js +55 -10
  25. package/dist/spec/index.js.map +1 -1
  26. package/dist/table/assemble.d.ts.map +1 -1
  27. package/dist/table/emit-assembly.d.ts.map +1 -1
  28. package/dist/table/encode-baseline.d.ts.map +1 -1
  29. package/dist/table/exec-baseline.d.ts.map +1 -1
  30. package/dist/table/exec.d.ts.map +1 -1
  31. package/dist/table/index.js +404 -371
  32. package/dist/table/index.js.map +2 -2
  33. package/dist/table/ops.d.ts +9 -5
  34. package/dist/table/ops.d.ts.map +1 -1
  35. package/dist/table/site-labels.d.ts.map +1 -1
  36. package/dist/types.d.ts +9 -1
  37. package/dist/types.d.ts.map +1 -1
  38. package/dist/version.d.ts +1 -1
  39. package/package.json +1 -1
  40. package/src/analysis/commitment.ts +3 -1
  41. package/src/analysis/duplication.ts +1 -1
  42. package/src/analysis/rebuild.ts +3 -3
  43. package/src/combinators/attempt.ts +26 -3
  44. package/src/combinators/first-set.ts +5 -1
  45. package/src/combinators/map.ts +5 -1
  46. package/src/combinators/node.ts +12 -3
  47. package/src/combinators/token.ts +46 -3
  48. package/src/compiler/ir-serialize.ts +5 -5
  49. package/src/coverage.ts +3 -4
  50. package/src/cst/trivia-kinds.ts +6 -0
  51. package/src/index.ts +2 -1
  52. package/src/plugin/evaluator.ts +8 -5
  53. package/src/table/assemble.ts +30 -11
  54. package/src/table/child-slots.ts +2 -2
  55. package/src/table/emit-assembly.ts +13 -6
  56. package/src/table/encode-baseline.ts +8 -3
  57. package/src/table/encode.ts +16 -16
  58. package/src/table/exec-baseline.ts +30 -4
  59. package/src/table/exec.ts +14 -5
  60. package/src/table/ops.ts +10 -6
  61. package/src/table/scalar-terminal.ts +5 -5
  62. package/src/table/site-labels.ts +5 -3
  63. package/src/types.ts +9 -2
  64. package/src/version.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"evaluator.d.ts","sourceRoot":"","sources":["../../src/plugin/evaluator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"evaluator.d.ts","sourceRoot":"","sources":["../../src/plugin/evaluator.ts"],"names":[],"mappings":"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"}
@@ -265,6 +265,10 @@ function firstSetBody(p, seen, resolve3, activeTrivia) {
265
265
  case "node":
266
266
  case "sepBy":
267
267
  case "expect":
268
+ // A transaction accepts exactly what its inner accepts. Its own `_meta` is
269
+ // the inner's construction-time set, which reads `any` when the inner opens
270
+ // with a rule reference — resolve through it like any other wrapper.
271
+ case "attempt":
268
272
  return fs3(d.parser);
269
273
  case "grammar":
270
274
  return firstSetOf(
@@ -1404,6 +1408,10 @@ function peelLabel(p) {
1404
1408
  return null;
1405
1409
  }
1406
1410
  function analyzeLabeledTrivia(trivia2) {
1411
+ if (trivia2._def.tag === "trivia") {
1412
+ const own = trivia2._meta.labeledTriviaSpec;
1413
+ if (own !== void 0) return own;
1414
+ }
1407
1415
  if (trivia2 === labeledTrivia0) return labeledSpec0;
1408
1416
  if (trivia2 === labeledTrivia1) return labeledSpec1;
1409
1417
  if (trivia2 === labeledTrivia2) return labeledSpec2;
@@ -4061,13 +4069,24 @@ function dispatch(selector, ...arms) {
4061
4069
  }
4062
4070
 
4063
4071
  // src/combinators/attempt.ts
4064
- function attempt(parser2) {
4072
+ function containOption(options) {
4073
+ if (options === void 0) return false;
4074
+ for (const key of Object.keys(options)) {
4075
+ if (key !== "contain") throw new TypeError(`attempt(): unknown option ${JSON.stringify(key)}`);
4076
+ }
4077
+ if (options.contain !== void 0 && typeof options.contain !== "boolean") {
4078
+ throw new TypeError("attempt(): `contain` must be a boolean");
4079
+ }
4080
+ return options.contain === true;
4081
+ }
4082
+ function attempt(parser2, options) {
4083
+ const contain = containOption(options);
4065
4084
  const guardable = parser2._meta.firstSet.kind !== "any" && !matchesEmpty(parser2);
4066
4085
  let failExpected;
4067
4086
  return {
4068
4087
  _tag: "attempt",
4069
4088
  _meta: parser2._meta,
4070
- _def: { tag: "attempt", parser: parser2 },
4089
+ _def: contain ? { tag: "attempt", parser: parser2, contain: true } : { tag: "attempt", parser: parser2 },
4071
4090
  parse(input, pos, ctx) {
4072
4091
  if (guardable && ctx._probe === void 0 && !ctx._tolerant && !startsFirstSet(parser2, input, pos)) {
4073
4092
  if (failExpected === void 0) {
@@ -4084,7 +4103,7 @@ function attempt(parser2) {
4084
4103
  rollbackCstCapture(ctx, mark);
4085
4104
  if (log !== void 0 && ctx._triviaLog && ctx._triviaLog.length !== log) ctx._triviaLog.length = log;
4086
4105
  if (rootLog !== void 0 && ctx._rootTriviaLog && ctx._rootTriviaLog.length !== rootLog) ctx._rootTriviaLog.length = rootLog;
4087
- if (result.committed) return result;
4106
+ if (result.committed && !contain) return result;
4088
4107
  return { ok: false, expected: result.expected, span: { start: pos, end: pos } };
4089
4108
  }
4090
4109
  };
@@ -4939,7 +4958,7 @@ function node(typeOrCombinator, combinatorOrBuild, buildOrOpts, maybeOpts) {
4939
4958
  throw new Error("node() options cannot combine project with unwrap or collapse");
4940
4959
  }
4941
4960
  const def = unwrap || collapse || project !== void 0 || captureTrivia || trailingTrivia || buildArity !== void 0 || tags !== void 0 && tags.length > 0 ? { ...baseDef, ...unwrap ? { unwrap: true } : {}, ...collapse ? { collapse: true } : {}, ...project !== void 0 ? { project } : {}, ...captureTrivia ? { captureTrivia: true } : {}, ...trailingTrivia ? { trailingTrivia: true } : {}, ...buildArity !== void 0 ? { buildArity } : {}, ...tags !== void 0 && tags.length > 0 ? { tags } : {} } : baseDef;
4942
- const capturesTrivia = captureTrivia || trailingTrivia || (build ? buildReadsTrivia(def) : project === void 0);
4961
+ const capturesTrivia = captureTrivia || (build ? buildReadsTrivia(def) : project === void 0);
4943
4962
  const clonesState = build ? buildReadsState(def) : project === void 0;
4944
4963
  const hasOwnFields = parserHasOwnFields(combinator);
4945
4964
  const capturesFields = hasOwnFields && (build ? buildReadsFields(def) : project === void 0);
@@ -5053,13 +5072,17 @@ function transform(combinator, fn) {
5053
5072
  };
5054
5073
  }
5055
5074
  function trivia(combinator) {
5056
- const kindLabels = analyzeLabeledTrivia(combinator)?.labels;
5075
+ const labeled = analyzeLabeledTrivia(combinator);
5076
+ const kindLabels = labeled?.labels;
5057
5077
  return {
5058
5078
  _tag: combinator._tag,
5059
5079
  _meta: {
5060
5080
  ...combinator._meta,
5061
5081
  isTrivia: true,
5062
5082
  triviaScanner: fastTriviaScanner(combinator),
5083
+ // Every labeled scan of this trivia reads its spec; the module's four-slot
5084
+ // memo alone thrashes on a grammar with more than four trivia tables.
5085
+ labeledTriviaSpec: labeled,
5063
5086
  ...kindLabels ? { triviaKindLabels: kindLabels } : {}
5064
5087
  },
5065
5088
  _def: { tag: "trivia", parser: combinator },
@@ -5113,6 +5136,12 @@ function field(name, combinator) {
5113
5136
  }
5114
5137
 
5115
5138
  // src/combinators/token.ts
5139
+ function semanticLeafValue(_ctx, _input, _start, _end, value) {
5140
+ return value;
5141
+ }
5142
+ function sourceLeafValue(ctx, input, start, end, value) {
5143
+ return cstOutputHost(ctx.build) ? input.slice(start, end) : value;
5144
+ }
5116
5145
  function token(root) {
5117
5146
  const meta = {
5118
5147
  firstSet: root._meta.firstSet,
@@ -5165,7 +5194,8 @@ function token(root) {
5165
5194
  }
5166
5195
  };
5167
5196
  }
5168
- function leaf(root, fn) {
5197
+ function makeLeaf(root, fn, sourceCstValue) {
5198
+ const cstValue = sourceCstValue ? sourceLeafValue : semanticLeafValue;
5169
5199
  const meta = {
5170
5200
  firstSet: root._meta.firstSet,
5171
5201
  canMatchNewline: root._meta.canMatchNewline,
@@ -5174,7 +5204,12 @@ function leaf(root, fn) {
5174
5204
  return {
5175
5205
  _tag: "leaf",
5176
5206
  _meta: meta,
5177
- _def: { tag: "leaf", parser: root, fn },
5207
+ _def: {
5208
+ tag: "leaf",
5209
+ parser: root,
5210
+ fn,
5211
+ ...sourceCstValue ? { cstValue: "source" } : {}
5212
+ },
5178
5213
  parse(input, pos, ctx) {
5179
5214
  const savedBuf = ctx._cstBuf;
5180
5215
  const savedChildren = ctx._cstChildren;
@@ -5202,11 +5237,21 @@ function leaf(root, fn) {
5202
5237
  }
5203
5238
  if (!result.ok) return result;
5204
5239
  const value = fn(result.value, result.span);
5205
- if (wasCapturing) pushCstLeaf(ctx, { _tag: "leaf", value, span: result.span });
5240
+ if (wasCapturing) pushCstLeaf(ctx, {
5241
+ _tag: "leaf",
5242
+ value: cstValue(ctx, input, pos, result.span.end, value),
5243
+ span: result.span
5244
+ });
5206
5245
  return { ok: true, value, span: result.span };
5207
5246
  }
5208
5247
  };
5209
5248
  }
5249
+ function leaf(root, fn) {
5250
+ return makeLeaf(root, fn, false);
5251
+ }
5252
+ function sourceLeaf(root, fn) {
5253
+ return makeLeaf(root, fn, true);
5254
+ }
5210
5255
 
5211
5256
  // src/analysis/gating.ts
5212
5257
  function childrenOf2(d) {
@@ -5570,10 +5615,12 @@ function mayCommitFailure(p, seen = /* @__PURE__ */ new Set(), resolve3) {
5570
5615
  case "choice":
5571
5616
  case "sequence":
5572
5617
  return d.parsers.some((x) => mayCommitFailure(x, seen, resolve3));
5618
+ // A contained transaction reports every failure uncommitted.
5619
+ case "attempt":
5620
+ return d.contain !== true && mayCommitFailure(d.parser, seen, resolve3);
5573
5621
  case "many":
5574
5622
  case "oneOrMore":
5575
5623
  case "optional":
5576
- case "attempt":
5577
5624
  case "transform":
5578
5625
  case "label":
5579
5626
  case "field":
@@ -5698,6 +5745,7 @@ var OP_COV = 40;
5698
5745
  var OP_SCOPE_PLAIN = 41;
5699
5746
  var OP_LEX_BODY = 42;
5700
5747
  var OP_LEX_PROGRAM = 43;
5748
+ var OP_SOURCE_LEAF = 44;
5701
5749
  var OP_DISPATCH = 25;
5702
5750
  var OP_ROUTED = 26;
5703
5751
  var OP_NAMES = {
@@ -5716,6 +5764,7 @@ var OP_NAMES = {
5716
5764
  [OP_NOT]: "NOT",
5717
5765
  [OP_PEEK]: "PEEK",
5718
5766
  [OP_LEAF]: "LEAF",
5767
+ [OP_SOURCE_LEAF]: "SOURCE_LEAF",
5719
5768
  [OP_EMPTY]: "EMPTY",
5720
5769
  [OP_LIT_TRACK]: "LIT_TRACK",
5721
5770
  [OP_RX_TRACK]: "RX_TRACK",
@@ -7668,7 +7717,7 @@ var Encoder = class {
7668
7717
  }
7669
7718
  case "leaf": {
7670
7719
  const child = this.node(d.parser).ip;
7671
- return this.emit(OP_LEAF, this.fn(d.fn, d.fnSrc ?? null), child);
7720
+ return this.emit(d.cstValue === "source" ? OP_SOURCE_LEAF : OP_LEAF, this.fn(d.fn, d.fnSrc ?? null), child);
7672
7721
  }
7673
7722
  case "node": {
7674
7723
  if (d.type === void 0) missingInferredType();
@@ -7680,7 +7729,7 @@ var Encoder = class {
7680
7729
  const derivedState = d.build !== void 0 ? buildReadsState(d) : noBuildCaptures;
7681
7730
  const derivedFields = d.build !== void 0 ? buildReadsFields(d) : noBuildCaptures;
7682
7731
  const wantsFields = parserHasOwnFields(d.parser) && (cstOut || derivedFields);
7683
- const flags = (cstOut || d.captureTrivia === true || d.trailingTrivia === true || derivedTrivia ? 4 : 0) | (!cstOut && omitsRaw ? 2 : 0) | (cstOut || derivedState ? 8 : 0) | (wantsFields ? 16 : 0) | (d.collapse === true ? 32 : 0) | (d.unwrap === true ? 64 : 0) | (d.trailingTrivia === true ? 128 : 0) | (d.captureTrivia === true ? 1 : 0);
7732
+ const flags = (cstOut || d.captureTrivia === true || derivedTrivia ? 4 : 0) | (!cstOut && omitsRaw ? 2 : 0) | (cstOut || derivedState ? 8 : 0) | (wantsFields ? 16 : 0) | (d.collapse === true ? 32 : 0) | (d.unwrap === true ? 64 : 0) | (d.trailingTrivia === true ? 128 : 0) | (d.captureTrivia === true ? 1 : 0);
7684
7733
  const body = this.emit(
7685
7734
  this.track ? OP_NODE_TRACK : OP_NODE,
7686
7735
  d.build === void 0 ? -1 : this.fn(d.build, d.buildSrc ?? null),
@@ -7806,7 +7855,7 @@ var Encoder = class {
7806
7855
  // A TRANSACTION IS A ROW. See `OP_ATTEMPT` for why the transparent
7807
7856
  // lowering was correct only for a choice arm.
7808
7857
  case "attempt": {
7809
- const inner = this.emit(OP_ATTEMPT, this.node(d.parser).ip);
7858
+ const inner = this.emit(OP_ATTEMPT, this.node(d.parser).ip, d.contain === true ? 1 : 0);
7810
7859
  if (!this.failureNeedsRollback(d.parser, void 0)) this.failureRollbackCleanSites.add(inner);
7811
7860
  const fs3 = d.parser._def.tag === "lazy" ? firstSetOf(d.parser, /* @__PURE__ */ new Set(), this.refResolver(), this.activeTrivia) : d.parser._meta.firstSet;
7812
7861
  if (fs3.kind === "any" || matchesEmpty(d.parser)) return inner;
@@ -7893,6 +7942,7 @@ var Encoder = class {
7893
7942
  case OP_WITHCTX:
7894
7943
  case OP_XFORM:
7895
7944
  case OP_LEAF:
7945
+ case OP_SOURCE_LEAF:
7896
7946
  case OP_NODE:
7897
7947
  case OP_NODE_TRACK:
7898
7948
  return [ip + 2];
@@ -9102,6 +9152,7 @@ function childSlots(code, ip, out) {
9102
9152
  case OP_NODE_TRACK:
9103
9153
  case OP_FIELD:
9104
9154
  case OP_LEAF:
9155
+ case OP_SOURCE_LEAF:
9105
9156
  case OP_ARMGATE:
9106
9157
  out.push(code[ip + 2]);
9107
9158
  return true;
@@ -9197,7 +9248,7 @@ function transfer(code, ip, at, hostCst) {
9197
9248
  }
9198
9249
  if (op === OP_NODE || op === OP_NODE_TRACK) {
9199
9250
  const flags = code[ip + 3];
9200
- const directChildren = !hostCst && op === OP_NODE && code[ip + 1] >= 0 && code[ip + 4] < 0 && (flags === 2 || flags === 18 || flags === 34);
9251
+ const directChildren = !hostCst && op === OP_NODE && code[ip + 1] >= 0 && code[ip + 4] < 0 && ((flags & ~128) === 2 || flags === 18 || flags === 34);
9201
9252
  if (directChildren) {
9202
9253
  return { tri: at.tri, buf: false, raw: RAW_UNKNOWN, cap: CAP_OFF };
9203
9254
  }
@@ -9210,7 +9261,7 @@ function transfer(code, ip, at, hostCst) {
9210
9261
  if (at.tri === TRI_NONE && !at.buf) return at;
9211
9262
  return { tri: TRI_NONE, buf: false, raw: RAW_UNKNOWN, cap: at.cap };
9212
9263
  }
9213
- if (op === OP_LEAF) {
9264
+ if (op === OP_LEAF || op === OP_SOURCE_LEAF) {
9214
9265
  if (!at.buf) return at;
9215
9266
  return { tri: at.tri, buf: false, raw: RAW_UNKNOWN, cap: at.cap };
9216
9267
  }
@@ -9297,7 +9348,7 @@ function leadingScalarTerminal(code, ip, minDepth = 2, throughAttempt = true, th
9297
9348
  depth++;
9298
9349
  continue;
9299
9350
  }
9300
- if (op === OP_GATE || op === OP_SCOPE || op === OP_SCOPE_CAP || op === OP_SCOPE_PLAIN || op === OP_XFORM || op === OP_NODE || op === OP_FIELD || op === OP_LEAF) {
9351
+ if (op === OP_GATE || op === OP_SCOPE || op === OP_SCOPE_CAP || op === OP_SCOPE_PLAIN || op === OP_XFORM || op === OP_NODE || op === OP_FIELD || (op === OP_LEAF || op === OP_SOURCE_LEAF)) {
9301
9352
  at = code[at + 2];
9302
9353
  depth++;
9303
9354
  continue;
@@ -9330,7 +9381,7 @@ function leadingScalarSequence(code, ip) {
9330
9381
  at2 = code[at2 + 1];
9331
9382
  continue;
9332
9383
  }
9333
- if (op === OP_GATE || op === OP_SCOPE_PLAIN || op === OP_XFORM || op === OP_NODE || op === OP_FIELD || op === OP_LEAF) {
9384
+ if (op === OP_GATE || op === OP_SCOPE_PLAIN || op === OP_XFORM || op === OP_NODE || op === OP_FIELD || (op === OP_LEAF || op === OP_SOURCE_LEAF)) {
9334
9385
  at2 = code[at2 + 2];
9335
9386
  continue;
9336
9387
  }
@@ -9363,7 +9414,7 @@ function leadingScalarSequence(code, ip) {
9363
9414
  at = code[at + 2];
9364
9415
  continue;
9365
9416
  }
9366
- if (op === OP_GATE || op === OP_XFORM || op === OP_NODE || op === OP_FIELD || op === OP_LEAF) {
9417
+ if (op === OP_GATE || op === OP_XFORM || op === OP_NODE || op === OP_FIELD || (op === OP_LEAF || op === OP_SOURCE_LEAF)) {
9367
9418
  at = code[at + 2];
9368
9419
  continue;
9369
9420
  }
@@ -9393,7 +9444,7 @@ function leadingLiteralFamily(code, constants, ip, minDepth = 2, limit = 4) {
9393
9444
  if (op === OP_RULE || op === OP_LABEL || op === OP_TOKEN || op === OP_ATTEMPT || op === OP_PEEK) {
9394
9445
  return walk(code[at + 1], depth + 1);
9395
9446
  }
9396
- if (op === OP_GATE || op === OP_SCOPE || op === OP_SCOPE_CAP || op === OP_SCOPE_PLAIN || op === OP_XFORM || op === OP_NODE || op === OP_FIELD || op === OP_LEAF) {
9447
+ if (op === OP_GATE || op === OP_SCOPE || op === OP_SCOPE_CAP || op === OP_SCOPE_PLAIN || op === OP_XFORM || op === OP_NODE || op === OP_FIELD || (op === OP_LEAF || op === OP_SOURCE_LEAF)) {
9397
9448
  return walk(code[at + 2], depth + 1);
9398
9449
  }
9399
9450
  if (op === OP_SEQ || op === OP_SEQV) {
@@ -10279,8 +10330,10 @@ ${rootCap ? "ctx._rootTriviaCapture=sR\n" : ""}return v
10279
10330
  }
10280
10331
  /* ── boundaries ──────────────────────────────────────────────────────── */
10281
10332
  case OP_TOKEN:
10282
- case OP_LEAF: {
10333
+ case OP_LEAF:
10334
+ case OP_SOURCE_LEAF: {
10283
10335
  const isToken = op === OP_TOKEN;
10336
+ const capturesSource = isToken || op === OP_SOURCE_LEAF && hostCst;
10284
10337
  const fn = isToken ? void 0 : fnRef(code[ip + 1]);
10285
10338
  const child = link(isToken ? code[ip + 1] : code[ip + 2]);
10286
10339
  const wasCap = L.buf ? "true" : "(ctx._cstBuf!==undefined||ctx._cstLeaves!==undefined)";
@@ -10313,7 +10366,7 @@ ctx._triviaLog=sOtl
10313
10366
  if(v===FAIL)return FAIL
10314
10367
  const e=EC.e
10315
10368
  const out=${isToken ? "input.slice(pos,e)" : `${fn}(v,{start:pos,end:e})`}
10316
- if(wasCap)pushCstLeaf(ctx,{_tag:'leaf',value:out,span:{start:pos,end:e}})
10369
+ if(wasCap)pushCstLeaf(ctx,{_tag:'leaf',value:${capturesSource ? "input.slice(pos,e)" : "out"},span:{start:pos,end:e}})
10317
10370
  EC.e=e
10318
10371
  return out
10319
10372
  }`;
@@ -10399,7 +10452,7 @@ ${clean ? "" : emitMark(p, L.buf, L.raw, sinks)}
10399
10452
  const v=${child}(input,pos,ctx)
10400
10453
  if(v!==FAIL)return v
10401
10454
  ${clean ? "" : emitRollback(p, L.buf, L.raw, sinks)}
10402
- if(ctx._fc===true)return FAIL
10455
+ ${code[ip + 2] === 1 ? "ctx._fc=false" : "if(ctx._fc===true)return FAIL"}
10403
10456
  ctx._fe=pos
10404
10457
  return FAIL
10405
10458
  }`;
@@ -10988,7 +11041,8 @@ return nd
10988
11041
  const unwrap = (flags & 64) !== 0;
10989
11042
  const trailingTrivia = (flags & 128) !== 0;
10990
11043
  const build = buildIdx >= 0 ? fnRef(buildIdx) : void 0;
10991
- if (!hostCst && !tracked && build !== void 0 && proj < 0 && (flags === 2 || flags === 18 || flags === 34)) {
11044
+ const leanFlags = flags & ~128;
11045
+ if (!hostCst && !tracked && build !== void 0 && proj < 0 && (leanFlags === 2 || (flags === 18 || flags === 34))) {
10992
11046
  const fields = flags === 18;
10993
11047
  const collapseChildren = flags === 34;
10994
11048
  const publish = L.buf && L.raw === RAW_OMIT ? "_pushNodeNoRawBuf(ctx,nd)" : L.buf && L.raw === RAW_CAPTURE ? `if(sBuf!==undefined){
@@ -11033,7 +11087,8 @@ ctx._cstTriviaLog=undefined
11033
11087
  ctx.captureTrivia=false
11034
11088
  ctx._fields=${fields ? "[]" : "undefined"}
11035
11089
  const v=${child}(input,pos,ctx)
11036
- const captured=_capturedFlatChildren(flat)
11090
+ ${trailingTrivia && L.tri !== TRI_NONE ? `if(v!==FAIL${L.tri === TRI_UNKNOWN ? "&&ctx.trivia!==undefined" : ""})EC.e=consumeTrivia(input,EC.e,ctx)
11091
+ ` : ""}const captured=_capturedFlatChildren(flat)
11037
11092
  ${fields ? "const fieldMap=buildFieldMap(ctx._fields)\n" : ""}ctx._fields=sFields
11038
11093
  ctx._cstBuf=sBuf
11039
11094
  ctx._cstChildren=sCh
@@ -11653,7 +11708,7 @@ function assemble(t, prog, cfg) {
11653
11708
  const lf = { _tag: "leaf", value, span: { start: s, end: e } };
11654
11709
  pushCstLeaf(ctx, lf);
11655
11710
  }
11656
- function plainBuildNode(child, build) {
11711
+ function plainBuildNode(child, build, trailing) {
11657
11712
  return (input, pos, ctx) => {
11658
11713
  const sCh = ctx._cstChildren;
11659
11714
  const sLv = ctx._cstLeaves;
@@ -11671,6 +11726,7 @@ function assemble(t, prog, cfg) {
11671
11726
  ctx.captureTrivia = false;
11672
11727
  ctx._fields = void 0;
11673
11728
  const value = child(input, pos, ctx);
11729
+ if (trailing && value !== FAIL && ctx.trivia !== void 0) EC.e = consumeTrivia(input, EC.e, ctx);
11674
11730
  const kids = buf.ch ?? (buf.single !== void 0 ? [buf.single] : EMPTY_CH);
11675
11731
  const rawKids = buf.raw ?? (buf.rawSingle !== void 0 ? [buf.rawSingle] : EMPTY_CH);
11676
11732
  ctx._fields = savedFields;
@@ -11698,7 +11754,7 @@ function assemble(t, prog, cfg) {
11698
11754
  while (first < children3.length && children3[first] === void 0) first++;
11699
11755
  return first === children3.length ? EMPTY_CH : children3.slice(first);
11700
11756
  }
11701
- function childrenOnlyBuildNode(child, build) {
11757
+ function childrenOnlyBuildNode(child, build, trailing) {
11702
11758
  return (input, pos, ctx) => {
11703
11759
  const sCh = ctx._cstChildren;
11704
11760
  const sLv = ctx._cstLeaves;
@@ -11716,6 +11772,7 @@ function assemble(t, prog, cfg) {
11716
11772
  ctx.captureTrivia = false;
11717
11773
  ctx._fields = void 0;
11718
11774
  const value = child(input, pos, ctx);
11775
+ if (trailing && value !== FAIL && ctx.trivia !== void 0) EC.e = consumeTrivia(input, EC.e, ctx);
11719
11776
  const captured = capturedFlatChildren(kids);
11720
11777
  ctx._fields = savedFields;
11721
11778
  ctx._cstBuf = sBuf;
@@ -12740,6 +12797,7 @@ function assemble(t, prog, cfg) {
12740
12797
  /* ── transaction ─────────────────────────────────────────────────────── */
12741
12798
  case OP_ATTEMPT: {
12742
12799
  const child = link(code[ip + 1]);
12800
+ const contain = code[ip + 2] === 1;
12743
12801
  return (input, pos, ctx) => {
12744
12802
  const need = markCst(ctx);
12745
12803
  const mRaw = MRAW;
@@ -12752,7 +12810,10 @@ function assemble(t, prog, cfg) {
12752
12810
  const v = child(input, pos, ctx);
12753
12811
  if (v !== FAIL) return v;
12754
12812
  if (need) rollbackTriviaAt(ctx, mRaw, mTl, mLv, mFl, mEr, mLog, mRoot);
12755
- if (committed3(ctx)) return FAIL;
12813
+ if (committed3(ctx)) {
12814
+ if (!contain) return FAIL;
12815
+ ctx._fc = false;
12816
+ }
12756
12817
  ctx._fe = pos;
12757
12818
  return FAIL;
12758
12819
  };
@@ -12970,7 +13031,8 @@ function assemble(t, prog, cfg) {
12970
13031
  return value;
12971
13032
  };
12972
13033
  }
12973
- case OP_LEAF: {
13034
+ case OP_LEAF:
13035
+ case OP_SOURCE_LEAF: {
12974
13036
  const fn = fns[code[ip + 1]];
12975
13037
  const child = link(code[ip + 2]);
12976
13038
  return (input, pos, ctx) => {
@@ -12998,7 +13060,11 @@ function assemble(t, prog, cfg) {
12998
13060
  if (v === FAIL) return FAIL;
12999
13061
  const end = EC.e;
13000
13062
  const out = fn(v, { start: pos, end });
13001
- if (wasCapturing) pushCstLeaf(ctx, { _tag: "leaf", value: out, span: { start: pos, end } });
13063
+ if (wasCapturing) pushCstLeaf(ctx, {
13064
+ _tag: "leaf",
13065
+ value: op === OP_SOURCE_LEAF && hostCst ? input.slice(pos, end) : out,
13066
+ span: { start: pos, end }
13067
+ });
13002
13068
  EC.e = end;
13003
13069
  return out;
13004
13070
  };
@@ -14198,11 +14264,11 @@ function assemble(t, prog, cfg) {
14198
14264
  const trailingTrivia = (flags & 128) !== 0;
14199
14265
  const build = buildIdx >= 0 ? fns[buildIdx] : void 0;
14200
14266
  if (!hostCst && !tracked) {
14201
- if (build !== void 0 && proj < 0 && flags === 0) {
14202
- return plainBuildNode(child, build);
14267
+ if (build !== void 0 && proj < 0 && (flags & ~128) === 0) {
14268
+ return plainBuildNode(child, build, trailingTrivia);
14203
14269
  }
14204
- if (build !== void 0 && proj < 0 && flags === 2) {
14205
- return childrenOnlyBuildNode(child, build);
14270
+ if (build !== void 0 && proj < 0 && (flags & ~128) === 2) {
14271
+ return childrenOnlyBuildNode(child, build, trailingTrivia);
14206
14272
  }
14207
14273
  if (build !== void 0 && proj < 0 && flags === 18) {
14208
14274
  return childrenOnlyFieldsBuildNode(child, build);
@@ -15039,7 +15105,7 @@ function payloadKey(p, d) {
15039
15105
  case "transform":
15040
15106
  return `transform\0${fnKey(d.fnSrc, d.fn)}\0${d.recognitionOnly === true}`;
15041
15107
  case "leaf":
15042
- return `leaf\0${fnKey(d.fnSrc, d.fn)}`;
15108
+ return `leaf\0${d.cstValue ?? "value"}\0${fnKey(d.fnSrc, d.fn)}`;
15043
15109
  case "many":
15044
15110
  case "oneOrMore":
15045
15111
  return `${d.tag}\0${d.min}\0${d.max ?? ""}`;
@@ -16528,7 +16594,7 @@ function evalRuleMapIR(ir) {
16528
16594
  if (recognitionOnly) t._def.recognitionOnly = true;
16529
16595
  return t;
16530
16596
  };
16531
- const _lf = (child, src) => {
16597
+ const _lf = (child, src, source = false) => {
16532
16598
  let fn2;
16533
16599
  try {
16534
16600
  fn2 = (0, eval)(`(${src})`);
@@ -16537,7 +16603,7 @@ function evalRuleMapIR(ir) {
16537
16603
  throw new Error("IR leaf fn not materialized");
16538
16604
  };
16539
16605
  }
16540
- const l = leaf(child, fn2);
16606
+ const l = source ? sourceLeaf(child, fn2) : leaf(child, fn2);
16541
16607
  l._def.fnSrc = src;
16542
16608
  return l;
16543
16609
  };
@@ -16921,7 +16987,7 @@ ${outerDecls.map((d) => " " + d).join("\n")}
16921
16987
  case "optional":
16922
16988
  return `optional(${kid(def.parser)})`;
16923
16989
  case "attempt":
16924
- return `attempt(${kid(def.parser)})`;
16990
+ return `attempt(${kid(def.parser)}${def.contain === true ? ", { contain: true }" : ""})`;
16925
16991
  // `keepSeparators` is an opt-in expressed at the SEPARATOR, not in the options
16926
16992
  // bag, so it must round-trip as `keepSeparator(sep)` — serializing it as an
16927
16993
  // option would reconstruct a grammar whose call site no longer states its own
@@ -16940,7 +17006,7 @@ ${outerDecls.map((d) => " " + d).join("\n")}
16940
17006
  return `token(${kid(def.parser)})`;
16941
17007
  case "leaf": {
16942
17008
  if (def.fnSrc === void 0) throw new Unserializable("leaf without fnSrc");
16943
- return `_lf(${kid(def.parser)}, ${JSON.stringify(def.fnSrc)})`;
17009
+ return `_lf(${kid(def.parser)}, ${JSON.stringify(def.fnSrc)}${def.cstValue === "source" ? ", true" : ""})`;
16944
17010
  }
16945
17011
  case "label":
16946
17012
  return `label(${JSON.stringify(def.label)}, ${kid(def.parser)})`;
@@ -17129,7 +17195,7 @@ function compileRuleMap(ruleMap, opts = {}) {
17129
17195
  }
17130
17196
 
17131
17197
  // src/version.ts
17132
- var PARSEMAN_VERSION = "0.51.1";
17198
+ var PARSEMAN_VERSION = "0.52.0";
17133
17199
 
17134
17200
  // src/compiler/compile-linkable-table.ts
17135
17201
  function isLocal(rule) {
@@ -17578,7 +17644,7 @@ var SUPPORTED = {
17578
17644
  word: (...a) => word(a[0], a[1], a[2]),
17579
17645
  sequence: (...a) => sequence(...a),
17580
17646
  choice: (...a) => choice(...a),
17581
- attempt: (...a) => attempt(a[0]),
17647
+ attempt: (...a) => attempt(a[0], a[1]),
17582
17648
  optional: (...a) => optional(a[0]),
17583
17649
  trivia: (...a) => trivia(a[0]),
17584
17650
  classifiedTrivia: (...a) => classifiedTrivia(
@@ -17852,7 +17918,7 @@ function exprToCombi(node2, scope, code, mfs) {
17852
17918
  return null;
17853
17919
  }
17854
17920
  }
17855
- if (callee.name === "leaf" && code !== void 0 && mfs !== void 0) {
17921
+ if ((callee.name === "leaf" || callee.name === "sourceLeaf") && code !== void 0 && mfs !== void 0) {
17856
17922
  const [parserArg, fnArg] = node2.arguments;
17857
17923
  if (!parserArg || !fnArg || parserArg.type === "SpreadElement" || fnArg.type === "SpreadElement") return null;
17858
17924
  const inner = anyValue(parserArg, scope, code, mfs);
@@ -17860,7 +17926,7 @@ function exprToCombi(node2, scope, code, mfs) {
17860
17926
  const fnSrc = stripTsFromSource(fnArg, code);
17861
17927
  mfs.push(fnSrc);
17862
17928
  try {
17863
- const combi = leaf(inner, (v) => v);
17929
+ const combi = callee.name === "sourceLeaf" ? sourceLeaf(inner, (v) => v) : leaf(inner, (v) => v);
17864
17930
  if (combi._def.tag === "leaf") combi._def.fnSrc = fnSrc;
17865
17931
  return combi;
17866
17932
  } catch {