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/combinators/keywords.d.ts +9 -8
- package/dist/combinators/keywords.d.ts.map +1 -1
- package/dist/combinators/parser.d.ts.map +1 -1
- package/dist/index.cjs +50 -23
- package/dist/index.cjs.map +3 -3
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +50 -23
- package/dist/index.js.map +3 -3
- package/dist/plugin/evaluator.d.ts +2 -1
- package/dist/plugin/evaluator.d.ts.map +1 -1
- package/dist/plugin/index.cjs +82 -37
- package/dist/plugin/index.cjs.map +3 -3
- package/dist/plugin/index.js +82 -37
- package/dist/plugin/index.js.map +3 -3
- package/dist/spec/index.cjs +26 -6
- package/dist/spec/index.cjs.map +3 -3
- package/dist/spec/index.js +26 -6
- package/dist/spec/index.js.map +3 -3
- package/dist/version.d.ts +1 -1
- package/package.json +1 -1
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';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,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,SAAS,EAAE,oBAAoB,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAE1P,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,YAAY,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAE9D,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAU9C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AACpE,YAAY,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,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,SAAS,EAAE,oBAAoB,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAE1P,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,YAAY,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAE9D,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAU9C,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,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAClD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AACxF,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC7F,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAA;AAC/C,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,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAEnE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAC5E,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,MAAM,wBAAwB,CAAA;AAEpD,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAC/C,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAEtH,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,eAAe,EAAE,iBAAiB,EAAE,oBAAoB,GACxE,MAAM,sBAAsB,CAAA;AAI7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAC5D,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;AAMlC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACzE,YAAY,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAE1E,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACxF,YAAY,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAEzD,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAA;AAC5C,iEAAiE;AACjE,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAC9C,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,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;AACtF,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAA;AACzC,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AACtG,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,IAAI,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AACnD,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AACrF,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACvD,YAAY,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAEtD,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,OAAO,EACP,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,WAAW,EACX,WAAW,EACX,UAAU,EACV,gBAAgB,GACjB,MAAM,uBAAuB,CAAA;AAC9B,YAAY,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAA;AACtD,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
|
@@ -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(
|
|
923
|
-
|
|
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
|
|
2381
|
-
|
|
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.
|
|
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
|
|
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([[
|
|
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 =
|
|
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,
|
|
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
|
|
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 =
|
|
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 =
|
|
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([[
|
|
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 =
|
|
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,
|
|
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,
|
|
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" ?
|
|
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
|
|
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)
|
|
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 (
|
|
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" &&
|
|
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 (
|
|
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
|
-
|
|
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);
|