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
package/dist/index.d.ts CHANGED
@@ -9,6 +9,7 @@ export { choice } from './combinators/choice.ts';
9
9
  export { dispatch, endsWith, makeWhen, matches, otherwise, routed, startsWith, when } from './combinators/dispatch.ts';
10
10
  export type { DispatchArm, DispatchOtherwise, DispatchStringMatcher, DispatchWhen, DispatchWhenFactory, DispatchWhenOptions, DispatchWhenMatcher } from './combinators/dispatch.ts';
11
11
  export { attempt } from './combinators/attempt.ts';
12
+ export type { AttemptOptions } from './combinators/attempt.ts';
12
13
  export { many, oneOrMore, optional, sepBy, oneOrMoreSep, keepSeparator } from './combinators/repeat.ts';
13
14
  export type { RepeatOptions, SepByOptions, TrailingSeparator, KeptSeparator } from './combinators/repeat.ts';
14
15
  export { rules } from './combinators/parser.ts';
@@ -20,7 +21,7 @@ export type { BuildNode, NodeCombinator, NodeOptions, NodeProjectOptions } from
20
21
  export { transform, trivia, classifiedTrivia, label, field } from './combinators/map.ts';
21
22
  export { parse, parser, noTrivia } from './combinators/grammar.ts';
22
23
  export type { ParseOptions, ParserOptions, ParsemanParser } from './combinators/grammar.ts';
23
- export { token, leaf } from './combinators/token.ts';
24
+ export { token, leaf, sourceLeaf } from './combinators/token.ts';
24
25
  export { compile } from './table/compile.ts';
25
26
  export type { HostMode } from './cst/host-mode.ts';
26
27
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -257,6 +257,10 @@ function firstSetBody(p, seen, resolve, activeTrivia) {
257
257
  case "node":
258
258
  case "sepBy":
259
259
  case "expect":
260
+ // A transaction accepts exactly what its inner accepts. Its own `_meta` is
261
+ // the inner's construction-time set, which reads `any` when the inner opens
262
+ // with a rule reference — resolve through it like any other wrapper.
263
+ case "attempt":
260
264
  return fs(d.parser);
261
265
  case "grammar":
262
266
  return firstSetOf(
@@ -1795,6 +1799,10 @@ function peelLabel(p) {
1795
1799
  return null;
1796
1800
  }
1797
1801
  function analyzeLabeledTrivia(trivia2) {
1802
+ if (trivia2._def.tag === "trivia") {
1803
+ const own = trivia2._meta.labeledTriviaSpec;
1804
+ if (own !== void 0) return own;
1805
+ }
1798
1806
  if (trivia2 === labeledTrivia0) return labeledSpec0;
1799
1807
  if (trivia2 === labeledTrivia1) return labeledSpec1;
1800
1808
  if (trivia2 === labeledTrivia2) return labeledSpec2;
@@ -3541,13 +3549,24 @@ function dispatch(selector, ...arms) {
3541
3549
  }
3542
3550
 
3543
3551
  // src/combinators/attempt.ts
3544
- function attempt(parser2) {
3552
+ function containOption(options) {
3553
+ if (options === void 0) return false;
3554
+ for (const key of Object.keys(options)) {
3555
+ if (key !== "contain") throw new TypeError(`attempt(): unknown option ${JSON.stringify(key)}`);
3556
+ }
3557
+ if (options.contain !== void 0 && typeof options.contain !== "boolean") {
3558
+ throw new TypeError("attempt(): `contain` must be a boolean");
3559
+ }
3560
+ return options.contain === true;
3561
+ }
3562
+ function attempt(parser2, options) {
3563
+ const contain = containOption(options);
3545
3564
  const guardable = parser2._meta.firstSet.kind !== "any" && !matchesEmpty(parser2);
3546
3565
  let failExpected;
3547
3566
  return {
3548
3567
  _tag: "attempt",
3549
3568
  _meta: parser2._meta,
3550
- _def: { tag: "attempt", parser: parser2 },
3569
+ _def: contain ? { tag: "attempt", parser: parser2, contain: true } : { tag: "attempt", parser: parser2 },
3551
3570
  parse(input, pos, ctx) {
3552
3571
  if (guardable && ctx._probe === void 0 && !ctx._tolerant && !startsFirstSet(parser2, input, pos)) {
3553
3572
  if (failExpected === void 0) {
@@ -3564,7 +3583,7 @@ function attempt(parser2) {
3564
3583
  rollbackCstCapture(ctx, mark);
3565
3584
  if (log !== void 0 && ctx._triviaLog && ctx._triviaLog.length !== log) ctx._triviaLog.length = log;
3566
3585
  if (rootLog !== void 0 && ctx._rootTriviaLog && ctx._rootTriviaLog.length !== rootLog) ctx._rootTriviaLog.length = rootLog;
3567
- if (result.committed) return result;
3586
+ if (result.committed && !contain) return result;
3568
3587
  return { ok: false, expected: result.expected, span: { start: pos, end: pos } };
3569
3588
  }
3570
3589
  };
@@ -4964,7 +4983,7 @@ function node(typeOrCombinator, combinatorOrBuild, buildOrOpts, maybeOpts) {
4964
4983
  throw new Error("node() options cannot combine project with unwrap or collapse");
4965
4984
  }
4966
4985
  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;
4967
- const capturesTrivia = captureTrivia || trailingTrivia || (build ? buildReadsTrivia(def) : project === void 0);
4986
+ const capturesTrivia = captureTrivia || (build ? buildReadsTrivia(def) : project === void 0);
4968
4987
  const clonesState = build ? buildReadsState(def) : project === void 0;
4969
4988
  const hasOwnFields = parserHasOwnFields(combinator);
4970
4989
  const capturesFields = hasOwnFields && (build ? buildReadsFields(def) : project === void 0);
@@ -5078,13 +5097,17 @@ function transform(combinator, fn) {
5078
5097
  };
5079
5098
  }
5080
5099
  function trivia(combinator) {
5081
- const kindLabels = analyzeLabeledTrivia(combinator)?.labels;
5100
+ const labeled = analyzeLabeledTrivia(combinator);
5101
+ const kindLabels = labeled?.labels;
5082
5102
  return {
5083
5103
  _tag: combinator._tag,
5084
5104
  _meta: {
5085
5105
  ...combinator._meta,
5086
5106
  isTrivia: true,
5087
5107
  triviaScanner: fastTriviaScanner(combinator),
5108
+ // Every labeled scan of this trivia reads its spec; the module's four-slot
5109
+ // memo alone thrashes on a grammar with more than four trivia tables.
5110
+ labeledTriviaSpec: labeled,
5088
5111
  ...kindLabels ? { triviaKindLabels: kindLabels } : {}
5089
5112
  },
5090
5113
  _def: { tag: "trivia", parser: combinator },
@@ -5138,6 +5161,12 @@ function field(name, combinator) {
5138
5161
  }
5139
5162
 
5140
5163
  // src/combinators/token.ts
5164
+ function semanticLeafValue(_ctx, _input, _start, _end, value) {
5165
+ return value;
5166
+ }
5167
+ function sourceLeafValue(ctx, input, start, end, value) {
5168
+ return cstOutputHost(ctx.build) ? input.slice(start, end) : value;
5169
+ }
5141
5170
  function token(root) {
5142
5171
  const meta = {
5143
5172
  firstSet: root._meta.firstSet,
@@ -5190,7 +5219,8 @@ function token(root) {
5190
5219
  }
5191
5220
  };
5192
5221
  }
5193
- function leaf(root, fn) {
5222
+ function makeLeaf(root, fn, sourceCstValue) {
5223
+ const cstValue = sourceCstValue ? sourceLeafValue : semanticLeafValue;
5194
5224
  const meta = {
5195
5225
  firstSet: root._meta.firstSet,
5196
5226
  canMatchNewline: root._meta.canMatchNewline,
@@ -5199,7 +5229,12 @@ function leaf(root, fn) {
5199
5229
  return {
5200
5230
  _tag: "leaf",
5201
5231
  _meta: meta,
5202
- _def: { tag: "leaf", parser: root, fn },
5232
+ _def: {
5233
+ tag: "leaf",
5234
+ parser: root,
5235
+ fn,
5236
+ ...sourceCstValue ? { cstValue: "source" } : {}
5237
+ },
5203
5238
  parse(input, pos, ctx) {
5204
5239
  const savedBuf = ctx._cstBuf;
5205
5240
  const savedChildren = ctx._cstChildren;
@@ -5227,11 +5262,21 @@ function leaf(root, fn) {
5227
5262
  }
5228
5263
  if (!result.ok) return result;
5229
5264
  const value = fn(result.value, result.span);
5230
- if (wasCapturing) pushCstLeaf(ctx, { _tag: "leaf", value, span: result.span });
5265
+ if (wasCapturing) pushCstLeaf(ctx, {
5266
+ _tag: "leaf",
5267
+ value: cstValue(ctx, input, pos, result.span.end, value),
5268
+ span: result.span
5269
+ });
5231
5270
  return { ok: true, value, span: result.span };
5232
5271
  }
5233
5272
  };
5234
5273
  }
5274
+ function leaf(root, fn) {
5275
+ return makeLeaf(root, fn, false);
5276
+ }
5277
+ function sourceLeaf(root, fn) {
5278
+ return makeLeaf(root, fn, true);
5279
+ }
5235
5280
 
5236
5281
  // src/analysis/gating.ts
5237
5282
  function childrenOf2(d) {
@@ -5971,10 +6016,12 @@ function mayCommitFailure(p, seen = /* @__PURE__ */ new Set(), resolve) {
5971
6016
  case "choice":
5972
6017
  case "sequence":
5973
6018
  return d.parsers.some((x) => mayCommitFailure(x, seen, resolve));
6019
+ // A contained transaction reports every failure uncommitted.
6020
+ case "attempt":
6021
+ return d.contain !== true && mayCommitFailure(d.parser, seen, resolve);
5974
6022
  case "many":
5975
6023
  case "oneOrMore":
5976
6024
  case "optional":
5977
- case "attempt":
5978
6025
  case "transform":
5979
6026
  case "label":
5980
6027
  case "field":
@@ -6099,6 +6146,7 @@ var OP_COV = 40;
6099
6146
  var OP_SCOPE_PLAIN = 41;
6100
6147
  var OP_LEX_BODY = 42;
6101
6148
  var OP_LEX_PROGRAM = 43;
6149
+ var OP_SOURCE_LEAF = 44;
6102
6150
  var OP_DISPATCH = 25;
6103
6151
  var OP_ROUTED = 26;
6104
6152
  var OP_NAMES = {
@@ -6117,6 +6165,7 @@ var OP_NAMES = {
6117
6165
  [OP_NOT]: "NOT",
6118
6166
  [OP_PEEK]: "PEEK",
6119
6167
  [OP_LEAF]: "LEAF",
6168
+ [OP_SOURCE_LEAF]: "SOURCE_LEAF",
6120
6169
  [OP_EMPTY]: "EMPTY",
6121
6170
  [OP_LIT_TRACK]: "LIT_TRACK",
6122
6171
  [OP_RX_TRACK]: "RX_TRACK",
@@ -8069,7 +8118,7 @@ var Encoder = class {
8069
8118
  }
8070
8119
  case "leaf": {
8071
8120
  const child = this.node(d.parser).ip;
8072
- return this.emit(OP_LEAF, this.fn(d.fn, d.fnSrc ?? null), child);
8121
+ return this.emit(d.cstValue === "source" ? OP_SOURCE_LEAF : OP_LEAF, this.fn(d.fn, d.fnSrc ?? null), child);
8073
8122
  }
8074
8123
  case "node": {
8075
8124
  if (d.type === void 0) missingInferredType();
@@ -8081,7 +8130,7 @@ var Encoder = class {
8081
8130
  const derivedState = d.build !== void 0 ? buildReadsState(d) : noBuildCaptures;
8082
8131
  const derivedFields = d.build !== void 0 ? buildReadsFields(d) : noBuildCaptures;
8083
8132
  const wantsFields = parserHasOwnFields(d.parser) && (cstOut || derivedFields);
8084
- 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);
8133
+ 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);
8085
8134
  const body = this.emit(
8086
8135
  this.track ? OP_NODE_TRACK : OP_NODE,
8087
8136
  d.build === void 0 ? -1 : this.fn(d.build, d.buildSrc ?? null),
@@ -8207,7 +8256,7 @@ var Encoder = class {
8207
8256
  // A TRANSACTION IS A ROW. See `OP_ATTEMPT` for why the transparent
8208
8257
  // lowering was correct only for a choice arm.
8209
8258
  case "attempt": {
8210
- const inner = this.emit(OP_ATTEMPT, this.node(d.parser).ip);
8259
+ const inner = this.emit(OP_ATTEMPT, this.node(d.parser).ip, d.contain === true ? 1 : 0);
8211
8260
  if (!this.failureNeedsRollback(d.parser, void 0)) this.failureRollbackCleanSites.add(inner);
8212
8261
  const fs = d.parser._def.tag === "lazy" ? firstSetOf(d.parser, /* @__PURE__ */ new Set(), this.refResolver(), this.activeTrivia) : d.parser._meta.firstSet;
8213
8262
  if (fs.kind === "any" || matchesEmpty(d.parser)) return inner;
@@ -8294,6 +8343,7 @@ var Encoder = class {
8294
8343
  case OP_WITHCTX:
8295
8344
  case OP_XFORM:
8296
8345
  case OP_LEAF:
8346
+ case OP_SOURCE_LEAF:
8297
8347
  case OP_NODE:
8298
8348
  case OP_NODE_TRACK:
8299
8349
  return [ip + 2];
@@ -9506,6 +9556,7 @@ function childSlots(code, ip, out) {
9506
9556
  case OP_NODE_TRACK:
9507
9557
  case OP_FIELD:
9508
9558
  case OP_LEAF:
9559
+ case OP_SOURCE_LEAF:
9509
9560
  case OP_ARMGATE:
9510
9561
  out.push(code[ip + 2]);
9511
9562
  return true;
@@ -9601,7 +9652,7 @@ function transfer(code, ip, at, hostCst) {
9601
9652
  }
9602
9653
  if (op === OP_NODE || op === OP_NODE_TRACK) {
9603
9654
  const flags = code[ip + 3];
9604
- const directChildren = !hostCst && op === OP_NODE && code[ip + 1] >= 0 && code[ip + 4] < 0 && (flags === 2 || flags === 18 || flags === 34);
9655
+ const directChildren = !hostCst && op === OP_NODE && code[ip + 1] >= 0 && code[ip + 4] < 0 && ((flags & ~128) === 2 || flags === 18 || flags === 34);
9605
9656
  if (directChildren) {
9606
9657
  return { tri: at.tri, buf: false, raw: RAW_UNKNOWN, cap: CAP_OFF };
9607
9658
  }
@@ -9614,7 +9665,7 @@ function transfer(code, ip, at, hostCst) {
9614
9665
  if (at.tri === TRI_NONE && !at.buf) return at;
9615
9666
  return { tri: TRI_NONE, buf: false, raw: RAW_UNKNOWN, cap: at.cap };
9616
9667
  }
9617
- if (op === OP_LEAF) {
9668
+ if (op === OP_LEAF || op === OP_SOURCE_LEAF) {
9618
9669
  if (!at.buf) return at;
9619
9670
  return { tri: at.tri, buf: false, raw: RAW_UNKNOWN, cap: at.cap };
9620
9671
  }
@@ -9701,7 +9752,7 @@ function leadingScalarTerminal(code, ip, minDepth = 2, throughAttempt = true, th
9701
9752
  depth++;
9702
9753
  continue;
9703
9754
  }
9704
- 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) {
9755
+ 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)) {
9705
9756
  at = code[at + 2];
9706
9757
  depth++;
9707
9758
  continue;
@@ -9734,7 +9785,7 @@ function leadingScalarSequence(code, ip) {
9734
9785
  at2 = code[at2 + 1];
9735
9786
  continue;
9736
9787
  }
9737
- if (op === OP_GATE || op === OP_SCOPE_PLAIN || op === OP_XFORM || op === OP_NODE || op === OP_FIELD || op === OP_LEAF) {
9788
+ if (op === OP_GATE || op === OP_SCOPE_PLAIN || op === OP_XFORM || op === OP_NODE || op === OP_FIELD || (op === OP_LEAF || op === OP_SOURCE_LEAF)) {
9738
9789
  at2 = code[at2 + 2];
9739
9790
  continue;
9740
9791
  }
@@ -9767,7 +9818,7 @@ function leadingScalarSequence(code, ip) {
9767
9818
  at = code[at + 2];
9768
9819
  continue;
9769
9820
  }
9770
- if (op === OP_GATE || op === OP_XFORM || op === OP_NODE || op === OP_FIELD || op === OP_LEAF) {
9821
+ if (op === OP_GATE || op === OP_XFORM || op === OP_NODE || op === OP_FIELD || (op === OP_LEAF || op === OP_SOURCE_LEAF)) {
9771
9822
  at = code[at + 2];
9772
9823
  continue;
9773
9824
  }
@@ -9797,7 +9848,7 @@ function leadingLiteralFamily(code, constants, ip, minDepth = 2, limit = 4) {
9797
9848
  if (op === OP_RULE || op === OP_LABEL || op === OP_TOKEN || op === OP_ATTEMPT || op === OP_PEEK) {
9798
9849
  return walk(code[at + 1], depth + 1);
9799
9850
  }
9800
- 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) {
9851
+ 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)) {
9801
9852
  return walk(code[at + 2], depth + 1);
9802
9853
  }
9803
9854
  if (op === OP_SEQ || op === OP_SEQV) {
@@ -10683,8 +10734,10 @@ ${rootCap ? "ctx._rootTriviaCapture=sR\n" : ""}return v
10683
10734
  }
10684
10735
  /* ── boundaries ──────────────────────────────────────────────────────── */
10685
10736
  case OP_TOKEN:
10686
- case OP_LEAF: {
10737
+ case OP_LEAF:
10738
+ case OP_SOURCE_LEAF: {
10687
10739
  const isToken = op === OP_TOKEN;
10740
+ const capturesSource = isToken || op === OP_SOURCE_LEAF && hostCst;
10688
10741
  const fn = isToken ? void 0 : fnRef(code[ip + 1]);
10689
10742
  const child = link(isToken ? code[ip + 1] : code[ip + 2]);
10690
10743
  const wasCap = L.buf ? "true" : "(ctx._cstBuf!==undefined||ctx._cstLeaves!==undefined)";
@@ -10717,7 +10770,7 @@ ctx._triviaLog=sOtl
10717
10770
  if(v===FAIL)return FAIL
10718
10771
  const e=EC.e
10719
10772
  const out=${isToken ? "input.slice(pos,e)" : `${fn}(v,{start:pos,end:e})`}
10720
- if(wasCap)pushCstLeaf(ctx,{_tag:'leaf',value:out,span:{start:pos,end:e}})
10773
+ if(wasCap)pushCstLeaf(ctx,{_tag:'leaf',value:${capturesSource ? "input.slice(pos,e)" : "out"},span:{start:pos,end:e}})
10721
10774
  EC.e=e
10722
10775
  return out
10723
10776
  }`;
@@ -10803,7 +10856,7 @@ ${clean ? "" : emitMark(p, L.buf, L.raw, sinks)}
10803
10856
  const v=${child}(input,pos,ctx)
10804
10857
  if(v!==FAIL)return v
10805
10858
  ${clean ? "" : emitRollback(p, L.buf, L.raw, sinks)}
10806
- if(ctx._fc===true)return FAIL
10859
+ ${code[ip + 2] === 1 ? "ctx._fc=false" : "if(ctx._fc===true)return FAIL"}
10807
10860
  ctx._fe=pos
10808
10861
  return FAIL
10809
10862
  }`;
@@ -11392,7 +11445,8 @@ return nd
11392
11445
  const unwrap = (flags & 64) !== 0;
11393
11446
  const trailingTrivia = (flags & 128) !== 0;
11394
11447
  const build = buildIdx >= 0 ? fnRef(buildIdx) : void 0;
11395
- if (!hostCst && !tracked && build !== void 0 && proj < 0 && (flags === 2 || flags === 18 || flags === 34)) {
11448
+ const leanFlags = flags & ~128;
11449
+ if (!hostCst && !tracked && build !== void 0 && proj < 0 && (leanFlags === 2 || (flags === 18 || flags === 34))) {
11396
11450
  const fields = flags === 18;
11397
11451
  const collapseChildren = flags === 34;
11398
11452
  const publish = L.buf && L.raw === RAW_OMIT ? "_pushNodeNoRawBuf(ctx,nd)" : L.buf && L.raw === RAW_CAPTURE ? `if(sBuf!==undefined){
@@ -11437,7 +11491,8 @@ ctx._cstTriviaLog=undefined
11437
11491
  ctx.captureTrivia=false
11438
11492
  ctx._fields=${fields ? "[]" : "undefined"}
11439
11493
  const v=${child}(input,pos,ctx)
11440
- const captured=_capturedFlatChildren(flat)
11494
+ ${trailingTrivia && L.tri !== TRI_NONE ? `if(v!==FAIL${L.tri === TRI_UNKNOWN ? "&&ctx.trivia!==undefined" : ""})EC.e=consumeTrivia(input,EC.e,ctx)
11495
+ ` : ""}const captured=_capturedFlatChildren(flat)
11441
11496
  ${fields ? "const fieldMap=buildFieldMap(ctx._fields)\n" : ""}ctx._fields=sFields
11442
11497
  ctx._cstBuf=sBuf
11443
11498
  ctx._cstChildren=sCh
@@ -12070,7 +12125,7 @@ function assemble(t, prog, cfg) {
12070
12125
  const lf = { _tag: "leaf", value, span: { start: s, end: e } };
12071
12126
  pushCstLeaf(ctx, lf);
12072
12127
  }
12073
- function plainBuildNode(child, build) {
12128
+ function plainBuildNode(child, build, trailing) {
12074
12129
  return (input, pos, ctx) => {
12075
12130
  const sCh = ctx._cstChildren;
12076
12131
  const sLv = ctx._cstLeaves;
@@ -12088,6 +12143,7 @@ function assemble(t, prog, cfg) {
12088
12143
  ctx.captureTrivia = false;
12089
12144
  ctx._fields = void 0;
12090
12145
  const value = child(input, pos, ctx);
12146
+ if (trailing && value !== FAIL && ctx.trivia !== void 0) EC.e = consumeTrivia(input, EC.e, ctx);
12091
12147
  const kids = buf.ch ?? (buf.single !== void 0 ? [buf.single] : EMPTY_CH);
12092
12148
  const rawKids = buf.raw ?? (buf.rawSingle !== void 0 ? [buf.rawSingle] : EMPTY_CH);
12093
12149
  ctx._fields = savedFields;
@@ -12115,7 +12171,7 @@ function assemble(t, prog, cfg) {
12115
12171
  while (first < children2.length && children2[first] === void 0) first++;
12116
12172
  return first === children2.length ? EMPTY_CH : children2.slice(first);
12117
12173
  }
12118
- function childrenOnlyBuildNode(child, build) {
12174
+ function childrenOnlyBuildNode(child, build, trailing) {
12119
12175
  return (input, pos, ctx) => {
12120
12176
  const sCh = ctx._cstChildren;
12121
12177
  const sLv = ctx._cstLeaves;
@@ -12133,6 +12189,7 @@ function assemble(t, prog, cfg) {
12133
12189
  ctx.captureTrivia = false;
12134
12190
  ctx._fields = void 0;
12135
12191
  const value = child(input, pos, ctx);
12192
+ if (trailing && value !== FAIL && ctx.trivia !== void 0) EC.e = consumeTrivia(input, EC.e, ctx);
12136
12193
  const captured = capturedFlatChildren(kids);
12137
12194
  ctx._fields = savedFields;
12138
12195
  ctx._cstBuf = sBuf;
@@ -13157,6 +13214,7 @@ function assemble(t, prog, cfg) {
13157
13214
  /* ── transaction ─────────────────────────────────────────────────────── */
13158
13215
  case OP_ATTEMPT: {
13159
13216
  const child = link(code[ip + 1]);
13217
+ const contain = code[ip + 2] === 1;
13160
13218
  return (input, pos, ctx) => {
13161
13219
  const need = markCst(ctx);
13162
13220
  const mRaw = MRAW;
@@ -13169,7 +13227,10 @@ function assemble(t, prog, cfg) {
13169
13227
  const v = child(input, pos, ctx);
13170
13228
  if (v !== FAIL) return v;
13171
13229
  if (need) rollbackTriviaAt(ctx, mRaw, mTl, mLv, mFl, mEr, mLog, mRoot);
13172
- if (committed3(ctx)) return FAIL;
13230
+ if (committed3(ctx)) {
13231
+ if (!contain) return FAIL;
13232
+ ctx._fc = false;
13233
+ }
13173
13234
  ctx._fe = pos;
13174
13235
  return FAIL;
13175
13236
  };
@@ -13387,7 +13448,8 @@ function assemble(t, prog, cfg) {
13387
13448
  return value;
13388
13449
  };
13389
13450
  }
13390
- case OP_LEAF: {
13451
+ case OP_LEAF:
13452
+ case OP_SOURCE_LEAF: {
13391
13453
  const fn = fns[code[ip + 1]];
13392
13454
  const child = link(code[ip + 2]);
13393
13455
  return (input, pos, ctx) => {
@@ -13415,7 +13477,11 @@ function assemble(t, prog, cfg) {
13415
13477
  if (v === FAIL) return FAIL;
13416
13478
  const end = EC.e;
13417
13479
  const out = fn(v, { start: pos, end });
13418
- if (wasCapturing) pushCstLeaf(ctx, { _tag: "leaf", value: out, span: { start: pos, end } });
13480
+ if (wasCapturing) pushCstLeaf(ctx, {
13481
+ _tag: "leaf",
13482
+ value: op === OP_SOURCE_LEAF && hostCst ? input.slice(pos, end) : out,
13483
+ span: { start: pos, end }
13484
+ });
13419
13485
  EC.e = end;
13420
13486
  return out;
13421
13487
  };
@@ -14615,11 +14681,11 @@ function assemble(t, prog, cfg) {
14615
14681
  const trailingTrivia = (flags & 128) !== 0;
14616
14682
  const build = buildIdx >= 0 ? fns[buildIdx] : void 0;
14617
14683
  if (!hostCst && !tracked) {
14618
- if (build !== void 0 && proj < 0 && flags === 0) {
14619
- return plainBuildNode(child, build);
14684
+ if (build !== void 0 && proj < 0 && (flags & ~128) === 0) {
14685
+ return plainBuildNode(child, build, trailingTrivia);
14620
14686
  }
14621
- if (build !== void 0 && proj < 0 && flags === 2) {
14622
- return childrenOnlyBuildNode(child, build);
14687
+ if (build !== void 0 && proj < 0 && (flags & ~128) === 2) {
14688
+ return childrenOnlyBuildNode(child, build, trailingTrivia);
14623
14689
  }
14624
14690
  if (build !== void 0 && proj < 0 && flags === 18) {
14625
14691
  return childrenOnlyFieldsBuildNode(child, build);
@@ -15456,7 +15522,7 @@ function payloadKey(p, d) {
15456
15522
  case "transform":
15457
15523
  return `transform\0${fnKey(d.fnSrc, d.fn)}\0${d.recognitionOnly === true}`;
15458
15524
  case "leaf":
15459
- return `leaf\0${fnKey(d.fnSrc, d.fn)}`;
15525
+ return `leaf\0${d.cstValue ?? "value"}\0${fnKey(d.fnSrc, d.fn)}`;
15460
15526
  case "many":
15461
15527
  case "oneOrMore":
15462
15528
  return `${d.tag}\0${d.min}\0${d.max ?? ""}`;
@@ -16945,7 +17011,7 @@ function evalRuleMapIR(ir) {
16945
17011
  if (recognitionOnly) t._def.recognitionOnly = true;
16946
17012
  return t;
16947
17013
  };
16948
- const _lf = (child, src) => {
17014
+ const _lf = (child, src, source = false) => {
16949
17015
  let fn2;
16950
17016
  try {
16951
17017
  fn2 = (0, eval)(`(${src})`);
@@ -16954,7 +17020,7 @@ function evalRuleMapIR(ir) {
16954
17020
  throw new Error("IR leaf fn not materialized");
16955
17021
  };
16956
17022
  }
16957
- const l = leaf(child, fn2);
17023
+ const l = source ? sourceLeaf(child, fn2) : leaf(child, fn2);
16958
17024
  l._def.fnSrc = src;
16959
17025
  return l;
16960
17026
  };
@@ -17338,7 +17404,7 @@ ${outerDecls.map((d) => " " + d).join("\n")}
17338
17404
  case "optional":
17339
17405
  return `optional(${kid(def.parser)})`;
17340
17406
  case "attempt":
17341
- return `attempt(${kid(def.parser)})`;
17407
+ return `attempt(${kid(def.parser)}${def.contain === true ? ", { contain: true }" : ""})`;
17342
17408
  // `keepSeparators` is an opt-in expressed at the SEPARATOR, not in the options
17343
17409
  // bag, so it must round-trip as `keepSeparator(sep)` — serializing it as an
17344
17410
  // option would reconstruct a grammar whose call site no longer states its own
@@ -17357,7 +17423,7 @@ ${outerDecls.map((d) => " " + d).join("\n")}
17357
17423
  return `token(${kid(def.parser)})`;
17358
17424
  case "leaf": {
17359
17425
  if (def.fnSrc === void 0) throw new Unserializable("leaf without fnSrc");
17360
- return `_lf(${kid(def.parser)}, ${JSON.stringify(def.fnSrc)})`;
17426
+ return `_lf(${kid(def.parser)}, ${JSON.stringify(def.fnSrc)}${def.cstValue === "source" ? ", true" : ""})`;
17361
17427
  }
17362
17428
  case "label":
17363
17429
  return `label(${JSON.stringify(def.label)}, ${kid(def.parser)})`;
@@ -17546,7 +17612,7 @@ function compileRuleMap(ruleMap, opts = {}) {
17546
17612
  }
17547
17613
 
17548
17614
  // src/version.ts
17549
- var PARSEMAN_VERSION = "0.51.1";
17615
+ var PARSEMAN_VERSION = "0.52.0";
17550
17616
 
17551
17617
  // src/compiler/compile-linkable-table.ts
17552
17618
  function isLocal(rule) {
@@ -20239,7 +20305,7 @@ function coverageEntry(entry, collector, maps, trace) {
20239
20305
  case "optional":
20240
20306
  return optional(build(def.parser));
20241
20307
  case "attempt": {
20242
- const base2 = attempt(build(def.parser));
20308
+ const base2 = attempt(build(def.parser), def.contain === true ? { contain: true } : void 0);
20243
20309
  const id = maps.attempts.get(parser2);
20244
20310
  return id === void 0 ? base2 : {
20245
20311
  ...base2,
@@ -20259,7 +20325,7 @@ function coverageEntry(entry, collector, maps, trace) {
20259
20325
  case "token":
20260
20326
  return token(build(def.parser));
20261
20327
  case "leaf":
20262
- return leaf(build(def.parser), def.fn);
20328
+ return def.cstValue === "source" ? sourceLeaf(build(def.parser), def.fn) : leaf(build(def.parser), def.fn);
20263
20329
  case "field":
20264
20330
  return field(def.name, build(def.parser));
20265
20331
  case "grammar":
@@ -20528,6 +20594,7 @@ export {
20528
20594
  sequence,
20529
20595
  shiftAbsolute,
20530
20596
  siteToString,
20597
+ sourceLeaf,
20531
20598
  startsWith,
20532
20599
  token,
20533
20600
  transform,