parseman 0.51.1 → 0.51.2

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 (48) hide show
  1. package/dist/analysis/diagnostics.js +48 -15
  2. package/dist/analysis/diagnostics.js.map +1 -1
  3. package/dist/cli/index.js +50 -17
  4. package/dist/cli/index.js.map +1 -1
  5. package/dist/combinators/token.d.ts +8 -8
  6. package/dist/combinators/token.d.ts.map +1 -1
  7. package/dist/coverage.d.ts.map +1 -1
  8. package/dist/index.d.ts +1 -1
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +53 -19
  11. package/dist/index.js.map +1 -1
  12. package/dist/plugin/evaluator.d.ts.map +1 -1
  13. package/dist/plugin/index.js +53 -20
  14. package/dist/plugin/index.js.map +1 -1
  15. package/dist/spec/index.js +27 -5
  16. package/dist/spec/index.js.map +1 -1
  17. package/dist/table/assemble.d.ts.map +1 -1
  18. package/dist/table/emit-assembly.d.ts.map +1 -1
  19. package/dist/table/encode-baseline.d.ts.map +1 -1
  20. package/dist/table/exec-baseline.d.ts.map +1 -1
  21. package/dist/table/exec.d.ts.map +1 -1
  22. package/dist/table/index.js +373 -362
  23. package/dist/table/index.js.map +2 -2
  24. package/dist/table/ops.d.ts +2 -0
  25. package/dist/table/ops.d.ts.map +1 -1
  26. package/dist/types.d.ts +1 -0
  27. package/dist/types.d.ts.map +1 -1
  28. package/dist/version.d.ts +1 -1
  29. package/package.json +1 -1
  30. package/src/analysis/duplication.ts +1 -1
  31. package/src/analysis/rebuild.ts +2 -2
  32. package/src/combinators/token.ts +46 -3
  33. package/src/compiler/ir-serialize.ts +4 -4
  34. package/src/coverage.ts +2 -3
  35. package/src/index.ts +1 -1
  36. package/src/plugin/evaluator.ts +7 -4
  37. package/src/table/assemble.ts +8 -3
  38. package/src/table/child-slots.ts +2 -2
  39. package/src/table/emit-assembly.ts +5 -3
  40. package/src/table/encode-baseline.ts +3 -2
  41. package/src/table/encode.ts +3 -3
  42. package/src/table/exec-baseline.ts +30 -4
  43. package/src/table/exec.ts +8 -3
  44. package/src/table/ops.ts +3 -1
  45. package/src/table/scalar-terminal.ts +5 -5
  46. package/src/table/site-labels.ts +2 -2
  47. package/src/types.ts +1 -1
  48. 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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"}
@@ -5113,6 +5113,12 @@ function field(name, combinator) {
5113
5113
  }
5114
5114
 
5115
5115
  // src/combinators/token.ts
5116
+ function semanticLeafValue(_ctx, _input, _start, _end, value) {
5117
+ return value;
5118
+ }
5119
+ function sourceLeafValue(ctx, input, start, end, value) {
5120
+ return cstOutputHost(ctx.build) ? input.slice(start, end) : value;
5121
+ }
5116
5122
  function token(root) {
5117
5123
  const meta = {
5118
5124
  firstSet: root._meta.firstSet,
@@ -5165,7 +5171,8 @@ function token(root) {
5165
5171
  }
5166
5172
  };
5167
5173
  }
5168
- function leaf(root, fn) {
5174
+ function makeLeaf(root, fn, sourceCstValue) {
5175
+ const cstValue = sourceCstValue ? sourceLeafValue : semanticLeafValue;
5169
5176
  const meta = {
5170
5177
  firstSet: root._meta.firstSet,
5171
5178
  canMatchNewline: root._meta.canMatchNewline,
@@ -5174,7 +5181,12 @@ function leaf(root, fn) {
5174
5181
  return {
5175
5182
  _tag: "leaf",
5176
5183
  _meta: meta,
5177
- _def: { tag: "leaf", parser: root, fn },
5184
+ _def: {
5185
+ tag: "leaf",
5186
+ parser: root,
5187
+ fn,
5188
+ ...sourceCstValue ? { cstValue: "source" } : {}
5189
+ },
5178
5190
  parse(input, pos, ctx) {
5179
5191
  const savedBuf = ctx._cstBuf;
5180
5192
  const savedChildren = ctx._cstChildren;
@@ -5202,11 +5214,21 @@ function leaf(root, fn) {
5202
5214
  }
5203
5215
  if (!result.ok) return result;
5204
5216
  const value = fn(result.value, result.span);
5205
- if (wasCapturing) pushCstLeaf(ctx, { _tag: "leaf", value, span: result.span });
5217
+ if (wasCapturing) pushCstLeaf(ctx, {
5218
+ _tag: "leaf",
5219
+ value: cstValue(ctx, input, pos, result.span.end, value),
5220
+ span: result.span
5221
+ });
5206
5222
  return { ok: true, value, span: result.span };
5207
5223
  }
5208
5224
  };
5209
5225
  }
5226
+ function leaf(root, fn) {
5227
+ return makeLeaf(root, fn, false);
5228
+ }
5229
+ function sourceLeaf(root, fn) {
5230
+ return makeLeaf(root, fn, true);
5231
+ }
5210
5232
 
5211
5233
  // src/analysis/gating.ts
5212
5234
  function childrenOf2(d) {
@@ -5698,6 +5720,7 @@ var OP_COV = 40;
5698
5720
  var OP_SCOPE_PLAIN = 41;
5699
5721
  var OP_LEX_BODY = 42;
5700
5722
  var OP_LEX_PROGRAM = 43;
5723
+ var OP_SOURCE_LEAF = 44;
5701
5724
  var OP_DISPATCH = 25;
5702
5725
  var OP_ROUTED = 26;
5703
5726
  var OP_NAMES = {
@@ -5716,6 +5739,7 @@ var OP_NAMES = {
5716
5739
  [OP_NOT]: "NOT",
5717
5740
  [OP_PEEK]: "PEEK",
5718
5741
  [OP_LEAF]: "LEAF",
5742
+ [OP_SOURCE_LEAF]: "SOURCE_LEAF",
5719
5743
  [OP_EMPTY]: "EMPTY",
5720
5744
  [OP_LIT_TRACK]: "LIT_TRACK",
5721
5745
  [OP_RX_TRACK]: "RX_TRACK",
@@ -7668,7 +7692,7 @@ var Encoder = class {
7668
7692
  }
7669
7693
  case "leaf": {
7670
7694
  const child = this.node(d.parser).ip;
7671
- return this.emit(OP_LEAF, this.fn(d.fn, d.fnSrc ?? null), child);
7695
+ return this.emit(d.cstValue === "source" ? OP_SOURCE_LEAF : OP_LEAF, this.fn(d.fn, d.fnSrc ?? null), child);
7672
7696
  }
7673
7697
  case "node": {
7674
7698
  if (d.type === void 0) missingInferredType();
@@ -7893,6 +7917,7 @@ var Encoder = class {
7893
7917
  case OP_WITHCTX:
7894
7918
  case OP_XFORM:
7895
7919
  case OP_LEAF:
7920
+ case OP_SOURCE_LEAF:
7896
7921
  case OP_NODE:
7897
7922
  case OP_NODE_TRACK:
7898
7923
  return [ip + 2];
@@ -9102,6 +9127,7 @@ function childSlots(code, ip, out) {
9102
9127
  case OP_NODE_TRACK:
9103
9128
  case OP_FIELD:
9104
9129
  case OP_LEAF:
9130
+ case OP_SOURCE_LEAF:
9105
9131
  case OP_ARMGATE:
9106
9132
  out.push(code[ip + 2]);
9107
9133
  return true;
@@ -9210,7 +9236,7 @@ function transfer(code, ip, at, hostCst) {
9210
9236
  if (at.tri === TRI_NONE && !at.buf) return at;
9211
9237
  return { tri: TRI_NONE, buf: false, raw: RAW_UNKNOWN, cap: at.cap };
9212
9238
  }
9213
- if (op === OP_LEAF) {
9239
+ if (op === OP_LEAF || op === OP_SOURCE_LEAF) {
9214
9240
  if (!at.buf) return at;
9215
9241
  return { tri: at.tri, buf: false, raw: RAW_UNKNOWN, cap: at.cap };
9216
9242
  }
@@ -9297,7 +9323,7 @@ function leadingScalarTerminal(code, ip, minDepth = 2, throughAttempt = true, th
9297
9323
  depth++;
9298
9324
  continue;
9299
9325
  }
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) {
9326
+ 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
9327
  at = code[at + 2];
9302
9328
  depth++;
9303
9329
  continue;
@@ -9330,7 +9356,7 @@ function leadingScalarSequence(code, ip) {
9330
9356
  at2 = code[at2 + 1];
9331
9357
  continue;
9332
9358
  }
9333
- if (op === OP_GATE || op === OP_SCOPE_PLAIN || op === OP_XFORM || op === OP_NODE || op === OP_FIELD || op === OP_LEAF) {
9359
+ 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
9360
  at2 = code[at2 + 2];
9335
9361
  continue;
9336
9362
  }
@@ -9363,7 +9389,7 @@ function leadingScalarSequence(code, ip) {
9363
9389
  at = code[at + 2];
9364
9390
  continue;
9365
9391
  }
9366
- if (op === OP_GATE || op === OP_XFORM || op === OP_NODE || op === OP_FIELD || op === OP_LEAF) {
9392
+ if (op === OP_GATE || op === OP_XFORM || op === OP_NODE || op === OP_FIELD || (op === OP_LEAF || op === OP_SOURCE_LEAF)) {
9367
9393
  at = code[at + 2];
9368
9394
  continue;
9369
9395
  }
@@ -9393,7 +9419,7 @@ function leadingLiteralFamily(code, constants, ip, minDepth = 2, limit = 4) {
9393
9419
  if (op === OP_RULE || op === OP_LABEL || op === OP_TOKEN || op === OP_ATTEMPT || op === OP_PEEK) {
9394
9420
  return walk(code[at + 1], depth + 1);
9395
9421
  }
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) {
9422
+ 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
9423
  return walk(code[at + 2], depth + 1);
9398
9424
  }
9399
9425
  if (op === OP_SEQ || op === OP_SEQV) {
@@ -10279,8 +10305,10 @@ ${rootCap ? "ctx._rootTriviaCapture=sR\n" : ""}return v
10279
10305
  }
10280
10306
  /* ── boundaries ──────────────────────────────────────────────────────── */
10281
10307
  case OP_TOKEN:
10282
- case OP_LEAF: {
10308
+ case OP_LEAF:
10309
+ case OP_SOURCE_LEAF: {
10283
10310
  const isToken = op === OP_TOKEN;
10311
+ const capturesSource = isToken || op === OP_SOURCE_LEAF && hostCst;
10284
10312
  const fn = isToken ? void 0 : fnRef(code[ip + 1]);
10285
10313
  const child = link(isToken ? code[ip + 1] : code[ip + 2]);
10286
10314
  const wasCap = L.buf ? "true" : "(ctx._cstBuf!==undefined||ctx._cstLeaves!==undefined)";
@@ -10313,7 +10341,7 @@ ctx._triviaLog=sOtl
10313
10341
  if(v===FAIL)return FAIL
10314
10342
  const e=EC.e
10315
10343
  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}})
10344
+ if(wasCap)pushCstLeaf(ctx,{_tag:'leaf',value:${capturesSource ? "input.slice(pos,e)" : "out"},span:{start:pos,end:e}})
10317
10345
  EC.e=e
10318
10346
  return out
10319
10347
  }`;
@@ -12970,7 +12998,8 @@ function assemble(t, prog, cfg) {
12970
12998
  return value;
12971
12999
  };
12972
13000
  }
12973
- case OP_LEAF: {
13001
+ case OP_LEAF:
13002
+ case OP_SOURCE_LEAF: {
12974
13003
  const fn = fns[code[ip + 1]];
12975
13004
  const child = link(code[ip + 2]);
12976
13005
  return (input, pos, ctx) => {
@@ -12998,7 +13027,11 @@ function assemble(t, prog, cfg) {
12998
13027
  if (v === FAIL) return FAIL;
12999
13028
  const end = EC.e;
13000
13029
  const out = fn(v, { start: pos, end });
13001
- if (wasCapturing) pushCstLeaf(ctx, { _tag: "leaf", value: out, span: { start: pos, end } });
13030
+ if (wasCapturing) pushCstLeaf(ctx, {
13031
+ _tag: "leaf",
13032
+ value: op === OP_SOURCE_LEAF && hostCst ? input.slice(pos, end) : out,
13033
+ span: { start: pos, end }
13034
+ });
13002
13035
  EC.e = end;
13003
13036
  return out;
13004
13037
  };
@@ -15039,7 +15072,7 @@ function payloadKey(p, d) {
15039
15072
  case "transform":
15040
15073
  return `transform\0${fnKey(d.fnSrc, d.fn)}\0${d.recognitionOnly === true}`;
15041
15074
  case "leaf":
15042
- return `leaf\0${fnKey(d.fnSrc, d.fn)}`;
15075
+ return `leaf\0${d.cstValue ?? "value"}\0${fnKey(d.fnSrc, d.fn)}`;
15043
15076
  case "many":
15044
15077
  case "oneOrMore":
15045
15078
  return `${d.tag}\0${d.min}\0${d.max ?? ""}`;
@@ -16528,7 +16561,7 @@ function evalRuleMapIR(ir) {
16528
16561
  if (recognitionOnly) t._def.recognitionOnly = true;
16529
16562
  return t;
16530
16563
  };
16531
- const _lf = (child, src) => {
16564
+ const _lf = (child, src, source = false) => {
16532
16565
  let fn2;
16533
16566
  try {
16534
16567
  fn2 = (0, eval)(`(${src})`);
@@ -16537,7 +16570,7 @@ function evalRuleMapIR(ir) {
16537
16570
  throw new Error("IR leaf fn not materialized");
16538
16571
  };
16539
16572
  }
16540
- const l = leaf(child, fn2);
16573
+ const l = source ? sourceLeaf(child, fn2) : leaf(child, fn2);
16541
16574
  l._def.fnSrc = src;
16542
16575
  return l;
16543
16576
  };
@@ -16940,7 +16973,7 @@ ${outerDecls.map((d) => " " + d).join("\n")}
16940
16973
  return `token(${kid(def.parser)})`;
16941
16974
  case "leaf": {
16942
16975
  if (def.fnSrc === void 0) throw new Unserializable("leaf without fnSrc");
16943
- return `_lf(${kid(def.parser)}, ${JSON.stringify(def.fnSrc)})`;
16976
+ return `_lf(${kid(def.parser)}, ${JSON.stringify(def.fnSrc)}${def.cstValue === "source" ? ", true" : ""})`;
16944
16977
  }
16945
16978
  case "label":
16946
16979
  return `label(${JSON.stringify(def.label)}, ${kid(def.parser)})`;
@@ -17129,7 +17162,7 @@ function compileRuleMap(ruleMap, opts = {}) {
17129
17162
  }
17130
17163
 
17131
17164
  // src/version.ts
17132
- var PARSEMAN_VERSION = "0.51.1";
17165
+ var PARSEMAN_VERSION = "0.51.2";
17133
17166
 
17134
17167
  // src/compiler/compile-linkable-table.ts
17135
17168
  function isLocal(rule) {
@@ -17852,7 +17885,7 @@ function exprToCombi(node2, scope, code, mfs) {
17852
17885
  return null;
17853
17886
  }
17854
17887
  }
17855
- if (callee.name === "leaf" && code !== void 0 && mfs !== void 0) {
17888
+ if ((callee.name === "leaf" || callee.name === "sourceLeaf") && code !== void 0 && mfs !== void 0) {
17856
17889
  const [parserArg, fnArg] = node2.arguments;
17857
17890
  if (!parserArg || !fnArg || parserArg.type === "SpreadElement" || fnArg.type === "SpreadElement") return null;
17858
17891
  const inner = anyValue(parserArg, scope, code, mfs);
@@ -17860,7 +17893,7 @@ function exprToCombi(node2, scope, code, mfs) {
17860
17893
  const fnSrc = stripTsFromSource(fnArg, code);
17861
17894
  mfs.push(fnSrc);
17862
17895
  try {
17863
- const combi = leaf(inner, (v) => v);
17896
+ const combi = callee.name === "sourceLeaf" ? sourceLeaf(inner, (v) => v) : leaf(inner, (v) => v);
17864
17897
  if (combi._def.tag === "leaf") combi._def.fnSrc = fnSrc;
17865
17898
  return combi;
17866
17899
  } catch {