parseman 0.37.0 → 0.38.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.
package/dist/index.d.ts CHANGED
@@ -3,7 +3,7 @@ export { literal } from './combinators/literal.ts';
3
3
  export type { LiteralOptions } from './combinators/literal.ts';
4
4
  export { regex } from './combinators/regex.ts';
5
5
  export { keywords, word, makeWord } from './combinators/keywords.ts';
6
- export type { KeywordsOptions } from './combinators/keywords.ts';
6
+ export type { KeywordsOptions, WordOptions } from './combinators/keywords.ts';
7
7
  export { sequence } from './combinators/sequence.ts';
8
8
  export { choice } from './combinators/choice.ts';
9
9
  export { attempt } from './combinators/attempt.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":"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"}
package/dist/index.js CHANGED
@@ -919,8 +919,10 @@ function word(str, boundaryOrOpts, opts) {
919
919
  const rest = typeof boundaryOrOpts === "object" && boundaryOrOpts !== null ? boundaryOrOpts : opts;
920
920
  return keywords([str], { ...rest, boundary });
921
921
  }
922
- function makeWord(boundary = "_0-9A-Za-z") {
923
- return (str) => keywords([str], { boundary });
922
+ function makeWord(boundaryOrOpts = "_0-9A-Za-z", opts) {
923
+ const boundary = typeof boundaryOrOpts === "string" ? boundaryOrOpts : "_0-9A-Za-z";
924
+ const rest = typeof boundaryOrOpts === "object" && boundaryOrOpts !== null ? boundaryOrOpts : opts;
925
+ return (str) => keywords([str], { ...rest, boundary });
924
926
  }
925
927
  function escapeRe(s) {
926
928
  return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
@@ -2357,6 +2359,16 @@ function tagRule(r, key) {
2357
2359
  r._ruleName = key;
2358
2360
  if (r._def.tag === "node" && r._def.type === void 0) r._def.type = key;
2359
2361
  }
2362
+ function isDefinableRef(v2) {
2363
+ return !!v2 && typeof v2 === "object" && "_def" in v2 && v2._def.tag === "lazy" && typeof v2.define === "function";
2364
+ }
2365
+ function ruleNameOf(r) {
2366
+ return r._ruleName;
2367
+ }
2368
+ function isNamedRuleRefForAnotherRule(r, key) {
2369
+ const name = r._def.tag === "lazy" ? ruleNameOf(r) : void 0;
2370
+ return name !== void 0 && name !== key;
2371
+ }
2360
2372
  function rules(a, b) {
2361
2373
  const factory = typeof a === "function" ? a : b;
2362
2374
  const options = typeof a === "function" ? b : a;
@@ -2377,11 +2389,21 @@ function rules(a, b) {
2377
2389
  for (const key of Object.keys(definitions)) {
2378
2390
  const placeholder = cache[key];
2379
2391
  const parser2 = definitions[key];
2380
- if (placeholder !== void 0 && typeof placeholder.define === "function") {
2381
- tagRule(parser2, key);
2392
+ if (placeholder === parser2) {
2393
+ throw new Error(`rules(): rule "${key}" cannot be a direct alias to itself`);
2394
+ }
2395
+ if (isDefinableRef(placeholder)) {
2396
+ if (!isNamedRuleRefForAnotherRule(parser2, key)) tagRule(parser2, key);
2382
2397
  placeholder.define(parser2);
2383
2398
  placeholder._meta.firstSet = parser2._meta.firstSet;
2384
2399
  placeholder._meta.canMatchNewline = parser2._meta.canMatchNewline;
2400
+ } else if (isNamedRuleRefForAnotherRule(parser2, key)) {
2401
+ const alias = ref();
2402
+ tagRule(alias, key);
2403
+ alias.define(parser2);
2404
+ alias._meta.firstSet = parser2._meta.firstSet;
2405
+ alias._meta.canMatchNewline = parser2._meta.canMatchNewline;
2406
+ cache[key] = alias;
2385
2407
  } else {
2386
2408
  tagRule(parser2, key);
2387
2409
  cache[key] = parser2;
@@ -3034,7 +3056,7 @@ function leaf(root, fn) {
3034
3056
  }
3035
3057
 
3036
3058
  // src/version.ts
3037
- var PARSEMAN_VERSION = "0.37.0";
3059
+ var PARSEMAN_VERSION = "0.38.0";
3038
3060
 
3039
3061
  // src/cst/host-mode.ts
3040
3062
  var FUSED_HOST_MODE = /* @__PURE__ */ Symbol.for("parseman.fusedHostMode");
@@ -3088,7 +3110,7 @@ function firstSetToString(fs) {
3088
3110
  if (fs.kind === "empty") return "(empty)";
3089
3111
  return fs.ranges.map((r) => r.lo === r.hi ? ch(r.lo) : `${ch(r.lo)}-${ch(r.hi)}`).join(",");
3090
3112
  }
3091
- var ruleNameOf = (p) => p._ruleName;
3113
+ var ruleNameOf2 = (p) => p._ruleName;
3092
3114
  var SUGGESTIONS = {
3093
3115
  "broad-recognizer": "if this arm leads with a keyword regex, use word('kw', boundary) / keywords([...]) \u2014 they expose an EXACT, gating first-set and lower to the same charCodeAt scan. A genuine scanTo fallback is fine; accept it in the gating snapshot if intentional.",
3094
3116
  "leading-not": "let the arm lead with its actual consuming terminal (first-sets gate it automatically); keep not(...) only as a TRAILING boundary. Do not hand-roll not(not(...)) to fake gating \u2014 use peek(X), which is zero-width AND carries X first-set.",
@@ -3246,7 +3268,7 @@ function detectAntiPatterns(rule, arms) {
3246
3268
  return out;
3247
3269
  }
3248
3270
  function analyzeGating(entry, opts) {
3249
- return analyzeGatingRules([[ruleNameOf(entry) ?? opts?.entryName ?? "<entry>", entry]], opts);
3271
+ return analyzeGatingRules([[ruleNameOf2(entry) ?? opts?.entryName ?? "<entry>", entry]], opts);
3250
3272
  }
3251
3273
  function analyzeGatingRules(ruleMap, opts) {
3252
3274
  const raw = [];
@@ -3279,7 +3301,7 @@ function analyzeGatingRules(ruleMap, opts) {
3279
3301
  return;
3280
3302
  }
3281
3303
  const d = def;
3282
- const rule = ruleNameOf(p) ?? enclosingRule;
3304
+ const rule = ruleNameOf2(p) ?? enclosingRule;
3283
3305
  if (d.tag === "choice") {
3284
3306
  raw.push({ g: analyzeChoice(p, d, rule, opts?.resolveRef), rule });
3285
3307
  antiPatterns.push(...detectAntiPatterns(rule, d.parsers));
@@ -3298,7 +3320,7 @@ function analyzeGatingRules(ruleMap, opts) {
3298
3320
  }
3299
3321
  for (const k of kids) visit(k, rule);
3300
3322
  };
3301
- for (const [name, root] of ruleMap) visit(root, ruleNameOf(root) ?? name);
3323
+ for (const [name, root] of ruleMap) visit(root, ruleNameOf2(root) ?? name);
3302
3324
  const perRule = /* @__PURE__ */ new Map();
3303
3325
  for (const r of raw) perRule.set(r.rule, (perRule.get(r.rule) ?? 0) + 1);
3304
3326
  const seenInRule = /* @__PURE__ */ new Map();
@@ -3422,7 +3444,7 @@ function childrenOf(d) {
3422
3444
  }
3423
3445
  }
3424
3446
  }
3425
- var ruleNameOf2 = (p) => p._ruleName;
3447
+ var ruleNameOf3 = (p) => p._ruleName;
3426
3448
  var fnKey = (src, fn) => src ?? (typeof fn === "function" ? String(fn) : "");
3427
3449
  function payloadKey(p, d) {
3428
3450
  switch (d.tag) {
@@ -3433,7 +3455,7 @@ function payloadKey(p, d) {
3433
3455
  case "keywords":
3434
3456
  return `keywords\0${[...d.words].join("")}\0${d.caseInsensitive}\0${d.boundary ?? ""}`;
3435
3457
  case "lazy": {
3436
- const n = ruleNameOf2(p);
3458
+ const n = ruleNameOf3(p);
3437
3459
  return n === void 0 ? `ref\0#${anonId(p)}` : `ref\0${n}`;
3438
3460
  }
3439
3461
  case "label":
@@ -3500,7 +3522,7 @@ var Interner = class {
3500
3522
  var MAX_RENDER = 160;
3501
3523
  function render(p, depth = 3) {
3502
3524
  const d = p._def;
3503
- const name = ruleNameOf2(p);
3525
+ const name = ruleNameOf3(p);
3504
3526
  switch (d.tag) {
3505
3527
  case "literal":
3506
3528
  return `literal('${d.value}')`;
@@ -3679,7 +3701,7 @@ function keywordAlternationHazards(words, boundary) {
3679
3701
  return out;
3680
3702
  }
3681
3703
  function analyzeDuplication(entry, opts) {
3682
- return analyzeDuplicationRules([[ruleNameOf2(entry) ?? opts?.entryName ?? "<entry>", entry]], opts);
3704
+ return analyzeDuplicationRules([[ruleNameOf3(entry) ?? opts?.entryName ?? "<entry>", entry]], opts);
3683
3705
  }
3684
3706
  function assertAnalyzable(ruleMap) {
3685
3707
  for (const [name, rule] of ruleMap) {
@@ -3720,7 +3742,7 @@ function analyzeDuplicationRules(ruleMap, opts) {
3720
3742
  const visit = (p, rule, path, enclosingNode, enclosingReducer) => {
3721
3743
  if (visited.has(p)) return;
3722
3744
  const d = p._def;
3723
- const own = ruleNameOf2(p);
3745
+ const own = ruleNameOf3(p);
3724
3746
  const here = own !== void 0 && own !== rule ? { rule: own, path: "" } : { rule, path };
3725
3747
  visited.set(p, { p, d, site: here, shape: shapeOf(p), size: sizeOf(p), enclosingNode, enclosingReducer });
3726
3748
  const inner = d.tag === "node" ? d.type ?? "(anonymous)" : enclosingNode;
@@ -3733,12 +3755,12 @@ function analyzeDuplicationRules(ruleMap, opts) {
3733
3755
  if (d.tag === "lazy") {
3734
3756
  try {
3735
3757
  const target = d.thunk();
3736
- visit(target, ruleNameOf2(target) ?? ruleNameOf2(p) ?? here.rule, "", null, false);
3758
+ visit(target, ruleNameOf3(target) ?? ruleNameOf3(p) ?? here.rule, "", null, false);
3737
3759
  } catch {
3738
3760
  }
3739
3761
  }
3740
3762
  };
3741
- for (const [name, root] of ruleMap) visit(root, ruleNameOf2(root) ?? name, "", null, false);
3763
+ for (const [name, root] of ruleMap) visit(root, ruleNameOf3(root) ?? name, "", null, false);
3742
3764
  const accept = new Set(opts?.accept ?? []);
3743
3765
  const used = /* @__PURE__ */ new Set();
3744
3766
  const keep = (f) => {
@@ -8585,7 +8607,7 @@ function ruleDependencies(ruleMap) {
8585
8607
  const seen = /* @__PURE__ */ new Set();
8586
8608
  const walk2 = (p, isRoot) => {
8587
8609
  const def = p._def;
8588
- const boundary = def.tag === "lazy" ? p._ruleName ?? nameOf.get(p) : nameOf.get(p);
8610
+ const boundary = def.tag === "lazy" ? nameOf.get(p) ?? p._ruleName : nameOf.get(p);
8589
8611
  if (!isRoot && boundary !== void 0) {
8590
8612
  found.add(boundary);
8591
8613
  return;
@@ -9224,7 +9246,7 @@ function childrenOf3(def) {
9224
9246
  return [];
9225
9247
  }
9226
9248
  }
9227
- var ruleNameOf3 = (c) => c._ruleName;
9249
+ var ruleNameOf4 = (c) => c._ruleName;
9228
9250
  function lazyTarget(c) {
9229
9251
  if (c._def.tag !== "lazy") return null;
9230
9252
  try {
@@ -9406,12 +9428,16 @@ var Serializer = class {
9406
9428
  emitted = /* @__PURE__ */ new Set();
9407
9429
  decls = [];
9408
9430
  ruleValues = /* @__PURE__ */ new Set();
9431
+ localRuleNames = /* @__PURE__ */ new Map();
9409
9432
  ruleMap;
9410
9433
  scanSkip;
9411
9434
  constructor(ruleMap, scanSkip = []) {
9412
9435
  this.ruleMap = ruleMap;
9413
9436
  this.scanSkip = scanSkip;
9414
- for (const [, c] of ruleMap) this.ruleValues.add(this.body(c));
9437
+ for (const [name, c] of ruleMap) {
9438
+ this.localRuleNames.set(c, name);
9439
+ this.ruleValues.add(this.body(c));
9440
+ }
9415
9441
  }
9416
9442
  /** A grammar-level `scanSkip` unit is an opaque TERMINAL (a string, a balanced
9417
9443
  * bracket) — it must not reach a grammar-rule ref (`g[name]`), because the
@@ -9422,7 +9448,7 @@ var Serializer = class {
9422
9448
  if (seen.has(c)) return;
9423
9449
  seen.add(c);
9424
9450
  if (c._def.tag === "lazy") {
9425
- if (ruleNameOf3(c) !== void 0) throw new Unserializable("scanSkip unit references a grammar rule");
9451
+ if (ruleNameOf4(c) !== void 0) throw new Unserializable("scanSkip unit references a grammar rule");
9426
9452
  const target = lazyTarget(c);
9427
9453
  if (target) this.assertNoRuleRef(target, seen);
9428
9454
  return;
@@ -9433,7 +9459,7 @@ var Serializer = class {
9433
9459
  * its target (compileLinkable unwraps the same way). A ref INSIDE a body stays a
9434
9460
  * `g[name]` ref — only the top-level entry is unwrapped. */
9435
9461
  body(c) {
9436
- return c._def.tag === "lazy" && ruleNameOf3(c) !== void 0 ? lazyTarget(c) ?? c : c;
9462
+ return c._def.tag === "lazy" && ruleNameOf4(c) !== void 0 ? lazyTarget(c) ?? c : c;
9437
9463
  }
9438
9464
  run() {
9439
9465
  for (const [, c] of this.ruleMap) this.analyze(this.body(c), /* @__PURE__ */ new Set());
@@ -9475,7 +9501,7 @@ ${outerDecls.map((d) => " " + d).join("\n")}
9475
9501
  analyze(c, active) {
9476
9502
  const def = c._def;
9477
9503
  if (def.tag === "lazy") {
9478
- if (ruleNameOf3(c) !== void 0) return;
9504
+ if (ruleNameOf4(c) !== void 0) return;
9479
9505
  const target = lazyTarget(c);
9480
9506
  if (!target) throw new Unserializable("unresolved unnamed ref");
9481
9507
  if (active.has(target)) {
@@ -9527,7 +9553,8 @@ ${outerDecls.map((d) => " " + d).join("\n")}
9527
9553
  const kid = (x) => this.ref(x, selfOf);
9528
9554
  switch (def.tag) {
9529
9555
  case "lazy": {
9530
- if (ruleNameOf3(c) !== void 0) return `g[${JSON.stringify(ruleNameOf3(c))}]`;
9556
+ const name = this.localRuleNames.get(c) ?? ruleNameOf4(c);
9557
+ if (name !== void 0) return `g[${JSON.stringify(name)}]`;
9531
9558
  const target = lazyTarget(c);
9532
9559
  if (selfOf && target === selfOf.comb) return selfOf.var;
9533
9560
  return this.ref(target, selfOf);