parseman 0.60.5 → 0.61.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 (59) hide show
  1. package/dist/analysis/diagnostics.js +77 -40
  2. package/dist/analysis/diagnostics.js.map +3 -3
  3. package/dist/cli/index.js +77 -40
  4. package/dist/cli/index.js.map +3 -3
  5. package/dist/combinators/choice.d.ts.map +1 -1
  6. package/dist/combinators/expect.d.ts.map +1 -1
  7. package/dist/combinators/link-scope.d.ts +7 -0
  8. package/dist/combinators/link-scope.d.ts.map +1 -0
  9. package/dist/combinators/node.d.ts.map +1 -1
  10. package/dist/combinators/parser.d.ts.map +1 -1
  11. package/dist/combinators/trivia-boundary.d.ts +5 -3
  12. package/dist/combinators/trivia-boundary.d.ts.map +1 -1
  13. package/dist/compiler/token-capability.js +7 -0
  14. package/dist/compiler/token-capability.js.map +1 -1
  15. package/dist/compiler/value-usage.d.ts.map +1 -1
  16. package/dist/functional/run.d.ts.map +1 -1
  17. package/dist/index.d.ts +1 -1
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +121 -70
  20. package/dist/index.js.map +3 -3
  21. package/dist/language-service/index.js +1 -1
  22. package/dist/language-service/index.js.map +1 -1
  23. package/dist/plugin/index.js +284 -233
  24. package/dist/plugin/index.js.map +3 -3
  25. package/dist/run/index.js +1 -1
  26. package/dist/run/index.js.map +1 -1
  27. package/dist/spec/index.js.map +1 -1
  28. package/dist/table/assemble.d.ts.map +1 -1
  29. package/dist/table/emit-assembly.d.ts.map +1 -1
  30. package/dist/table/emit.d.ts.map +1 -1
  31. package/dist/table/encode.d.ts.map +1 -1
  32. package/dist/table/exec.d.ts.map +1 -1
  33. package/dist/table/index.js +41 -10
  34. package/dist/table/index.js.map +3 -3
  35. package/dist/table/ops.d.ts +6 -0
  36. package/dist/table/ops.d.ts.map +1 -1
  37. package/dist/table/program.d.ts +3 -1
  38. package/dist/table/program.d.ts.map +1 -1
  39. package/dist/version.d.ts +1 -1
  40. package/package.json +1 -1
  41. package/src/combinators/choice.ts +3 -1
  42. package/src/combinators/expect.ts +1 -0
  43. package/src/combinators/grammar.ts +1 -1
  44. package/src/combinators/link-scope.ts +19 -0
  45. package/src/combinators/node.ts +11 -2
  46. package/src/combinators/parser.ts +37 -31
  47. package/src/combinators/trivia-boundary.ts +11 -3
  48. package/src/compiler/value-usage.ts +16 -29
  49. package/src/functional/run.ts +3 -1
  50. package/src/index.ts +1 -1
  51. package/src/table/assemble.ts +11 -1
  52. package/src/table/emit-assembly.ts +10 -1
  53. package/src/table/emit.ts +5 -1
  54. package/src/table/encode.ts +16 -9
  55. package/src/table/exec.ts +11 -9
  56. package/src/table/ops.ts +6 -0
  57. package/src/table/program.ts +8 -2
  58. package/src/table/site-labels.ts +3 -3
  59. package/src/version.ts +1 -1
package/dist/index.d.ts CHANGED
@@ -49,7 +49,7 @@ export type { AnalysableGrammar } from './analysis/grammar.ts';
49
49
  export { analyzeDuplication, analyzeDuplicationRules, formatDuplicationFindings, duplicationFindingCount, siteToString, alternationGroups, keywordRegexShape, extractCharClasses, charClassMembers, keywordAlternationHazards, } from './analysis/duplication.ts';
50
50
  export type { DuplicationReport, AnalyzeDuplicationOptions, DuplicationWarnLevel, Site, DuplicateFinding, NearDuplicateFinding, RegexFragmentFinding, RegexClassFinding, RegexClassVariant, ArmOverlapFinding, RewriteFinding, RewriteKind, SepByVerdict, KeywordRegexFinding, DivergentNodeFinding, StructureLossFinding, } from './analysis/duplication.ts';
51
51
  export { compose, composeLeaf, cstBuildHost } from './compiler/linker.ts';
52
- export type { CstBuildHostOptions, FusedRule } from './compiler/linker.ts';
52
+ export type { ComposedRules, CstBuildHostOptions, FusedRule } from './compiler/linker.ts';
53
53
  export { buildLineIndex, createLineIndex, recordLineRange, normalizeLineIndex, offsetToLineCol, annotateSpan, annotateTreeSpans } from './line-index.ts';
54
54
  export type { LineIndex } from './line-index.ts';
55
55
  export { gate } from './combinators/gate.ts';
@@ -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":"AAAA,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,mBAAmB,EAAE,SAAS,EAAE,oBAAoB,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAE7S,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,YAAY,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAS9D,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AACpE,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAE7E,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAChD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,2BAA2B,CAAA;AACtH,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,YAAY,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAC7M,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,YAAY,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACvG,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAC5G,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAA;AAC/C,YAAY,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAA;AAC1C,OAAO,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAA;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAA;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAA;AAC5C,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAEvG,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AACxF,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAClE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAC3F,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAEhE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAuB5C,YAAY,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAClD;;;;;GAKG;AACH,OAAO,EAAE,oBAAoB,EAAE,KAAK,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,sCAAsC,CAAA;AAC1H,YAAY,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AAepE,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AACjG,YAAY,EACV,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,EAAE,iBAAiB,EACpE,kBAAkB,EAAE,eAAe,GACpC,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAChH,YAAY,EACV,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EACtE,aAAa,EAAE,iBAAiB,EAAE,oBAAoB,GACvD,MAAM,sBAAsB,CAAA;AAI7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAK5D,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AAC9G,YAAY,EACV,UAAU,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,WAAW,EACpE,gBAAgB,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,wBAAwB,EACpF,aAAa,EAAE,cAAc,EAAE,gBAAgB,GAChD,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAA;AAC7G,YAAY,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAA;AACrE,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAA;AACzF,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAA;AACnH,YAAY,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAE9D,OAAO,EACL,kBAAkB,EAAE,uBAAuB,EAAE,yBAAyB,EACtE,uBAAuB,EAAE,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAC3E,kBAAkB,EAAE,gBAAgB,EAAE,yBAAyB,GAChE,MAAM,2BAA2B,CAAA;AAClC,YAAY,EACV,iBAAiB,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,IAAI,EACxE,gBAAgB,EAAE,oBAAoB,EAAE,oBAAoB,EAC5D,iBAAiB,EAAE,iBAAiB,EACpC,iBAAiB,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,mBAAmB,EAAE,oBAAoB,EACvG,oBAAoB,GACrB,MAAM,2BAA2B,CAAA;AAgBlC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACzE,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAEzF,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,eAAe,EAAE,kBAAkB,EAAE,eAAe,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACxJ,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAEhD,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAC5D,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AACrE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAC7E,YAAY,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAE5D,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAE5G,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAQtF,OAAO,EAAE,GAAG,EAAE,MAAM,4BAA4B,CAAA;AAChD,YAAY,EAAE,iBAAiB,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC7F,OAAO,EAAE,4BAA4B,EAAE,kCAAkC,EAAE,8BAA8B,EAAE,mCAAmC,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,kCAAkC,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AACrR,YAAY,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,6BAA6B,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AAC9N,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AACzF,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAC7C,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC1E,YAAY,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAC1G,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAC7E,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAChG,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAEtD,OAAO,EACL,UAAU,EACV,UAAU,EACV,cAAc,EACd,aAAa,EACb,SAAS,EACT,aAAa,EACb,aAAa,EACb,eAAe,GAChB,MAAM,yBAAyB,CAAA;AAChC,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAA"}
package/dist/index.js CHANGED
@@ -40,6 +40,12 @@ function hasOwnTriviaBoundary(p, depth = MAX_DEPTH) {
40
40
  case "oneOrMore":
41
41
  case "sepBy":
42
42
  return true;
43
+ // A scope that names or clears trivia keeps an outer install out of its body.
44
+ // Any other inherits, so it falls through at no cost in depth: line tracking
45
+ // wraps every rule in one, and must not change what this walk sees.
46
+ case "grammar":
47
+ if (d.triviaParser || d.clearTrivia) return false;
48
+ depth++;
43
49
  // Transparent wrappers — they add no position, so ask what they wrap.
44
50
  case "node":
45
51
  case "transform":
@@ -3197,6 +3203,7 @@ function derive(c, seen) {
3197
3203
  case "optional":
3198
3204
  case "many":
3199
3205
  case "oneOrMore":
3206
+ case "sepBy":
3200
3207
  case "transform":
3201
3208
  case "not":
3202
3209
  case "peek":
@@ -3347,7 +3354,7 @@ function choice(...args) {
3347
3354
  const result = parsers[idx].parse(input, pos, ctx);
3348
3355
  if (result.ok) return result;
3349
3356
  expected.push(...result.expected);
3350
- if (result.committed) return { ok: false, expected, span: { start: pos, end: pos }, committed: true };
3357
+ if (result.committed) return { ok: false, expected, span: result.span, committed: true };
3351
3358
  return { ok: false, expected, span: { start: pos, end: pos } };
3352
3359
  }
3353
3360
  if (ctx._probe !== void 0 || ctx._tolerant) for (const p of parsers) p.parse(input, pos, ctx);
@@ -4342,15 +4349,20 @@ function markUnusedValues(root) {
4342
4349
  case "many":
4343
4350
  case "oneOrMore":
4344
4351
  mark(def, consumed);
4345
- visit(def.parser, consumed);
4346
- return;
4347
4352
  case "optional":
4353
+ // `optional` returns `inner | null` — no aggregate array/tuple to elide, so
4354
+ // it carries no valueUnused flag. Still descend so an inner many/sequence
4355
+ // under a node() is analyzed (it benefits even when its optional wrapper
4356
+ // doesn't).
4357
+ case "label":
4358
+ case "trivia":
4359
+ case "attempt":
4360
+ case "withCtx":
4361
+ case "expect":
4348
4362
  visit(def.parser, consumed);
4349
4363
  return;
4350
4364
  case "sequence":
4351
4365
  mark(def, consumed);
4352
- for (const p of def.parsers) visit(p, consumed);
4353
- return;
4354
4366
  case "choice":
4355
4367
  for (const p of def.parsers) visit(p, consumed);
4356
4368
  return;
@@ -4361,22 +4373,24 @@ function markUnusedValues(root) {
4361
4373
  if (def.otherwise) visit(def.otherwise, consumed);
4362
4374
  return;
4363
4375
  case "node":
4376
+ // builds from captured children, NOT the inner parser value.
4377
+ case "not":
4378
+ case "peek":
4379
+ // lookahead — value never observed
4380
+ case "token":
4364
4381
  visit(def.parser, false);
4365
4382
  return;
4366
4383
  case "transform":
4367
- visit(def.parser, true);
4368
- return;
4384
+ // the map fn reads the value → always consumed.
4369
4385
  case "field":
4386
+ // the field capture records the parsed value → always consumed.
4387
+ case "leaf":
4370
4388
  visit(def.parser, true);
4371
4389
  return;
4372
4390
  case "sepBy":
4373
4391
  visit(def.parser, true);
4374
4392
  visit(def.separator, false);
4375
4393
  return;
4376
- case "not":
4377
- case "peek":
4378
- visit(def.parser, false);
4379
- return;
4380
4394
  case "grammar":
4381
4395
  visit(def.parser, consumed);
4382
4396
  if (def.triviaParser) visit(def.triviaParser, false);
@@ -4385,19 +4399,6 @@ function markUnusedValues(root) {
4385
4399
  visit(def.parser, consumed);
4386
4400
  visit(def.sentinel, false);
4387
4401
  return;
4388
- case "token":
4389
- visit(def.parser, false);
4390
- return;
4391
- case "label":
4392
- case "trivia":
4393
- case "attempt":
4394
- case "withCtx":
4395
- case "expect":
4396
- visit(def.parser, consumed);
4397
- return;
4398
- case "leaf":
4399
- visit(def.parser, true);
4400
- return;
4401
4402
  case "lazy":
4402
4403
  return;
4403
4404
  default:
@@ -4427,6 +4428,21 @@ function markUnusedValues(root) {
4427
4428
  visit(resolveRoot2(root), true);
4428
4429
  }
4429
4430
 
4431
+ // src/combinators/link-scope.ts
4432
+ var scope;
4433
+ function afterLink(settle) {
4434
+ scope?.push(settle);
4435
+ }
4436
+ function collectAfterLink(pending, build) {
4437
+ const outer = scope;
4438
+ scope = outer ?? pending;
4439
+ try {
4440
+ return build();
4441
+ } finally {
4442
+ scope = outer;
4443
+ }
4444
+ }
4445
+
4430
4446
  // src/cst/root-trivia-scope.ts
4431
4447
  var ROOT_TRIVIA_SCOPE_REFUSAL = "parser(): selected root trivia requires classifiedTrivia() for every local trivia scope, or rootCapture: 'opaque'.";
4432
4448
  function refuseUnclassifiedRootScope(strict) {
@@ -4537,7 +4553,7 @@ function parser(opts, root) {
4537
4553
  ctx.triviaKindLabels = void 0;
4538
4554
  } else if (scopeTrivia !== void 0) {
4539
4555
  ctx.trivia = scopeTrivia;
4540
- if (scopeLabels) ctx.triviaKindLabels = scopeLabels;
4556
+ ctx.triviaKindLabels = scopeLabels;
4541
4557
  }
4542
4558
  if (forceCaptureTrivia || _ctx?.captureTrivia) ctx.captureTrivia = true;
4543
4559
  if (ownCaptureMask !== void 0) ctx._triviaCaptureMask = ownCaptureMask;
@@ -4773,6 +4789,7 @@ function linkRules(recipes, link) {
4773
4789
  }
4774
4790
  });
4775
4791
  const winners = /* @__PURE__ */ new Map();
4792
+ const afterLink2 = [];
4776
4793
  const priorHoles = /* @__PURE__ */ new Map();
4777
4794
  const prior = new Proxy({}, {
4778
4795
  get(_target, key) {
@@ -4785,38 +4802,42 @@ function linkRules(recipes, link) {
4785
4802
  return hole;
4786
4803
  }
4787
4804
  });
4788
- for (const recipe of recipes) {
4789
- const definitions = recipe.factory(proxy, prior);
4790
- for (const key of Object.keys(definitions)) {
4791
- winners.set(key, { parser: definitions[key], options: recipe.options });
4792
- }
4793
- }
4794
- const keys = [...winners.keys()];
4795
4805
  const copies = /* @__PURE__ */ new Map();
4796
- for (const [key, { parser: defined }] of winners) {
4797
- const placeholder = cache[key];
4798
- const parser2 = ownRule(defined, copies);
4799
- if (placeholder === parser2) {
4800
- throw new Error(`rules(): rule "${key}" cannot be a direct alias to itself`);
4801
- }
4802
- if (isDefinableRef(placeholder)) {
4803
- if (!isNamedRuleRefForAnotherRule(parser2, key)) tagRule(parser2, key);
4804
- placeholder.define(parser2);
4805
- placeholder._meta.firstSet = parser2._meta.firstSet;
4806
- placeholder._meta.canMatchNewline = parser2._meta.canMatchNewline;
4807
- } else if (isNamedRuleRefForAnotherRule(parser2, key) || link !== void 0) {
4808
- if (!isNamedRuleRefForAnotherRule(parser2, key)) tagRule(parser2, key);
4809
- const alias = ref();
4810
- tagRule(alias, key);
4811
- alias.define(parser2);
4812
- alias._meta.firstSet = parser2._meta.firstSet;
4813
- alias._meta.canMatchNewline = parser2._meta.canMatchNewline;
4814
- cache[key] = alias;
4815
- } else {
4816
- tagRule(parser2, key);
4817
- cache[key] = parser2;
4806
+ try {
4807
+ for (const recipe of recipes) {
4808
+ const definitions = collectAfterLink(afterLink2, () => recipe.factory(proxy, prior));
4809
+ for (const key of Object.keys(definitions)) {
4810
+ winners.set(key, { parser: definitions[key], options: recipe.options });
4811
+ }
4812
+ }
4813
+ for (const [key, { parser: defined }] of winners) {
4814
+ const placeholder = cache[key];
4815
+ const parser2 = ownRule(defined, copies);
4816
+ if (placeholder === parser2) {
4817
+ throw new Error(`rules(): rule "${key}" cannot be a direct alias to itself`);
4818
+ }
4819
+ if (isDefinableRef(placeholder)) {
4820
+ if (!isNamedRuleRefForAnotherRule(parser2, key)) tagRule(parser2, key);
4821
+ placeholder.define(parser2);
4822
+ placeholder._meta.firstSet = parser2._meta.firstSet;
4823
+ placeholder._meta.canMatchNewline = parser2._meta.canMatchNewline;
4824
+ } else if (isNamedRuleRefForAnotherRule(parser2, key) || link !== void 0) {
4825
+ if (!isNamedRuleRefForAnotherRule(parser2, key)) tagRule(parser2, key);
4826
+ const alias = ref();
4827
+ tagRule(alias, key);
4828
+ alias.define(parser2);
4829
+ alias._meta.firstSet = parser2._meta.firstSet;
4830
+ alias._meta.canMatchNewline = parser2._meta.canMatchNewline;
4831
+ cache[key] = alias;
4832
+ } else {
4833
+ tagRule(parser2, key);
4834
+ cache[key] = parser2;
4835
+ }
4818
4836
  }
4837
+ } finally {
4838
+ for (const settle of afterLink2) settle();
4819
4839
  }
4840
+ const keys = [...winners.keys()];
4820
4841
  for (const key of keys) {
4821
4842
  const options = winners.get(key).options;
4822
4843
  let rule = cache[key];
@@ -5301,8 +5322,14 @@ function node(typeOrCombinator, combinatorOrBuild, buildOrOpts, maybeOpts) {
5301
5322
  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;
5302
5323
  const capturesTrivia = captureTrivia || (build ? buildReadsTrivia(def) : project === void 0);
5303
5324
  const readsState = build ? buildReadsState(def) : project === void 0;
5304
- const hasOwnFields = parserHasOwnFields(combinator);
5305
- const capturesFields = hasOwnFields && (build ? buildReadsFields(def) : project === void 0);
5325
+ let hasOwnFields = parserHasOwnFields(combinator);
5326
+ let capturesFields = hasOwnFields && (build ? buildReadsFields(def) : project === void 0);
5327
+ if (!hasOwnFields) {
5328
+ afterLink(() => {
5329
+ hasOwnFields = parserHasOwnFields(combinator);
5330
+ capturesFields = hasOwnFields && (build ? buildReadsFields(def) : project === void 0);
5331
+ });
5332
+ }
5306
5333
  const guardable = combinator._meta.firstSet.kind !== "any" && !matchesEmpty(combinator);
5307
5334
  let failExpected;
5308
5335
  return {
@@ -5615,6 +5642,9 @@ function sourceLeaf(root, fn) {
5615
5642
  return makeLeaf(root, fn, true);
5616
5643
  }
5617
5644
 
5645
+ // src/version.ts
5646
+ var PARSEMAN_VERSION = "0.61.0";
5647
+
5618
5648
  // src/table/lex-body.ts
5619
5649
  function buildLexBodyRecognizer(spec, constants) {
5620
5650
  const raw = constants[spec[0]];
@@ -6230,11 +6260,12 @@ function assemblyExtraIps(prog) {
6230
6260
  }
6231
6261
  function expandCompact(p) {
6232
6262
  if ("code" in p) return p;
6263
+ if (p.es === void 0) throw new Error(`parseman: this parser was printed by an earlier parseman; reprint it with parseman ${PARSEMAN_VERSION}`);
6233
6264
  return ownTableProgram({
6234
6265
  code: p.c,
6235
6266
  k: p.k,
6236
6267
  cc: p.x,
6237
- fx: p.e,
6268
+ fx: p.e.map((set) => set.map((i) => p.es[i])),
6238
6269
  disp: p.d,
6239
6270
  rules: p.r,
6240
6271
  fns: p.f,
@@ -7518,6 +7549,7 @@ var OP_LIT_CI = 27;
7518
7549
  var OP_LIT_CI_TRACK = 28;
7519
7550
  var OP_TOKEN = 29;
7520
7551
  var OP_SCOPE_CAP = 30;
7552
+ var SCOPE_INHERIT = -2;
7521
7553
  var OP_WITHCTX = 31;
7522
7554
  var OP_GUARD = 32;
7523
7555
  var OP_ADJ = 33;
@@ -7642,7 +7674,7 @@ function selectOptionalSuffixLexBody(ir) {
7642
7674
  function reinstallsRuleTrivia(reference, target) {
7643
7675
  return (reference._meta.grammarTrivia ?? target._meta.grammarTrivia) !== void 0 && hasOwnTriviaBoundary(target);
7644
7676
  }
7645
- function directTokenBodyParser(parser2, resolve, scope) {
7677
+ function directTokenBodyParser(parser2, resolve, scope2) {
7646
7678
  const outer = parser2._def;
7647
7679
  if (outer.tag !== "token") return void 0;
7648
7680
  let body = outer.parser;
@@ -7652,7 +7684,7 @@ function directTokenBodyParser(parser2, resolve, scope) {
7652
7684
  const wrapper = body._def;
7653
7685
  if (wrapper.tag === "grammar") {
7654
7686
  if (wrapper.clearTrivia !== true || wrapper.triviaParser !== void 0 || wrapper.captureTrivia === true || wrapper.rootCapture === "opaque" || wrapper.constructionTrackLines !== "inherit" || wrapper.constructionCaptureTriviaKinds !== void 0) return void 0;
7655
- if (scope !== void 0) scope.cleared = true;
7687
+ if (scope2 !== void 0) scope2.cleared = true;
7656
7688
  body = wrapper.parser;
7657
7689
  continue;
7658
7690
  }
@@ -7909,10 +7941,10 @@ function directFixedLexNode(parser2, resolve, active, pureOnly = false, cleared
7909
7941
  }
7910
7942
  }
7911
7943
  function directFixedTokenBody(parser2, resolve) {
7912
- const scope = { cleared: false };
7913
- const body = directTokenBodyParser(parser2, resolve, scope);
7944
+ const scope2 = { cleared: false };
7945
+ const body = directTokenBodyParser(parser2, resolve, scope2);
7914
7946
  if (body === void 0) return void 0;
7915
- const root = directFixedLexNode(body, resolve, /* @__PURE__ */ new Set(), false, scope.cleared);
7947
+ const root = directFixedLexNode(body, resolve, /* @__PURE__ */ new Set(), false, scope2.cleared);
7916
7948
  return root === void 0 ? void 0 : { kind: "fixed-tree", root };
7917
7949
  }
7918
7950
  function directBalancedTokenBody(parser2, resolve) {
@@ -9550,7 +9582,7 @@ var Encoder = class {
9550
9582
  this.triviaKnown = savedKnown;
9551
9583
  if (d.clearTrivia === true) return this.emit(op, -1, bodyIp, flags);
9552
9584
  if (d.triviaParser === void 0) {
9553
- return cap || flags !== 0 ? this.emit(op, -1, bodyIp, flags) : bodyIp;
9585
+ return cap ? this.emit(op, SCOPE_INHERIT, bodyIp, flags) : bodyIp;
9554
9586
  }
9555
9587
  return this.emit(op, this.triviaSlot(d.triviaParser), bodyIp, flags);
9556
9588
  }
@@ -10945,7 +10977,7 @@ function transfer(code, ip, at, hostCst) {
10945
10977
  const op = code[ip];
10946
10978
  if (op === OP_SCOPE || op === OP_SCOPE_CAP || op === OP_SCOPE_PLAIN) {
10947
10979
  const ki = code[ip + 1];
10948
- const tri = ki < 0 ? TRI_NONE : ki;
10980
+ const tri = ki === SCOPE_INHERIT ? at.tri : ki < 0 ? TRI_NONE : ki;
10949
10981
  const cap = op === OP_SCOPE_CAP ? CAP_ON : at.cap;
10950
10982
  if (tri === at.tri && cap === at.cap) return at;
10951
10983
  return { tri, buf: at.buf, raw: at.raw, cap };
@@ -11019,7 +11051,7 @@ function scanHandoffNeeded(code, ip, labels) {
11019
11051
  if (l.tri === TRI_UNKNOWN) return true;
11020
11052
  const op = code[at];
11021
11053
  if (op === OP_SCAN) return true;
11022
- if (op === OP_TOKEN || op === OP_SCOPE_CAP) continue;
11054
+ if (op === OP_TOKEN || op === OP_SCOPE_CAP && code[at + 1] !== SCOPE_INHERIT) continue;
11023
11055
  if ((op === OP_SCOPE_PLAIN || op === OP_SCOPE) && !(code[at + 1] >= 0 && l.tri === code[at + 1] && (op === OP_SCOPE_PLAIN || code[at + 3] === 0))) continue;
11024
11056
  kids.length = 0;
11025
11057
  if (!childSlots(code, at, kids)) return true;
@@ -12314,6 +12346,15 @@ return r.value
12314
12346
  const cap = op === OP_SCOPE_CAP;
12315
12347
  const flags = op === OP_SCOPE_PLAIN ? 0 : code[ip + 3];
12316
12348
  const child = link(code[ip + 2]);
12349
+ if (ki === SCOPE_INHERIT) {
12350
+ return `${head}
12351
+ const sC=ctx.captureTrivia
12352
+ ctx.captureTrivia=true
12353
+ const v=${child}(input,pos,ctx)
12354
+ ctx.captureTrivia=sC
12355
+ return v
12356
+ }`;
12357
+ }
12317
12358
  const scanFor = swapLegal && ki >= 0 && !triviaLabelled[ki] ? hoist("ts", `TRIVIASCAN[${ki}]`) : "null";
12318
12359
  const tri = ki < 0 ? "undefined" : hoist("tv", `TRIVIA[${ki}]`);
12319
12360
  const lab = ki < 0 ? "undefined" : hoist("tl", `TRIVIA[${ki}]._meta.triviaKindLabels`);
@@ -13902,9 +13943,6 @@ function clearOf(ranges, input, from, to) {
13902
13943
  return true;
13903
13944
  }
13904
13945
 
13905
- // src/version.ts
13906
- var PARSEMAN_VERSION = "0.60.5";
13907
-
13908
13946
  // src/table/assemble.ts
13909
13947
  import { PlainBuf as PlainBuf2, PlainField, PlainLeaf as PlainLeaf9, PlainNode as PlainNode2, PlainSpan as PlainSpan10 } from "./cst/plain.js";
13910
13948
 
@@ -15433,6 +15471,16 @@ function assemble(t, prog, cfg) {
15433
15471
  case OP_SCOPE_CAP:
15434
15472
  case OP_SCOPE_PLAIN: {
15435
15473
  const ki = code[ip + 1];
15474
+ if (ki === SCOPE_INHERIT) {
15475
+ const body = link(code[ip + 2]);
15476
+ return (input, pos, ctx) => {
15477
+ const savedCap = ctx.captureTrivia;
15478
+ ctx.captureTrivia = true;
15479
+ const v = body(input, pos, ctx);
15480
+ ctx.captureTrivia = savedCap;
15481
+ return v;
15482
+ };
15483
+ }
15436
15484
  const scopeTrivia = ki < 0 ? void 0 : trivia2[ki];
15437
15485
  const scopeLabels = scopeTrivia?._meta.triviaKindLabels;
15438
15486
  const scanFor = swapLegal && ki >= 0 && !triviaLabelled[ki] ? triviaScan[ki] : null;
@@ -17902,12 +17950,15 @@ function assertPrintable(prog, who) {
17902
17950
  }
17903
17951
  }
17904
17952
  function programFields(prog, fns, opts = {}) {
17953
+ const tokens = [...new Set(prog.fx.flat())];
17954
+ const tokenAt = new Map(tokens.map((token2, i) => [token2, i]));
17905
17955
  return [
17906
17956
  ...emitAssemblies(prog, opts.assemblies ?? []),
17907
17957
  `c:[${prog.code.join(",")}],`,
17908
17958
  `k:[${prog.k.map(emitConst).join(",")}],`,
17909
17959
  `x:${emitClassPool(prog.cc)},`,
17910
- `e:[${prog.fx.map((f) => `[${f.map(jsString).join(",")}]`).join(",")}],`,
17960
+ `e:[${prog.fx.map((f) => `[${f.map((token2) => tokenAt.get(token2)).join(",")}]`).join(",")}],`,
17961
+ `es:[${tokens.map(jsString).join(",")}],`,
17911
17962
  `d:[${prog.disp.map((a) => `[${a.join(",")}]`).join(",")}],`,
17912
17963
  `r:${JSON.stringify(prog.rules)},`,
17913
17964
  ...prog.lines === 1 ? ["l:1,"] : [],
@@ -21030,7 +21081,7 @@ function runOnce(entry, input, options) {
21030
21081
  const r = invoke(entry, input, 0, ctx);
21031
21082
  const value = r.ok ? r.value : void 0;
21032
21083
  let span = r.span ?? { start: 0, end: 0 };
21033
- const expected = r.ok ? [] : r.expected ?? [];
21084
+ const expected = r.ok ? [] : [...new Set(r.expected ?? [])];
21034
21085
  let unconsumedFrom = null;
21035
21086
  if (r.ok) {
21036
21087
  let pos = span.end;