parseman 0.26.2 → 0.27.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/compiler/codegen.d.ts.map +1 -1
- package/dist/compiler/fields.d.ts +13 -0
- package/dist/compiler/fields.d.ts.map +1 -1
- package/dist/compiler/ir-serialize.d.ts.map +1 -1
- package/dist/functional/run.d.ts +29 -0
- package/dist/functional/run.d.ts.map +1 -1
- package/dist/index.cjs +153 -36
- 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 +153 -36
- package/dist/index.js.map +3 -3
- package/dist/language-service/index.cjs +36 -3
- package/dist/language-service/index.cjs.map +2 -2
- package/dist/language-service/index.js +36 -3
- package/dist/language-service/index.js.map +2 -2
- package/dist/plugin/index.cjs +117 -33
- package/dist/plugin/index.cjs.map +3 -3
- package/dist/plugin/index.js +117 -33
- package/dist/plugin/index.js.map +3 -3
- package/dist/types.d.ts +14 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codegen.d.ts","sourceRoot":"","sources":["../../src/compiler/codegen.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,UAAU,EAAa,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAA4B,MAAM,aAAa,CAAA;AA0BnI;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,uTAC0R,CAAA;AActT,8EAA8E;AAC9E,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAED,+EAA+E;AAC/E,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAI7C;AAudD,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,GAAG,MAAM,CAQlE;AAcD,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAA0B;
|
|
1
|
+
{"version":3,"file":"codegen.d.ts","sourceRoot":"","sources":["../../src/compiler/codegen.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,19 @@ type NodeDef = Extract<ParserDef, {
|
|
|
4
4
|
}>;
|
|
5
5
|
export declare function buildReadsFields(def: NodeDef): boolean;
|
|
6
6
|
export declare function parserHasOwnFields(p: Combinator<unknown>, seen?: Set<Combinator<unknown>>): boolean;
|
|
7
|
+
/**
|
|
8
|
+
* Does the node's OWN parse frame ever have a trivia run logged into it?
|
|
9
|
+
* Trivia is logged only by the trivia-skip fn, which runs at `sequence`/`many`/
|
|
10
|
+
* repeat boundaries. A bare terminal (regex/literal/keywords/…) has NO trivia
|
|
11
|
+
* site, so its `_cstTriviaLog` stays empty and its `captureTrivia`/`_cstTriviaLog`/
|
|
12
|
+
* `_triviaCaptureMask` save+install+restore is dead work — the per-node scope
|
|
13
|
+
* trivia frame can be elided for it (see emitNode `needsTriviaFrame`).
|
|
14
|
+
*
|
|
15
|
+
* Stops at a nested `node()` (it manages its OWN trivia frame; trivia inside it
|
|
16
|
+
* never logs to THIS node's frame). CONSERVATIVE: any unknown / trivia-bearing
|
|
17
|
+
* shape returns `true` (keep the frame) — we only elide when provably safe.
|
|
18
|
+
*/
|
|
19
|
+
export declare function parserHasTriviaSite(p: Combinator<unknown>, seen?: Set<Combinator<unknown>>): boolean;
|
|
7
20
|
export declare function buildFieldMap(captures: ReadonlyArray<{
|
|
8
21
|
name: string;
|
|
9
22
|
value: unknown;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fields.d.ts","sourceRoot":"","sources":["../../src/compiler/fields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAGlE,KAAK,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAAA;AAElD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAMtD;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,IAAI,GAAE,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAa,GAAG,OAAO,CA+B9G;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,aAAa,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAW/J"}
|
|
1
|
+
{"version":3,"file":"fields.d.ts","sourceRoot":"","sources":["../../src/compiler/fields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAGlE,KAAK,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAAA;AAElD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAMtD;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,IAAI,GAAE,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAa,GAAG,OAAO,CA+B9G;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,EAAE,IAAI,GAAE,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAa,GAAG,OAAO,CAwC/G;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,aAAa,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAW/J"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ir-serialize.d.ts","sourceRoot":"","sources":["../../src/compiler/ir-serialize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,UAAU,EAAa,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"ir-serialize.d.ts","sourceRoot":"","sources":["../../src/compiler/ir-serialize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,UAAU,EAAa,MAAM,aAAa,CAAA;AAkBxD,KAAK,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;AA4C/B,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,GAC9C,MAAM,GAAG,IAAI,CAUf;AAED;;oFAEoF;AACpF,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAiF/D"}
|
package/dist/functional/run.d.ts
CHANGED
|
@@ -51,6 +51,33 @@ export type RunOptions = {
|
|
|
51
51
|
* fails, so none of the machinery runs.
|
|
52
52
|
*/
|
|
53
53
|
tolerant?: boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Run three compiled-parser-only profiling passes: recognizer (no global
|
|
56
|
+
* sinks), structural capture without the host, then the normal host path. This
|
|
57
|
+
* is a measurement boundary, not a parser mode; ordinary `run()` output is
|
|
58
|
+
* unchanged when omitted. The input is parsed THREE times — each pass gets its
|
|
59
|
+
* own shallow copy of `options.state`, so keep per-parse state shallow (only
|
|
60
|
+
* the top level is isolated between passes).
|
|
61
|
+
*/
|
|
62
|
+
profile?: boolean;
|
|
63
|
+
};
|
|
64
|
+
export type RunProfilePass = {
|
|
65
|
+
ms: number;
|
|
66
|
+
nodes: number;
|
|
67
|
+
childSlots: number;
|
|
68
|
+
rawSlots: number;
|
|
69
|
+
triviaSlots: number;
|
|
70
|
+
fieldSlots: number;
|
|
71
|
+
hostCalls: number;
|
|
72
|
+
};
|
|
73
|
+
export type RunProfile = {
|
|
74
|
+
/** Existing `voidOf(transform(..., () => undefined))` semantics, generalized
|
|
75
|
+
* to compiled structural nodes: no `ch`/`raw`/`tl` capture or raw entries. */
|
|
76
|
+
recognizer: RunProfilePass;
|
|
77
|
+
/** Captures children/raw/trivia/fields but suppresses node construction. */
|
|
78
|
+
structuralCapture: RunProfilePass;
|
|
79
|
+
/** The ordinary parser path, including its injected build host. */
|
|
80
|
+
hostConstruction: RunProfilePass;
|
|
54
81
|
};
|
|
55
82
|
export type RunResult = {
|
|
56
83
|
ok: boolean;
|
|
@@ -78,6 +105,8 @@ export type RunResult = {
|
|
|
78
105
|
* there's junk here". Only meaningful on success — a failed parse reports its own
|
|
79
106
|
* `span`/`expected`. */
|
|
80
107
|
unconsumedFrom: number | null;
|
|
108
|
+
/** Present only when `RunOptions.profile` is true. */
|
|
109
|
+
profile?: RunProfile;
|
|
81
110
|
};
|
|
82
111
|
export declare function run(entry: Runnable, input: string, options?: RunOptions): RunResult;
|
|
83
112
|
//# sourceMappingURL=run.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/functional/run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAGpF;;;;;;;;;;;;GAYG;AAEH,+EAA+E;AAC/E,MAAM,MAAM,QAAQ,GAChB,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,KAAK,WAAW,CAAC,OAAO,CAAC,CAAC,GACzE,UAAU,CAAC,OAAO,CAAC,CAAA;AAEvB,MAAM,MAAM,UAAU,GAAG;IACvB;qFACiF;IACjF,KAAK,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,CAAA;IAC7B,uDAAuD;IACvD,KAAK,CAAC,EAAE,OAAO,CAAA;IACf;;;;;;;;;OASG;IACH,MAAM,CAAC,EAAE,QAAQ,CAAA;IACjB;;;;;;;OAOG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B;;;;;;;;;OASG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/functional/run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAGpF;;;;;;;;;;;;GAYG;AAEH,+EAA+E;AAC/E,MAAM,MAAM,QAAQ,GAChB,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,KAAK,WAAW,CAAC,OAAO,CAAC,CAAC,GACzE,UAAU,CAAC,OAAO,CAAC,CAAA;AAEvB,MAAM,MAAM,UAAU,GAAG;IACvB;qFACiF;IACjF,KAAK,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,CAAA;IAC7B,uDAAuD;IACvD,KAAK,CAAC,EAAE,OAAO,CAAA;IACf;;;;;;;;;OASG;IACH,MAAM,CAAC,EAAE,QAAQ,CAAA;IACjB;;;;;;;OAOG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B;;;;;;;;;OASG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IACvB;kFAC8E;IAC9E,UAAU,EAAE,cAAc,CAAA;IAC1B,4EAA4E;IAC5E,iBAAiB,EAAE,cAAc,CAAA;IACjC,mEAAmE;IACnE,gBAAgB,EAAE,cAAc,CAAA;CACjC,CAAA;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,EAAE,EAAE,OAAO,CAAA;IACX,0DAA0D;IAC1D,KAAK,EAAE,OAAO,CAAA;IACd,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;IACpC,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,gGAAgG;IAChG,MAAM,EAAE,UAAU,EAAE,CAAA;IACpB;;;;;;OAMG;IACH,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB;;;;4BAIwB;IACxB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,sDAAsD;IACtD,OAAO,CAAC,EAAE,UAAU,CAAA;CACrB,CAAA;AAoFD,wBAAgB,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,UAAe,GAAG,SAAS,CAsBvF"}
|
package/dist/index.cjs
CHANGED
|
@@ -2305,6 +2305,55 @@ function parserHasOwnFields(p, seen = /* @__PURE__ */ new Set()) {
|
|
|
2305
2305
|
return false;
|
|
2306
2306
|
}
|
|
2307
2307
|
}
|
|
2308
|
+
function parserHasTriviaSite(p, seen = /* @__PURE__ */ new Set()) {
|
|
2309
|
+
if (seen.has(p)) return true;
|
|
2310
|
+
seen.add(p);
|
|
2311
|
+
const d = p._def;
|
|
2312
|
+
switch (d.tag) {
|
|
2313
|
+
// Trivia is skipped between/around elements or iterations → a site.
|
|
2314
|
+
case "sequence":
|
|
2315
|
+
case "many":
|
|
2316
|
+
case "oneOrMore":
|
|
2317
|
+
case "sepBy":
|
|
2318
|
+
case "scanTo":
|
|
2319
|
+
case "recover":
|
|
2320
|
+
case "skip":
|
|
2321
|
+
return true;
|
|
2322
|
+
// Nested node manages its own trivia frame; none logs here.
|
|
2323
|
+
case "node":
|
|
2324
|
+
return false;
|
|
2325
|
+
// Pure terminals + trivia-suppressing token: no site.
|
|
2326
|
+
case "regex":
|
|
2327
|
+
case "literal":
|
|
2328
|
+
case "keywords":
|
|
2329
|
+
case "guard":
|
|
2330
|
+
case "token":
|
|
2331
|
+
return false;
|
|
2332
|
+
// Transparent single-child wrappers: recurse.
|
|
2333
|
+
case "optional":
|
|
2334
|
+
case "transform":
|
|
2335
|
+
case "trivia":
|
|
2336
|
+
case "label":
|
|
2337
|
+
case "expect":
|
|
2338
|
+
case "withCtx":
|
|
2339
|
+
case "not":
|
|
2340
|
+
case "field":
|
|
2341
|
+
return parserHasTriviaSite(d.parser, seen);
|
|
2342
|
+
case "choice":
|
|
2343
|
+
return d.parsers.some((x) => parserHasTriviaSite(x, seen));
|
|
2344
|
+
case "grammar":
|
|
2345
|
+
return parserHasTriviaSite(d.parser, seen);
|
|
2346
|
+
case "lazy": {
|
|
2347
|
+
try {
|
|
2348
|
+
return parserHasTriviaSite(d.thunk(), seen);
|
|
2349
|
+
} catch {
|
|
2350
|
+
return true;
|
|
2351
|
+
}
|
|
2352
|
+
}
|
|
2353
|
+
default:
|
|
2354
|
+
return true;
|
|
2355
|
+
}
|
|
2356
|
+
}
|
|
2308
2357
|
function buildFieldMap(captures) {
|
|
2309
2358
|
if (!captures?.length) return void 0;
|
|
2310
2359
|
const out = {};
|
|
@@ -5296,32 +5345,49 @@ function emitNode(def, ctx, pos) {
|
|
|
5296
5345
|
const smk = structural ? v(ctx, "_smk") : null;
|
|
5297
5346
|
if (structural) ctx.needsHostReads = true;
|
|
5298
5347
|
const hostTriviaGate = `_ctx.build !== undefined && (_ctx.build._parsemanCaptureTrivia !== undefined ? _ctx.build._parsemanCaptureTrivia(${JSON.stringify(def.type)}) : (_ctx._pmCapTL ??= _hostReads(_ctx.build, 5)))`;
|
|
5299
|
-
const
|
|
5300
|
-
|
|
5348
|
+
const pmV = v(ctx, "_pm"), recV = v(ctx, "_rec"), capV = v(ctx, "_cap");
|
|
5349
|
+
const profHoist = `${i}const ${pmV} = _ctx._pmProfile, ${recV} = ${pmV}?.phase === 'recognizer', ${capV} = ${pmV}?.phase === 'capture'`;
|
|
5350
|
+
const profileRecognizer = recV;
|
|
5351
|
+
const profileCapture = capV;
|
|
5352
|
+
const allocStmt = structural ? `${i}const ${capTLv} = !(${profileRecognizer}) && (${profileCapture} || ${hostTriviaGate}), ${capSTv} = !(${profileRecognizer} || ${profileCapture}) && (_ctx._pmCapST ??= (_ctx.build === undefined || _hostReads(_ctx.build, 6)))${capFv ? `, ${capFv} = !(${profileRecognizer}) && (${profileCapture} || (_ctx.build !== undefined && _hostReads(_ctx.build, 2)))` : ""}
|
|
5353
|
+
${i}const ${chV} = ${profileRecognizer} ? undefined : [], ${rawV} = ${profileRecognizer} ? undefined : [], ${tlV} = ${capTLv} ? [] : _EMPTY_TL` : capturesTrivia ? `${i}const ${chV} = ${profileRecognizer} ? undefined : [], ${rawV} = ${profileRecognizer} ? undefined : [], ${tlV} = ${profileRecognizer} ? undefined : []` : `${i}const ${chV} = ${profileRecognizer} ? undefined : [], ${rawV} = ${profileRecognizer} ? undefined : []`;
|
|
5301
5354
|
const innerTl = structural ? `${capTLv} ? ${tlV} : undefined` : capturesTrivia ? tlV : "undefined";
|
|
5302
|
-
const fieldsOn = structural ? capFv ?? "false" : capturesFields ? "true" : "false"
|
|
5355
|
+
const fieldsOn = structural ? capFv ?? "false" : `${profileRecognizer} ? false : ${capturesFields ? "true" : "false"}`;
|
|
5303
5356
|
const sf = hasFields ? v(ctx, "_sf") : null;
|
|
5304
5357
|
const fArr = hasFields ? v(ctx, "_fa") : null;
|
|
5305
5358
|
const fObj = hasFields ? v(ctx, "_fields") : "undefined";
|
|
5359
|
+
const needsTriviaFrame = parserHasTriviaSite(def.parser);
|
|
5360
|
+
const saveTrivia = needsTriviaFrame ? `, ${st} = _ctx.captureTrivia, ${stl} = _ctx._cstTriviaLog${smk ? `, ${smk} = _ctx._triviaCaptureMask` : ""}` : "";
|
|
5361
|
+
const installTrivia = needsTriviaFrame ? `; _ctx.captureTrivia = true; _ctx._cstTriviaLog = ${innerTl}${smk ? `; _ctx._triviaCaptureMask = ${capTLv} && _ctx.build._parsemanTriviaKinds !== undefined ? _ctx.build._parsemanTriviaKinds(${JSON.stringify(def.type)}) : ${smk}` : ""}` : "";
|
|
5362
|
+
const restoreTrivia = needsTriviaFrame ? `; _ctx.captureTrivia = ${st}; _ctx._cstTriviaLog = ${stl}${smk ? `; _ctx._triviaCaptureMask = ${smk}` : ""}` : "";
|
|
5306
5363
|
const stmts = [
|
|
5364
|
+
profHoist,
|
|
5307
5365
|
allocStmt,
|
|
5308
|
-
`${i}const ${sc} = _ctx._cstChildren, ${sl} = _ctx._cstLeaves, ${sr} = _ctx._cstRawChildren
|
|
5309
|
-
`${i}_ctx._cstChildren = ${chV}; _ctx._cstLeaves = ${chV}; _ctx._cstRawChildren = ${rawV}
|
|
5366
|
+
`${i}const ${sc} = _ctx._cstChildren, ${sl} = _ctx._cstLeaves, ${sr} = _ctx._cstRawChildren${saveTrivia}${sf ? `, ${sf} = _ctx._fields` : ""}`,
|
|
5367
|
+
`${i}_ctx._cstChildren = ${chV}; _ctx._cstLeaves = ${chV}; _ctx._cstRawChildren = ${rawV}${installTrivia}${sf ? `; _ctx._fields = ${fieldsOn} ? [] : undefined` : ""}`
|
|
5310
5368
|
];
|
|
5311
5369
|
const { stmts: innerStmts, okVar, endVar } = emitFallible(def.parser, ctx, pos);
|
|
5312
5370
|
stmts.push(...innerStmts);
|
|
5313
5371
|
if (sf && fArr) {
|
|
5314
5372
|
stmts.push(`${i}const ${fArr} = _ctx._fields`);
|
|
5315
5373
|
}
|
|
5316
|
-
stmts.push(`${i}_ctx._cstChildren = ${sc}; _ctx._cstLeaves = ${sl}; _ctx._cstRawChildren = ${sr}
|
|
5374
|
+
stmts.push(`${i}_ctx._cstChildren = ${sc}; _ctx._cstLeaves = ${sl}; _ctx._cstRawChildren = ${sr}${restoreTrivia}${sf ? `; _ctx._fields = ${sf}` : ""}`);
|
|
5317
5375
|
stmts.push(...emitIfFail(ctx, `!${okVar}`, propagateFailBody(ctx)));
|
|
5376
|
+
stmts.push(
|
|
5377
|
+
`${i}if (_ctx._pmProfile) {`,
|
|
5378
|
+
`${i} _ctx._pmProfile.nodes++`,
|
|
5379
|
+
`${i} if (${profileCapture}) {`,
|
|
5380
|
+
`${i} _ctx._pmProfile.childSlots += ${chV}.length; _ctx._pmProfile.rawSlots += ${rawV}.length; _ctx._pmProfile.triviaSlots += ${tlV}.length${fArr ? `; _ctx._pmProfile.fieldSlots += ${fArr} ? ${fArr}.length : 0` : ""}`,
|
|
5381
|
+
`${i} }`,
|
|
5382
|
+
`${i}}`
|
|
5383
|
+
);
|
|
5318
5384
|
let stV = "undefined";
|
|
5319
5385
|
if (structural) {
|
|
5320
5386
|
stV = v(ctx, "_nst");
|
|
5321
5387
|
stmts.push(`${i}const ${stV} = ${capSTv} && _ctx.state !== undefined ? Object.assign({}, _ctx.state) : undefined`);
|
|
5322
5388
|
} else if (clonesState) {
|
|
5323
5389
|
stV = v(ctx, "_nst");
|
|
5324
|
-
stmts.push(`${i}const ${stV} = _ctx.state !== undefined ? Object.assign({}, _ctx.state) : undefined`);
|
|
5390
|
+
stmts.push(`${i}const ${stV} = !(${profileRecognizer} || ${profileCapture}) && _ctx.state !== undefined ? Object.assign({}, _ctx.state) : undefined`);
|
|
5325
5391
|
}
|
|
5326
5392
|
if (sf && fArr) {
|
|
5327
5393
|
const fe = v(ctx, "_fe");
|
|
@@ -5341,15 +5407,17 @@ ${i}const ${chV} = [], ${rawV} = [], ${tlV} = ${capTLv} ? [] : _EMPTY_TL` : capt
|
|
|
5341
5407
|
}
|
|
5342
5408
|
const ndV = v(ctx, "_nd");
|
|
5343
5409
|
const buildExpr = structural ? `{ _tag: 'node', type: ${JSON.stringify(def.type)}, span: { start: ${pos}, end: ${endVar} }, state: ${stV} ?? null, children: ${chV} }` : mkType ? emitInlineMkNodeExpr(mkType, chV, rawV, pos, endVar, tlV) : `${buildRef(ctx)}[${buildIdx}](${chV}, ${fObj}, { start: ${pos}, end: ${endVar} }, ${rawV}, ${tlV}, ${stV})`;
|
|
5344
|
-
const ndExpr = ctx.ns || structural ? `_ctx.build !== undefined ? _ctx.build(${JSON.stringify(def.type)}, ${chV}, ${fObj}, { start: ${pos}, end: ${endVar} }, ${rawV}, ${tlV}, ${stV}) : (${buildExpr})` : buildExpr;
|
|
5410
|
+
const ndExpr = ctx.ns || structural ? `_ctx.build !== undefined ? (_ctx._pmProfile?.phase === 'host' && _ctx._pmProfile.hostCalls++, _ctx.build(${JSON.stringify(def.type)}, ${chV}, ${fObj}, { start: ${pos}, end: ${endVar} }, ${rawV}, ${tlV}, ${stV})) : (${buildExpr})` : buildExpr;
|
|
5345
5411
|
const hostCollapseExpr = ctx.ns || structural ? `_ctx.build !== undefined && _ctx.build._parsemanCstCollapse !== undefined && ${chV}.length === 1 && ${rawV}.length === 1 && _ctx.build._parsemanCstCollapse(${JSON.stringify(def.type)}, ${chV}[0], ${chV}, ${rawV}) ? ${chV}[0] : (${ndExpr})` : ndExpr;
|
|
5346
5412
|
const unwrapExpr = `${chV}.length === 1 ? (${chV}[0] !== null && typeof ${chV}[0] === 'object' && ${chV}[0]._tag === 'leaf' ? ${chV}[0].value : ${chV}[0]) : (${ndExpr})`;
|
|
5347
5413
|
const collapseExpr = `${chV}.length === 1 ? ${chV}[0] : (${ndExpr})`;
|
|
5348
5414
|
const finalExpr = def.unwrap ? unwrapExpr : def.collapse ? collapseExpr : hostCollapseExpr;
|
|
5349
5415
|
stmts.push(
|
|
5350
|
-
`${i}const ${ndV} = ${finalExpr}`,
|
|
5351
|
-
`${i}if (${
|
|
5352
|
-
`${i}if (${
|
|
5416
|
+
`${i}const ${ndV} = (${profileRecognizer} || ${profileCapture}) ? undefined : (${finalExpr})`,
|
|
5417
|
+
`${i}if (!(${profileRecognizer})) {`,
|
|
5418
|
+
`${i} if (${sc}) ${sc}.push(${ndV})`,
|
|
5419
|
+
`${i} if (${sr}) ${sr}.push((typeof ${ndV} === 'object' && ${ndV} !== null && (${ndV}._tag === 'node' || ${ndV}._tag === 'leaf' || ${ndV}._tag === 'parseError')) ? ${ndV} : { _tag: 'leaf', value: typeof ${ndV} === 'string' ? ${ndV} : '', span: { start: ${pos}, end: ${endVar} } })`,
|
|
5420
|
+
`${i}}`
|
|
5353
5421
|
);
|
|
5354
5422
|
return { stmts, valueVar: ndV, endVar };
|
|
5355
5423
|
}
|
|
@@ -5635,7 +5703,7 @@ function emitDispatch(p, ctx, pos) {
|
|
|
5635
5703
|
ctx.indent = 1;
|
|
5636
5704
|
ctx.failLabel = "_pfail";
|
|
5637
5705
|
ctx.recordFail = true;
|
|
5638
|
-
const innerR =
|
|
5706
|
+
const innerR = emitDispatch(innerParser, ctx, "_pos");
|
|
5639
5707
|
ctx.indent = savedIndent;
|
|
5640
5708
|
ctx.failLabel = savedFailLabel;
|
|
5641
5709
|
ctx.recordFail = savedRecord;
|
|
@@ -6267,6 +6335,23 @@ function escapeClassChar(ch) {
|
|
|
6267
6335
|
return ch.replace(/[\\\]^-]/g, "\\$&");
|
|
6268
6336
|
}
|
|
6269
6337
|
|
|
6338
|
+
// src/combinators/withCtx.ts
|
|
6339
|
+
function withCtx(extra, combinator) {
|
|
6340
|
+
const meta = {
|
|
6341
|
+
firstSet: combinator._meta.firstSet,
|
|
6342
|
+
canMatchNewline: combinator._meta.canMatchNewline,
|
|
6343
|
+
isTrivia: false
|
|
6344
|
+
};
|
|
6345
|
+
return {
|
|
6346
|
+
_tag: "withCtx",
|
|
6347
|
+
_meta: meta,
|
|
6348
|
+
_def: { tag: "withCtx", extra, parser: combinator },
|
|
6349
|
+
parse(input, pos, ctx) {
|
|
6350
|
+
return combinator.parse(input, pos, { ...ctx, state: extra });
|
|
6351
|
+
}
|
|
6352
|
+
};
|
|
6353
|
+
}
|
|
6354
|
+
|
|
6270
6355
|
// src/compiler/ir-serialize.ts
|
|
6271
6356
|
function childrenOf2(def) {
|
|
6272
6357
|
switch (def.tag) {
|
|
@@ -6283,6 +6368,7 @@ function childrenOf2(def) {
|
|
|
6283
6368
|
case "field":
|
|
6284
6369
|
case "not":
|
|
6285
6370
|
case "node":
|
|
6371
|
+
case "withCtx":
|
|
6286
6372
|
case "expect":
|
|
6287
6373
|
return [def.parser];
|
|
6288
6374
|
case "grammar":
|
|
@@ -6298,7 +6384,6 @@ function childrenOf2(def) {
|
|
|
6298
6384
|
case "regex":
|
|
6299
6385
|
case "keywords":
|
|
6300
6386
|
case "guard":
|
|
6301
|
-
case "withCtx":
|
|
6302
6387
|
case "recover":
|
|
6303
6388
|
case "unknown":
|
|
6304
6389
|
return [];
|
|
@@ -6373,6 +6458,17 @@ function evalRuleMapIR(ir) {
|
|
|
6373
6458
|
c._def.gateSrcs = gateSrcs;
|
|
6374
6459
|
return c;
|
|
6375
6460
|
};
|
|
6461
|
+
const _wc = (src, inner) => {
|
|
6462
|
+
let extra;
|
|
6463
|
+
try {
|
|
6464
|
+
extra = (0, eval)(`(${src})`);
|
|
6465
|
+
} catch {
|
|
6466
|
+
extra = void 0;
|
|
6467
|
+
}
|
|
6468
|
+
const w = withCtx(extra, inner);
|
|
6469
|
+
w._def.extraSrc = src;
|
|
6470
|
+
return w;
|
|
6471
|
+
};
|
|
6376
6472
|
const fn = new Function(
|
|
6377
6473
|
"rules",
|
|
6378
6474
|
"ref",
|
|
@@ -6399,6 +6495,7 @@ function evalRuleMapIR(ir) {
|
|
|
6399
6495
|
"_tf",
|
|
6400
6496
|
"_nd",
|
|
6401
6497
|
"_gch",
|
|
6498
|
+
"_wc",
|
|
6402
6499
|
`return (${ir})`
|
|
6403
6500
|
);
|
|
6404
6501
|
const map = fn(
|
|
@@ -6426,7 +6523,8 @@ function evalRuleMapIR(ir) {
|
|
|
6426
6523
|
expect,
|
|
6427
6524
|
_tf,
|
|
6428
6525
|
_nd,
|
|
6429
|
-
_gch
|
|
6526
|
+
_gch,
|
|
6527
|
+
_wc
|
|
6430
6528
|
);
|
|
6431
6529
|
return Object.entries(map);
|
|
6432
6530
|
}
|
|
@@ -6482,7 +6580,7 @@ ${body}
|
|
|
6482
6580
|
this.analyze(target, active);
|
|
6483
6581
|
return;
|
|
6484
6582
|
}
|
|
6485
|
-
if (def.tag === "guard" || def.tag === "
|
|
6583
|
+
if (def.tag === "guard" || def.tag === "recover" || def.tag === "unknown") {
|
|
6486
6584
|
throw new Unserializable(`unsupported tag ${def.tag}`);
|
|
6487
6585
|
}
|
|
6488
6586
|
this.counts.set(c, (this.counts.get(c) ?? 0) + 1);
|
|
@@ -6591,8 +6689,11 @@ ${body}
|
|
|
6591
6689
|
const trivia2 = def.clearTrivia ? "null" : def.triviaParser ? kid(def.triviaParser) : "undefined";
|
|
6592
6690
|
return `parser({ trivia: ${trivia2}${def.trackLines ? ", trackLines: true" : ""} }, ${kid(def.parser)})`;
|
|
6593
6691
|
}
|
|
6692
|
+
case "withCtx": {
|
|
6693
|
+
if (def.extraSrc === void 0) throw new Unserializable("withCtx without extraSrc");
|
|
6694
|
+
return `_wc(${JSON.stringify(def.extraSrc)}, ${kid(def.parser)})`;
|
|
6695
|
+
}
|
|
6594
6696
|
case "guard":
|
|
6595
|
-
case "withCtx":
|
|
6596
6697
|
case "recover":
|
|
6597
6698
|
case "unknown":
|
|
6598
6699
|
throw new Unserializable(`unsupported tag ${def.tag}`);
|
|
@@ -6766,23 +6867,6 @@ function guard(predicate) {
|
|
|
6766
6867
|
};
|
|
6767
6868
|
}
|
|
6768
6869
|
|
|
6769
|
-
// src/combinators/withCtx.ts
|
|
6770
|
-
function withCtx(extra, combinator) {
|
|
6771
|
-
const meta = {
|
|
6772
|
-
firstSet: combinator._meta.firstSet,
|
|
6773
|
-
canMatchNewline: combinator._meta.canMatchNewline,
|
|
6774
|
-
isTrivia: false
|
|
6775
|
-
};
|
|
6776
|
-
return {
|
|
6777
|
-
_tag: "withCtx",
|
|
6778
|
-
_meta: meta,
|
|
6779
|
-
_def: { tag: "withCtx", extra, parser: combinator },
|
|
6780
|
-
parse(input, pos, ctx) {
|
|
6781
|
-
return combinator.parse(input, pos, { ...ctx, state: extra });
|
|
6782
|
-
}
|
|
6783
|
-
};
|
|
6784
|
-
}
|
|
6785
|
-
|
|
6786
6870
|
// src/combinators/completions.ts
|
|
6787
6871
|
function completionsAt(target, input, offset, options = {}) {
|
|
6788
6872
|
const probe = { offset, best: null };
|
|
@@ -7301,7 +7385,7 @@ function parseDoc(registry, rootRule, input, opts = {}) {
|
|
|
7301
7385
|
|
|
7302
7386
|
// src/functional/run.ts
|
|
7303
7387
|
var invoke = (r, input, pos, ctx) => typeof r === "function" ? r(input, pos, ctx) : r.parse(input, pos, ctx);
|
|
7304
|
-
function
|
|
7388
|
+
function runOnce(entry, input, options, phase, profileState) {
|
|
7305
7389
|
if (typeof entry !== "function" && typeof entry?.parse !== "function") {
|
|
7306
7390
|
throw new TypeError(
|
|
7307
7391
|
`run(): start production is ${entry === null ? "null" : typeof entry}, not a rule \u2014 the requested grammar rule does not exist (check the rule name).`
|
|
@@ -7309,11 +7393,12 @@ function run(entry, input, options = {}) {
|
|
|
7309
7393
|
}
|
|
7310
7394
|
const triviaLog = [];
|
|
7311
7395
|
const errors = [];
|
|
7396
|
+
const profile = profileState ?? (phase === void 0 ? void 0 : { phase, nodes: 0, childSlots: 0, rawSlots: 0, triviaSlots: 0, fieldSlots: 0, hostCalls: 0 });
|
|
7397
|
+
const skipGlobalSinks = phase === "recognizer" || phase === "capture";
|
|
7312
7398
|
const grammarTrivia = typeof entry !== "function" ? entry._meta.grammarTrivia : void 0;
|
|
7313
7399
|
const ctx = {
|
|
7314
7400
|
trackLines: false,
|
|
7315
|
-
_triviaLog: triviaLog,
|
|
7316
|
-
_errors: errors,
|
|
7401
|
+
...skipGlobalSinks ? { _pmProfile: profile } : { _triviaLog: triviaLog, _errors: errors, ...profile === void 0 ? {} : { _pmProfile: profile } },
|
|
7317
7402
|
build: options.build,
|
|
7318
7403
|
state: options.state,
|
|
7319
7404
|
...grammarTrivia !== void 0 ? { trivia: grammarTrivia, ...grammarTrivia._meta.triviaKindLabels ? { triviaKindLabels: grammarTrivia._meta.triviaKindLabels } : {} } : {},
|
|
@@ -7340,6 +7425,38 @@ function run(entry, input, options = {}) {
|
|
|
7340
7425
|
unconsumedFrom
|
|
7341
7426
|
};
|
|
7342
7427
|
}
|
|
7428
|
+
function clonePassState(state) {
|
|
7429
|
+
if (state === null || typeof state !== "object") return state;
|
|
7430
|
+
return Array.isArray(state) ? [...state] : { ...state };
|
|
7431
|
+
}
|
|
7432
|
+
function profilePass(entry, input, options, phase) {
|
|
7433
|
+
const state = { phase, nodes: 0, childSlots: 0, rawSlots: 0, triviaSlots: 0, fieldSlots: 0, hostCalls: 0 };
|
|
7434
|
+
const passOptions = options.state === void 0 ? options : { ...options, state: clonePassState(options.state) };
|
|
7435
|
+
const start = performance.now();
|
|
7436
|
+
const result = runOnce(entry, input, passOptions, phase, state);
|
|
7437
|
+
const { phase: _phase, ...counts } = state;
|
|
7438
|
+
return { result, profile: { ms: performance.now() - start, ...counts } };
|
|
7439
|
+
}
|
|
7440
|
+
function run(entry, input, options = {}) {
|
|
7441
|
+
if (!options.profile) return runOnce(entry, input, options);
|
|
7442
|
+
if (typeof entry !== "function") {
|
|
7443
|
+
throw new TypeError("run({ profile: true }) requires a compiled parser entry");
|
|
7444
|
+
}
|
|
7445
|
+
const recognizer = profilePass(entry, input, options, "recognizer");
|
|
7446
|
+
const capture = profilePass(entry, input, options, "capture");
|
|
7447
|
+
const host = profilePass(entry, input, options, "host");
|
|
7448
|
+
if (recognizer.result.ok !== host.result.ok || capture.result.ok !== host.result.ok || recognizer.result.unconsumedFrom !== host.result.unconsumedFrom || capture.result.unconsumedFrom !== host.result.unconsumedFrom) {
|
|
7449
|
+
throw new Error("run({ profile: true }) changed recognition; the grammar is not profile-safe");
|
|
7450
|
+
}
|
|
7451
|
+
return {
|
|
7452
|
+
...host.result,
|
|
7453
|
+
profile: {
|
|
7454
|
+
recognizer: recognizer.profile,
|
|
7455
|
+
structuralCapture: capture.profile,
|
|
7456
|
+
hostConstruction: host.profile
|
|
7457
|
+
}
|
|
7458
|
+
};
|
|
7459
|
+
}
|
|
7343
7460
|
|
|
7344
7461
|
// src/cst/trivia-index.ts
|
|
7345
7462
|
function merge(map, key, run2) {
|