parseman 0.50.6 → 0.51.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/analysis/choice-cost.d.ts.map +1 -1
- package/dist/analysis/commitment.d.ts.map +1 -1
- package/dist/analysis/diagnostics.js +214 -67
- package/dist/analysis/diagnostics.js.map +2 -2
- package/dist/analysis/duplication.d.ts.map +1 -1
- package/dist/analysis/gating.d.ts.map +1 -1
- package/dist/cli/index.js +220 -68
- package/dist/cli/index.js.map +2 -2
- package/dist/combinators/dispatch.d.ts.map +1 -1
- package/dist/combinators/first-set.d.ts +2 -26
- package/dist/combinators/first-set.d.ts.map +1 -1
- package/dist/combinators/scanTo.d.ts +23 -1
- package/dist/combinators/scanTo.d.ts.map +1 -1
- package/dist/compiler/fields.d.ts.map +1 -1
- package/dist/compiler/grammar-coverage-ids.d.ts.map +1 -1
- package/dist/compiler/ir-serialize.d.ts.map +1 -1
- package/dist/compiler/token-capability.js +40 -29
- package/dist/compiler/token-capability.js.map +1 -1
- package/dist/coverage.d.ts.map +1 -1
- package/dist/cst/reflection.d.ts.map +1 -1
- package/dist/index.js +241 -74
- package/dist/index.js.map +2 -2
- package/dist/plugin/index.js +228 -71
- package/dist/plugin/index.js.map +2 -2
- package/dist/spec/index.js +164 -48
- package/dist/spec/index.js.map +2 -2
- package/dist/table/assemble.d.ts.map +1 -1
- package/dist/table/emit.d.ts.map +1 -1
- package/dist/table/encode.d.ts.map +1 -1
- package/dist/table/exec.d.ts.map +1 -1
- package/dist/table/index.js +220 -68
- package/dist/table/index.js.map +2 -2
- package/dist/table/program.d.ts +2 -0
- package/dist/table/program.d.ts.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/package.json +1 -1
- package/src/analysis/choice-cost.ts +6 -1
- package/src/analysis/commitment.ts +10 -2
- package/src/analysis/duplication.ts +7 -2
- package/src/analysis/gating.ts +6 -1
- package/src/analysis/rebuild.ts +1 -1
- package/src/combinators/dispatch.ts +4 -1
- package/src/combinators/first-set.ts +58 -36
- package/src/combinators/scanTo.ts +163 -9
- package/src/compiler/fields.ts +8 -2
- package/src/compiler/grammar-coverage-ids.ts +6 -1
- package/src/compiler/ir-serialize.ts +7 -2
- package/src/compiler/token-alphabet.ts +1 -1
- package/src/coverage.ts +7 -1
- package/src/cst/reflection.ts +6 -1
- package/src/table/assemble.ts +11 -1
- package/src/table/emit.ts +4 -0
- package/src/table/encode.ts +16 -8
- package/src/table/exec.ts +7 -1
- package/src/table/program.ts +2 -0
- package/src/types.ts +1 -1
- package/src/version.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assemble.d.ts","sourceRoot":"","sources":["../../src/table/assemble.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgEG;AACH,OAAO,KAAK,EAAE,UAAU,EAAsB,YAAY,EAA0B,MAAM,aAAa,CAAA;AAyCvG;;;;;;;;;;;;;GAaG;AACH,OAAO,EAGL,KAAK,cAAc,EAAsB,KAAK,aAAa,EAC1C,KAAK,YAAY,EAAE,KAAK,SAAS,EACnD,MAAM,cAAc,CAAA;AA4ErB;;;;;;;;;;;;;GAaG;AACH,KAAK,KAAK,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,KAAK,OAAO,CAAA;AA+CvE;;;;;;;;GAQG;AACH,MAAM,MAAM,MAAM,GAAG;IACnB,6EAA6E;IAC7E,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB;;;;OAIG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAA;IACpC;;;;;OAKG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,SAAS,CAAA;IACpE,+EAA+E;IAC/E,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAA;IAC5B;;;;;;;;;;;;;;;;;OAiBG;IACH,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B;;;;;;;;;;;;;;;;;OAiBG;IACH,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B;;;;;;;;;;;;;;;;;;;OAmBG;IACH,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CACxB,CAAA;AAiBD,+CAA+C;AAC/C,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAExC;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB,qDAAqD;IACrD,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAA;IAChD,QAAQ,CAAC,GAAG,EAAE,MAAM,MAAM,CAAA;IAC1B;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,IAAI,CAAA;IAC3C,4EAA4E;IAC5E,QAAQ,CAAC,MAAM,EAAE,MAAM,IAAI,CAAA;IAC3B,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,SAAS,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAA;IAC9D;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IACrC;;;;;;;;OAQG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAA;CACzC,CAAA;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,QAAQ,
|
|
1
|
+
{"version":3,"file":"assemble.d.ts","sourceRoot":"","sources":["../../src/table/assemble.ts"],"names":[],"mappings":"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"}
|
package/dist/table/emit.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../src/table/emit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAG/D,OAAO,EAAU,KAAK,MAAM,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../src/table/emit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAG/D,OAAO,EAAU,KAAK,MAAM,EAAE,MAAM,eAAe,CAAA;AA2HnD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,EAAE,CAMhE;AAoFD,MAAM,MAAM,WAAW,GAAG;IACxB,oCAAoC;IACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB;;;;;;;OAOG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACvC;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACtC,8CAA8C;IAC9C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAC7B,CAAA;AAmED,wBAAgB,eAAe,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,GAAE,WAAgB,GAAG,MAAM,CAYlF;AAED,MAAM,MAAM,qBAAqB,GAAG,WAAW,GAAG;IAChD;;;;;;;;OAQG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,4EAA4E;IAC5E,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CACjC,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,GAAE,qBAA0B,GAAG,MAAM,CAWhG;AAED,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG;IAC5C;;;OAGG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAClD,CAAA;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,GAAE,iBAAsB,GAAG,MAAM,CA0B5F;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAExD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"encode.d.ts","sourceRoot":"","sources":["../../src/table/encode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,UAAU,EAAuB,MAAM,aAAa,CAAA;AAwBhF,OAAO,KAAK,EAAmE,YAAY,EAAc,MAAM,cAAc,CAAA;AAS7H,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAA;AA0B9E,8EAA8E;AAC9E,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,YAAY,GAAG,EAAE,MAAM,EAAqE;CAC7F;AAED,8EAA8E;AAC9E,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,GAAG,KAAK,CAAA;IACjC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;IAC7B;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAC3B;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,mBAAmB,CAAA;CACxC,CAAA;
|
|
1
|
+
{"version":3,"file":"encode.d.ts","sourceRoot":"","sources":["../../src/table/encode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,UAAU,EAAuB,MAAM,aAAa,CAAA;AAwBhF,OAAO,KAAK,EAAmE,YAAY,EAAc,MAAM,cAAc,CAAA;AAS7H,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAA;AA0B9E,8EAA8E;AAC9E,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,YAAY,GAAG,EAAE,MAAM,EAAqE;CAC7F;AAED,8EAA8E;AAC9E,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,GAAG,KAAK,CAAA;IACjC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;IAC7B;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAC3B;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,mBAAmB,CAAA;CACxC,CAAA;AA+tDD,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,EAC5C,QAAQ,GAAE,aAAkB,GAC3B,YAAY,CAEd;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,EAC5C,QAAQ,GAAE,aAAkB,GAC3B;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAA;CAAE,CA+BnD"}
|
package/dist/table/exec.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/table/exec.ts"],"names":[],"mappings":"AA6CA,OAAO,EAEL,KAAK,cAAc,EACF,KAAK,YAAY,EAAE,KAAK,SAAS,EACnD,MAAM,cAAc,CAAA;AA0BrB;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,EAAE;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,UAAU,CAAA;IAChB,+EAA+E;IAC/E,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAA;IAChC;;;;;;;;;;;OAWG;IACH,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,MAAM,CAAA;IACpB,sFAAsF;IACtF,eAAe,EAAE,MAAM,CAAA;IACvB,YAAY,EAAE,MAAM,CAAA;IACpB,qFAAqF;IACrF,YAAY,EAAE,MAAM,CAAA;CAC+H,CAAA;AAUrJ,wBAAgB,kBAAkB,IAAI,IAAI,CASzC;
|
|
1
|
+
{"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/table/exec.ts"],"names":[],"mappings":"AA6CA,OAAO,EAEL,KAAK,cAAc,EACF,KAAK,YAAY,EAAE,KAAK,SAAS,EACnD,MAAM,cAAc,CAAA;AA0BrB;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,EAAE;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,UAAU,CAAA;IAChB,+EAA+E;IAC/E,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAA;IAChC;;;;;;;;;;;OAWG;IACH,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,MAAM,CAAA;IACpB,sFAAsF;IACtF,eAAe,EAAE,MAAM,CAAA;IACvB,YAAY,EAAE,MAAM,CAAA;IACpB,qFAAqF;IACrF,YAAY,EAAE,MAAM,CAAA;CAC+H,CAAA;AAUrJ,wBAAgB,kBAAkB,IAAI,IAAI,CASzC;AAkkDD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,SAAS,CACvB,MAAM,EAAE,YAAY,GAAG,cAAc;AACrC;;;;;;;;GAQG;AACH,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAO,EACjC,gBAAgB,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAM,GACvD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CA8B3B"}
|
package/dist/table/index.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
// src/combinators/first-set.ts
|
|
2
|
-
function classifyFinalChoice(arms, resolve) {
|
|
2
|
+
function classifyFinalChoice(arms, resolve, activeTrivia) {
|
|
3
3
|
const firstSets = [];
|
|
4
4
|
const nullable2 = [];
|
|
5
5
|
let exclusive = true;
|
|
6
6
|
for (const arm of arms) {
|
|
7
7
|
const empty2 = matchesEmpty(arm, /* @__PURE__ */ new Set(), resolve);
|
|
8
8
|
nullable2.push(empty2);
|
|
9
|
-
firstSets.push(empty2 ? { kind: "any" } : firstSetOf(arm, /* @__PURE__ */ new Set(), resolve));
|
|
9
|
+
firstSets.push(empty2 ? { kind: "any" } : firstSetOf(arm, /* @__PURE__ */ new Set(), resolve, activeTrivia));
|
|
10
10
|
if (empty2) exclusive = false;
|
|
11
11
|
}
|
|
12
12
|
if (exclusive) {
|
|
@@ -67,7 +67,7 @@ function intersects(a, b) {
|
|
|
67
67
|
return false;
|
|
68
68
|
}
|
|
69
69
|
function fromChar(code) {
|
|
70
|
-
return
|
|
70
|
+
return fromRange(code, code);
|
|
71
71
|
}
|
|
72
72
|
function startsFirstSet(combinator, input, pos) {
|
|
73
73
|
const fs = combinator._meta.firstSet;
|
|
@@ -160,11 +160,10 @@ function matchesEmptyBody(p, seen, resolve) {
|
|
|
160
160
|
}
|
|
161
161
|
}
|
|
162
162
|
function isZeroWidthAssertion(p) {
|
|
163
|
-
|
|
164
|
-
return tag === "not" || tag === "adjacency";
|
|
163
|
+
return p._tag === "not" || p._tag === "adjacency";
|
|
165
164
|
}
|
|
166
165
|
function isPositiveLookahead(p) {
|
|
167
|
-
return p.
|
|
166
|
+
return p._tag === "peek";
|
|
168
167
|
}
|
|
169
168
|
function narrowBy(acc, constraint) {
|
|
170
169
|
if (constraint.kind === "any") return acc;
|
|
@@ -180,34 +179,42 @@ function narrowBy(acc, constraint) {
|
|
|
180
179
|
return ranges.length === 0 ? { kind: "empty" } : { kind: "ranges", ranges };
|
|
181
180
|
}
|
|
182
181
|
function applyAssertion(fs, assertion) {
|
|
183
|
-
|
|
184
|
-
if (fs.kind === "empty") return assertion;
|
|
185
|
-
return narrowBy(fs, assertion) ?? fs;
|
|
182
|
+
return assertion === null ? fs : fs.kind === "empty" ? assertion : narrowBy(fs, assertion);
|
|
186
183
|
}
|
|
187
|
-
function
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
184
|
+
function sequenceSet(parsers, fs, empties, trivia2) {
|
|
185
|
+
const afterBoundary = (i) => {
|
|
186
|
+
const rest = at(i);
|
|
187
|
+
return trivia2 ? union(rest, fs(trivia2)) : rest;
|
|
188
|
+
};
|
|
189
|
+
const at = (i) => {
|
|
190
|
+
const p = parsers[i];
|
|
191
191
|
if (isPositiveLookahead(p)) {
|
|
192
|
-
|
|
193
|
-
|
|
192
|
+
const constraint = fs(p);
|
|
193
|
+
return i + 1 === parsers.length ? constraint : applyAssertion(afterBoundary(i + 1), constraint);
|
|
194
194
|
}
|
|
195
|
-
if (
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
195
|
+
if (isZeroWidthAssertion(p)) {
|
|
196
|
+
return i + 1 === parsers.length ? empty() : afterBoundary(i + 1);
|
|
197
|
+
}
|
|
198
|
+
const first = fs(p);
|
|
199
|
+
if (!empties(p) || i + 1 === parsers.length) return first;
|
|
200
|
+
return union(first, afterBoundary(i + 1));
|
|
201
|
+
};
|
|
202
|
+
return at(0);
|
|
203
|
+
}
|
|
204
|
+
function sequenceFirstSet(parsers) {
|
|
205
|
+
return sequenceSet(parsers, (p) => p._meta.firstSet, matchesEmpty);
|
|
199
206
|
}
|
|
200
|
-
function firstSetOf(p, seen = /* @__PURE__ */ new Set(), resolve) {
|
|
207
|
+
function firstSetOf(p, seen = /* @__PURE__ */ new Set(), resolve, activeTrivia) {
|
|
201
208
|
if (seen.has(p)) return any();
|
|
202
209
|
seen.add(p);
|
|
203
210
|
try {
|
|
204
|
-
return firstSetBody(p, seen, resolve);
|
|
211
|
+
return firstSetBody(p, seen, resolve, activeTrivia);
|
|
205
212
|
} finally {
|
|
206
213
|
seen.delete(p);
|
|
207
214
|
}
|
|
208
215
|
}
|
|
209
|
-
function firstSetBody(p, seen, resolve) {
|
|
210
|
-
const fs = (c) => firstSetOf(c, seen, resolve);
|
|
216
|
+
function firstSetBody(p, seen, resolve, activeTrivia) {
|
|
217
|
+
const fs = (c) => firstSetOf(c, seen, resolve, activeTrivia);
|
|
211
218
|
const empties = (c) => matchesEmpty(c, /* @__PURE__ */ new Set(), resolve);
|
|
212
219
|
const d = p._def;
|
|
213
220
|
switch (d.tag) {
|
|
@@ -233,17 +240,7 @@ function firstSetBody(p, seen, resolve) {
|
|
|
233
240
|
return out;
|
|
234
241
|
}
|
|
235
242
|
case "sequence": {
|
|
236
|
-
|
|
237
|
-
let assertion = null;
|
|
238
|
-
for (const term of d.parsers) {
|
|
239
|
-
if (isPositiveLookahead(term)) {
|
|
240
|
-
assertion = narrowBy(assertion, fs(term));
|
|
241
|
-
continue;
|
|
242
|
-
}
|
|
243
|
-
if (!isZeroWidthAssertion(term)) out = union(out, fs(term));
|
|
244
|
-
if (!empties(term)) return applyAssertion(out, assertion);
|
|
245
|
-
}
|
|
246
|
-
return applyAssertion(out, assertion);
|
|
243
|
+
return sequenceSet(d.parsers, fs, empties, activeTrivia);
|
|
247
244
|
}
|
|
248
245
|
case "peek": {
|
|
249
246
|
const inner = d.parser;
|
|
@@ -258,12 +255,16 @@ function firstSetBody(p, seen, resolve) {
|
|
|
258
255
|
case "token":
|
|
259
256
|
case "leaf":
|
|
260
257
|
case "node":
|
|
261
|
-
case "grammar":
|
|
262
|
-
case "expect":
|
|
263
|
-
return fs(d.parser);
|
|
264
258
|
case "sepBy":
|
|
259
|
+
case "expect":
|
|
265
260
|
return fs(d.parser);
|
|
266
|
-
|
|
261
|
+
case "grammar":
|
|
262
|
+
return firstSetOf(
|
|
263
|
+
d.parser,
|
|
264
|
+
seen,
|
|
265
|
+
resolve,
|
|
266
|
+
d.clearTrivia ? null : d.triviaParser ?? activeTrivia
|
|
267
|
+
);
|
|
267
268
|
default:
|
|
268
269
|
return p._meta.firstSet;
|
|
269
270
|
}
|
|
@@ -3499,7 +3500,7 @@ function resolveScanSkip(explicitSkip, raw, ctx) {
|
|
|
3499
3500
|
out.push(...explicitSkip);
|
|
3500
3501
|
return out;
|
|
3501
3502
|
}
|
|
3502
|
-
function scanTo(sentinel, { skip, raw = false, orEOF = false } = {}) {
|
|
3503
|
+
function scanTo(sentinel, { skip, raw = false, orEOF = false, recoverAt, stopAt } = {}) {
|
|
3503
3504
|
const meta = {
|
|
3504
3505
|
firstSet: any(),
|
|
3505
3506
|
canMatchNewline: true,
|
|
@@ -3509,7 +3510,15 @@ function scanTo(sentinel, { skip, raw = false, orEOF = false } = {}) {
|
|
|
3509
3510
|
return {
|
|
3510
3511
|
_tag: "scanTo",
|
|
3511
3512
|
_meta: meta,
|
|
3512
|
-
_def: {
|
|
3513
|
+
_def: {
|
|
3514
|
+
tag: "scanTo",
|
|
3515
|
+
sentinel,
|
|
3516
|
+
skip: explicitSkip,
|
|
3517
|
+
raw,
|
|
3518
|
+
orEOF,
|
|
3519
|
+
...recoverAt === void 0 ? {} : { recoverAt },
|
|
3520
|
+
...stopAt === void 0 ? {} : { stopAt }
|
|
3521
|
+
},
|
|
3513
3522
|
parse(input, pos, ctx) {
|
|
3514
3523
|
let cur = pos;
|
|
3515
3524
|
const skip2 = resolveScanSkip(explicitSkip, raw, ctx);
|
|
@@ -3521,28 +3530,130 @@ function scanTo(sentinel, { skip, raw = false, orEOF = false } = {}) {
|
|
|
3521
3530
|
pushCstLeaf(ctx, leaf);
|
|
3522
3531
|
}
|
|
3523
3532
|
};
|
|
3524
|
-
|
|
3525
|
-
|
|
3526
|
-
|
|
3533
|
+
if (recoverAt === void 0 && stopAt === void 0) {
|
|
3534
|
+
while (cur < input.length) {
|
|
3535
|
+
const s = sentinel.parse(input, cur, probeCtx);
|
|
3536
|
+
if (s.ok) {
|
|
3537
|
+
if (ctx.trackLines) recordLineRangeFromContext(ctx, input, pos, cur);
|
|
3538
|
+
emit(cur);
|
|
3539
|
+
return { ok: true, value: input.slice(pos, cur), span: { start: pos, end: cur } };
|
|
3540
|
+
}
|
|
3541
|
+
let advanced = false;
|
|
3542
|
+
for (const skipper of skip2) {
|
|
3543
|
+
const r = skipper.parse(input, cur, probeCtx);
|
|
3544
|
+
if (r.ok && r.span.end > cur) {
|
|
3545
|
+
cur = r.span.end;
|
|
3546
|
+
advanced = true;
|
|
3547
|
+
break;
|
|
3548
|
+
}
|
|
3549
|
+
}
|
|
3550
|
+
if (!advanced) cur++;
|
|
3551
|
+
}
|
|
3552
|
+
if (orEOF) {
|
|
3527
3553
|
if (ctx.trackLines) recordLineRangeFromContext(ctx, input, pos, cur);
|
|
3528
3554
|
emit(cur);
|
|
3529
3555
|
return { ok: true, value: input.slice(pos, cur), span: { start: pos, end: cur } };
|
|
3530
3556
|
}
|
|
3557
|
+
const sentDef2 = sentinel._def;
|
|
3558
|
+
const expected2 = sentDef2.tag === "literal" ? [JSON.stringify(sentDef2.value)] : ["sentinel"];
|
|
3559
|
+
return { ok: false, expected: expected2, span: { start: pos, end: cur } };
|
|
3560
|
+
}
|
|
3561
|
+
let recovery = -1;
|
|
3562
|
+
let firstSentinel = -1;
|
|
3563
|
+
let sentinelCount = 0;
|
|
3564
|
+
let recoveryErrorCount = -1;
|
|
3565
|
+
let sentinelErrorCount = -1;
|
|
3566
|
+
const succeed = (end) => {
|
|
3567
|
+
if (ctx.trackLines) recordLineRangeFromContext(ctx, input, pos, end);
|
|
3568
|
+
emit(end);
|
|
3569
|
+
return { ok: true, value: input.slice(pos, end), span: { start: pos, end } };
|
|
3570
|
+
};
|
|
3571
|
+
const recoveredEnd = () => {
|
|
3572
|
+
const acceptSentinel = firstSentinel >= 0 && (sentinelCount & 1) === 1;
|
|
3573
|
+
const errors = ctx._errors;
|
|
3574
|
+
if (errors !== void 0) {
|
|
3575
|
+
const keep = acceptSentinel ? sentinelErrorCount : recoveryErrorCount;
|
|
3576
|
+
if (keep >= 0 && errors.length > keep) errors.length = keep;
|
|
3577
|
+
}
|
|
3578
|
+
return acceptSentinel ? firstSentinel : recovery;
|
|
3579
|
+
};
|
|
3580
|
+
while (cur < input.length) {
|
|
3581
|
+
const sentinelProbeErrorCount = ctx._errors?.length ?? -1;
|
|
3582
|
+
const s = sentinel.parse(input, cur, probeCtx);
|
|
3583
|
+
const sentinelProbeErrors = ctx._errors;
|
|
3584
|
+
if (sentinelProbeErrors !== void 0 && sentinelProbeErrorCount >= 0 && sentinelProbeErrors.length > sentinelProbeErrorCount) {
|
|
3585
|
+
sentinelProbeErrors.length = sentinelProbeErrorCount;
|
|
3586
|
+
}
|
|
3587
|
+
if (s.ok) {
|
|
3588
|
+
if (recovery < 0) return succeed(cur);
|
|
3589
|
+
if (s.span.end <= cur) {
|
|
3590
|
+
throw new TypeError("scanTo recovery requires a sentinel that consumes input");
|
|
3591
|
+
}
|
|
3592
|
+
if (firstSentinel < 0) {
|
|
3593
|
+
firstSentinel = cur;
|
|
3594
|
+
sentinelErrorCount = sentinelProbeErrorCount;
|
|
3595
|
+
}
|
|
3596
|
+
sentinelCount++;
|
|
3597
|
+
cur = s.span.end;
|
|
3598
|
+
continue;
|
|
3599
|
+
}
|
|
3600
|
+
if (stopAt !== void 0) {
|
|
3601
|
+
const errorCount = ctx._errors?.length ?? -1;
|
|
3602
|
+
const stop = stopAt.parse(input, cur, probeCtx);
|
|
3603
|
+
const errors = ctx._errors;
|
|
3604
|
+
if (errors !== void 0 && errorCount >= 0 && errors.length > errorCount) {
|
|
3605
|
+
errors.length = errorCount;
|
|
3606
|
+
}
|
|
3607
|
+
if (stop.ok) {
|
|
3608
|
+
if (recovery < 0) {
|
|
3609
|
+
recovery = cur;
|
|
3610
|
+
recoveryErrorCount = errorCount;
|
|
3611
|
+
}
|
|
3612
|
+
return succeed(recoveredEnd());
|
|
3613
|
+
}
|
|
3614
|
+
}
|
|
3531
3615
|
let advanced = false;
|
|
3532
3616
|
for (const skipper of skip2) {
|
|
3617
|
+
const errorCount = ctx._errors?.length ?? -1;
|
|
3533
3618
|
const r = skipper.parse(input, cur, probeCtx);
|
|
3534
3619
|
if (r.ok && r.span.end > cur) {
|
|
3535
3620
|
cur = r.span.end;
|
|
3536
3621
|
advanced = true;
|
|
3537
3622
|
break;
|
|
3538
3623
|
}
|
|
3624
|
+
const errors = ctx._errors;
|
|
3625
|
+
if (errors !== void 0 && errorCount >= 0 && errors.length > errorCount) {
|
|
3626
|
+
errors.length = errorCount;
|
|
3627
|
+
}
|
|
3539
3628
|
}
|
|
3540
|
-
if (
|
|
3629
|
+
if (advanced) continue;
|
|
3630
|
+
if (recoverAt !== void 0) {
|
|
3631
|
+
const errorCount = ctx._errors?.length ?? -1;
|
|
3632
|
+
const recover = recoverAt.parse(input, cur, probeCtx);
|
|
3633
|
+
const errors = ctx._errors;
|
|
3634
|
+
if (errors !== void 0 && errorCount >= 0 && errors.length > errorCount) {
|
|
3635
|
+
errors.length = errorCount;
|
|
3636
|
+
}
|
|
3637
|
+
if (recover.ok) {
|
|
3638
|
+
if (recover.span.end <= cur) {
|
|
3639
|
+
throw new TypeError("scanTo recoverAt must consume input");
|
|
3640
|
+
}
|
|
3641
|
+
if (recovery < 0) {
|
|
3642
|
+
recovery = cur;
|
|
3643
|
+
recoveryErrorCount = errorCount;
|
|
3644
|
+
}
|
|
3645
|
+
if (firstSentinel >= 0 && (sentinelCount & 1) === 1) {
|
|
3646
|
+
return succeed(recoveredEnd());
|
|
3647
|
+
}
|
|
3648
|
+
cur = recover.span.end;
|
|
3649
|
+
continue;
|
|
3650
|
+
}
|
|
3651
|
+
}
|
|
3652
|
+
cur++;
|
|
3541
3653
|
}
|
|
3654
|
+
if (recovery >= 0) return succeed(recoveredEnd());
|
|
3542
3655
|
if (orEOF) {
|
|
3543
|
-
|
|
3544
|
-
emit(cur);
|
|
3545
|
-
return { ok: true, value: input.slice(pos, cur), span: { start: pos, end: cur } };
|
|
3656
|
+
return succeed(cur);
|
|
3546
3657
|
}
|
|
3547
3658
|
const sentDef = sentinel._def;
|
|
3548
3659
|
const expected = sentDef.tag === "literal" ? [JSON.stringify(sentDef.value)] : ["sentinel"];
|
|
@@ -3919,7 +4030,7 @@ function parserHasOwnFields(p, seen = /* @__PURE__ */ new Set()) {
|
|
|
3919
4030
|
case "grammar":
|
|
3920
4031
|
return parserHasOwnFields(d.parser, seen) || (d.triviaParser ? parserHasOwnFields(d.triviaParser, seen) : false);
|
|
3921
4032
|
case "scanTo":
|
|
3922
|
-
return parserHasOwnFields(d.sentinel, seen) || d.skip.some((x) => parserHasOwnFields(x, seen));
|
|
4033
|
+
return parserHasOwnFields(d.sentinel, seen) || d.skip.some((x) => parserHasOwnFields(x, seen)) || d.recoverAt !== void 0 && parserHasOwnFields(d.recoverAt, seen) || d.stopAt !== void 0 && parserHasOwnFields(d.stopAt, seen);
|
|
3923
4034
|
case "recover":
|
|
3924
4035
|
return parserHasOwnFields(d.parser, seen) || parserHasOwnFields(d.sentinel, seen);
|
|
3925
4036
|
case "routed":
|
|
@@ -3973,7 +4084,7 @@ function parserUsesRouted(parser, seen = /* @__PURE__ */ new Set()) {
|
|
|
3973
4084
|
case "grammar":
|
|
3974
4085
|
return parserUsesRouted(def.parser, seen) || (def.triviaParser ? parserUsesRouted(def.triviaParser, seen) : false);
|
|
3975
4086
|
case "scanTo":
|
|
3976
|
-
return parserUsesRouted(def.sentinel, seen) || def.skip.some((entry) => parserUsesRouted(entry, seen));
|
|
4087
|
+
return parserUsesRouted(def.sentinel, seen) || def.skip.some((entry) => parserUsesRouted(entry, seen)) || def.recoverAt !== void 0 && parserUsesRouted(def.recoverAt, seen) || def.stopAt !== void 0 && parserUsesRouted(def.stopAt, seen);
|
|
3977
4088
|
case "recover":
|
|
3978
4089
|
return parserUsesRouted(def.parser, seen) || parserUsesRouted(def.sentinel, seen);
|
|
3979
4090
|
case "lazy":
|
|
@@ -8247,6 +8358,8 @@ function assemble(t, prog, cfg) {
|
|
|
8247
8358
|
for (const s of prog.scans ?? []) {
|
|
8248
8359
|
for (const r of s.skip) labelExtraIps.push(r[0]);
|
|
8249
8360
|
if (s.sentinel !== void 0) labelExtraIps.push(s.sentinel[0]);
|
|
8361
|
+
if (s.recoverAt !== void 0) labelExtraIps.push(s.recoverAt[0]);
|
|
8362
|
+
if (s.stopAt !== void 0) labelExtraIps.push(s.stopAt[0]);
|
|
8250
8363
|
}
|
|
8251
8364
|
for (const set of prog.scanSkip ?? []) for (const r of set) labelExtraIps.push(r[0]);
|
|
8252
8365
|
const closureLabels = computeSiteLabels(
|
|
@@ -10932,6 +11045,8 @@ function assemble(t, prog, cfg) {
|
|
|
10932
11045
|
for (const s of prog.scans ?? []) {
|
|
10933
11046
|
for (const r of s.skip) extraIps.push(r[0]);
|
|
10934
11047
|
if (s.sentinel !== void 0) extraIps.push(s.sentinel[0]);
|
|
11048
|
+
if (s.recoverAt !== void 0) extraIps.push(s.recoverAt[0]);
|
|
11049
|
+
if (s.stopAt !== void 0) extraIps.push(s.stopAt[0]);
|
|
10935
11050
|
}
|
|
10936
11051
|
for (const set of prog.scanSkip ?? []) for (const r of set) extraIps.push(r[0]);
|
|
10937
11052
|
const roots = [...Object.values(prog.rules), ...extraIps];
|
|
@@ -11143,7 +11258,13 @@ function assemble(t, prog, cfg) {
|
|
|
11143
11258
|
continue;
|
|
11144
11259
|
}
|
|
11145
11260
|
const sentDef = typeof s.sent === "string" ? { tag: "literal", value: s.sent, caseInsensitive: false } : void 0;
|
|
11146
|
-
scansArr.push(scanTo(subtreeComb(s.sentinel, sentDef), {
|
|
11261
|
+
scansArr.push(scanTo(subtreeComb(s.sentinel, sentDef), {
|
|
11262
|
+
skip,
|
|
11263
|
+
raw,
|
|
11264
|
+
orEOF: (s.flags & 2) !== 0,
|
|
11265
|
+
...s.recoverAt === void 0 ? {} : { recoverAt: subtreeComb(s.recoverAt) },
|
|
11266
|
+
...s.stopAt === void 0 ? {} : { stopAt: subtreeComb(s.stopAt) }
|
|
11267
|
+
}));
|
|
11147
11268
|
}
|
|
11148
11269
|
const scans = scansArr;
|
|
11149
11270
|
const scanSkip = (prog.scanSkip ?? []).map((set) => set.map((r) => subtreeComb(r)));
|
|
@@ -11336,7 +11457,12 @@ function childrenOf(d) {
|
|
|
11336
11457
|
case "recover":
|
|
11337
11458
|
return [d.parser, d.sentinel];
|
|
11338
11459
|
case "scanTo":
|
|
11339
|
-
return [
|
|
11460
|
+
return [
|
|
11461
|
+
d.sentinel,
|
|
11462
|
+
...d.skip,
|
|
11463
|
+
...d.recoverAt === void 0 ? [] : [d.recoverAt],
|
|
11464
|
+
...d.stopAt === void 0 ? [] : [d.stopAt]
|
|
11465
|
+
];
|
|
11340
11466
|
case "grammar":
|
|
11341
11467
|
return d.triviaParser ? [d.parser, d.triviaParser] : [d.parser];
|
|
11342
11468
|
case "routed":
|
|
@@ -11607,7 +11733,7 @@ function hasNodeDef(p, seen = /* @__PURE__ */ new Set()) {
|
|
|
11607
11733
|
case "sepBy":
|
|
11608
11734
|
return hasNodeDef(d.parser, seen) || hasNodeDef(d.separator, seen);
|
|
11609
11735
|
case "scanTo":
|
|
11610
|
-
return hasNodeDef(d.sentinel, seen) || d.skip.some((x) => hasNodeDef(x, seen));
|
|
11736
|
+
return hasNodeDef(d.sentinel, seen) || d.skip.some((x) => hasNodeDef(x, seen)) || d.recoverAt !== void 0 && hasNodeDef(d.recoverAt, seen) || d.stopAt !== void 0 && hasNodeDef(d.stopAt, seen);
|
|
11611
11737
|
case "recover":
|
|
11612
11738
|
return hasNodeDef(d.parser, seen) || hasNodeDef(d.sentinel, seen);
|
|
11613
11739
|
case "expect":
|
|
@@ -11656,7 +11782,7 @@ function hasDirectBuildDef(p, seen = /* @__PURE__ */ new Set()) {
|
|
|
11656
11782
|
case "sepBy":
|
|
11657
11783
|
return hasDirectBuildDef(d.parser, seen) || hasDirectBuildDef(d.separator, seen);
|
|
11658
11784
|
case "scanTo":
|
|
11659
|
-
return hasDirectBuildDef(d.sentinel, seen) || d.skip.some((x) => hasDirectBuildDef(x, seen));
|
|
11785
|
+
return hasDirectBuildDef(d.sentinel, seen) || d.skip.some((x) => hasDirectBuildDef(x, seen)) || d.recoverAt !== void 0 && hasDirectBuildDef(d.recoverAt, seen) || d.stopAt !== void 0 && hasDirectBuildDef(d.stopAt, seen);
|
|
11660
11786
|
case "recover":
|
|
11661
11787
|
return hasDirectBuildDef(d.parser, seen) || hasDirectBuildDef(d.sentinel, seen);
|
|
11662
11788
|
case "routed":
|
|
@@ -11693,7 +11819,7 @@ function mayCommitFailure(p, seen = /* @__PURE__ */ new Set(), resolve) {
|
|
|
11693
11819
|
case "withCtx":
|
|
11694
11820
|
return mayCommitFailure(d.parser, seen, resolve);
|
|
11695
11821
|
case "scanTo":
|
|
11696
|
-
return mayCommitFailure(d.sentinel, seen, resolve) || d.skip.some((x) => mayCommitFailure(x, seen, resolve));
|
|
11822
|
+
return mayCommitFailure(d.sentinel, seen, resolve) || d.skip.some((x) => mayCommitFailure(x, seen, resolve)) || d.recoverAt !== void 0 && mayCommitFailure(d.recoverAt, seen, resolve) || d.stopAt !== void 0 && mayCommitFailure(d.stopAt, seen, resolve);
|
|
11697
11823
|
case "lazy": {
|
|
11698
11824
|
try {
|
|
11699
11825
|
return mayCommitFailure(d.thunk(), seen, resolve);
|
|
@@ -12471,7 +12597,9 @@ var Encoder = class {
|
|
|
12471
12597
|
followClass(parsers, i) {
|
|
12472
12598
|
let fs = { kind: "empty" };
|
|
12473
12599
|
const rr = this.refResolver();
|
|
12474
|
-
for (let j = i + 1; j < parsers.length; j++)
|
|
12600
|
+
for (let j = i + 1; j < parsers.length; j++) {
|
|
12601
|
+
fs = union(fs, firstSetOf(parsers[j], /* @__PURE__ */ new Set(), rr, this.activeTrivia));
|
|
12602
|
+
}
|
|
12475
12603
|
return this.charClass(fs);
|
|
12476
12604
|
}
|
|
12477
12605
|
constant(v) {
|
|
@@ -12688,7 +12816,7 @@ var Encoder = class {
|
|
|
12688
12816
|
*/
|
|
12689
12817
|
subtree(c) {
|
|
12690
12818
|
const ip = this.node(c).ip;
|
|
12691
|
-
const fs = firstSetOf(c, /* @__PURE__ */ new Set(), this.refResolver());
|
|
12819
|
+
const fs = firstSetOf(c, /* @__PURE__ */ new Set(), this.refResolver(), this.activeTrivia);
|
|
12692
12820
|
return [ip, fs.kind === "empty" ? -2 : this.charClass(fs)];
|
|
12693
12821
|
}
|
|
12694
12822
|
/** Pool one scan spec. One per combinator: `node()` memoizes by identity. */
|
|
@@ -12834,6 +12962,8 @@ var Encoder = class {
|
|
|
12834
12962
|
flags: (d.raw ? 1 : 0) | (d.orEOF ? 2 : 0),
|
|
12835
12963
|
skip: d.skip.map((c) => this.subtree(c)),
|
|
12836
12964
|
sentinel: this.subtree(d.sentinel),
|
|
12965
|
+
...d.recoverAt === void 0 ? {} : { recoverAt: this.subtree(d.recoverAt) },
|
|
12966
|
+
...d.stopAt === void 0 ? {} : { stopAt: this.subtree(d.stopAt) },
|
|
12837
12967
|
sent: sentDef.tag === "literal" ? sentDef.value : null
|
|
12838
12968
|
}));
|
|
12839
12969
|
}
|
|
@@ -12907,12 +13037,12 @@ var Encoder = class {
|
|
|
12907
13037
|
return this.covWrap(gated, armCovIds?.[src], 1);
|
|
12908
13038
|
});
|
|
12909
13039
|
const rr = this.refResolver();
|
|
12910
|
-
const finalChoice = classifyFinalChoice(arms, rr);
|
|
13040
|
+
const finalChoice = classifyFinalChoice(arms, rr, this.activeTrivia);
|
|
12911
13041
|
const transactionalFirst = arms.map((arm, i) => {
|
|
12912
13042
|
if (!finalChoice.nullable[i]) return void 0;
|
|
12913
13043
|
const def = arm._def;
|
|
12914
13044
|
if (def.tag !== "attempt" || matchesEmpty(def.parser, /* @__PURE__ */ new Set(), rr)) return void 0;
|
|
12915
|
-
return firstSetOf(def.parser, /* @__PURE__ */ new Set(), rr);
|
|
13045
|
+
return firstSetOf(def.parser, /* @__PURE__ */ new Set(), rr, this.activeTrivia);
|
|
12916
13046
|
});
|
|
12917
13047
|
const gateFirst = finalChoice.firstSets.map((first, i) => transactionalFirst[i] ?? first);
|
|
12918
13048
|
const classes = gateFirst.map((first, i) => finalChoice.nullable[i] && transactionalFirst[i] === void 0 ? -1 : this.charClass(first));
|
|
@@ -12959,7 +13089,7 @@ var Encoder = class {
|
|
|
12959
13089
|
case "oneOrMore": {
|
|
12960
13090
|
const child = this.node(d.parser).ip;
|
|
12961
13091
|
const rr = this.refResolver();
|
|
12962
|
-
const itemClass = matchesEmpty(d.parser, /* @__PURE__ */ new Set(), rr) ? -1 : this.existingCharClass(firstSetOf(d.parser, /* @__PURE__ */ new Set(), rr));
|
|
13092
|
+
const itemClass = matchesEmpty(d.parser, /* @__PURE__ */ new Set(), rr) ? -1 : this.existingCharClass(firstSetOf(d.parser, /* @__PURE__ */ new Set(), rr, this.activeTrivia));
|
|
12963
13093
|
const op = d.valueUnused ? OP_REPV : OP_REP;
|
|
12964
13094
|
const min = d.tag === "many" ? 0 : d.min;
|
|
12965
13095
|
return this.rec ? this.emit(op, child, min, d.max ?? -1, -1, 0, this.expected(deriveExpected(d.parser)), itemClass) : this.emit(op, child, min, d.max ?? -1, -1, 0);
|
|
@@ -12977,7 +13107,7 @@ var Encoder = class {
|
|
|
12977
13107
|
sep,
|
|
12978
13108
|
flags,
|
|
12979
13109
|
this.expected(deriveExpected(d.parser)),
|
|
12980
|
-
this.charClass(firstSetOf(d.separator, /* @__PURE__ */ new Set(), this.refResolver()))
|
|
13110
|
+
this.charClass(firstSetOf(d.separator, /* @__PURE__ */ new Set(), this.refResolver(), this.activeTrivia))
|
|
12981
13111
|
);
|
|
12982
13112
|
}
|
|
12983
13113
|
return d.min >= 2 ? this.emit(OP_REP, child, d.min, d.max ?? -1, sep, flags, this.expected(deriveExpected(d.parser))) : this.emit(OP_REP, child, d.min, d.max ?? -1, sep, flags);
|
|
@@ -13032,7 +13162,7 @@ var Encoder = class {
|
|
|
13032
13162
|
d.tags === void 0 ? -1 : this.constant(d.tags)
|
|
13033
13163
|
);
|
|
13034
13164
|
if (matchesEmpty(d.parser)) return body;
|
|
13035
|
-
const fs = d.parser._def.tag === "lazy" ? firstSetOf(d.parser, /* @__PURE__ */ new Set(), this.refResolver()) : d.parser._meta.firstSet;
|
|
13165
|
+
const fs = d.parser._def.tag === "lazy" ? firstSetOf(d.parser, /* @__PURE__ */ new Set(), this.refResolver(), this.activeTrivia) : d.parser._meta.firstSet;
|
|
13036
13166
|
if (fs.kind === "any") return body;
|
|
13037
13167
|
const cls = this.charClass(fs);
|
|
13038
13168
|
if (cls < 0) return body;
|
|
@@ -13146,7 +13276,7 @@ var Encoder = class {
|
|
|
13146
13276
|
case "attempt": {
|
|
13147
13277
|
const inner = this.emit(OP_ATTEMPT, this.node(d.parser).ip);
|
|
13148
13278
|
if (!this.failureNeedsRollback(d.parser, void 0)) this.failureRollbackCleanSites.add(inner);
|
|
13149
|
-
const fs = d.parser._def.tag === "lazy" ? firstSetOf(d.parser, /* @__PURE__ */ new Set(), this.refResolver()) : d.parser._meta.firstSet;
|
|
13279
|
+
const fs = d.parser._def.tag === "lazy" ? firstSetOf(d.parser, /* @__PURE__ */ new Set(), this.refResolver(), this.activeTrivia) : d.parser._meta.firstSet;
|
|
13150
13280
|
if (fs.kind === "any" || matchesEmpty(d.parser)) return inner;
|
|
13151
13281
|
const cls = this.charClass(fs);
|
|
13152
13282
|
if (cls < 0) return inner;
|
|
@@ -13267,6 +13397,8 @@ var Encoder = class {
|
|
|
13267
13397
|
const refs = [];
|
|
13268
13398
|
for (const s of this.scans) {
|
|
13269
13399
|
if (s.sentinel !== void 0) refs.push(s.sentinel);
|
|
13400
|
+
if (s.recoverAt !== void 0) refs.push(s.recoverAt);
|
|
13401
|
+
if (s.stopAt !== void 0) refs.push(s.stopAt);
|
|
13270
13402
|
refs.push(...s.skip);
|
|
13271
13403
|
}
|
|
13272
13404
|
for (const set of this.scanSkipSets) refs.push(...set);
|
|
@@ -13286,7 +13418,9 @@ var Encoder = class {
|
|
|
13286
13418
|
this.scans = this.scans.map((s) => ({
|
|
13287
13419
|
...s,
|
|
13288
13420
|
skip: s.skip.map(res),
|
|
13289
|
-
...s.sentinel === void 0 ? {} : { sentinel: res(s.sentinel) }
|
|
13421
|
+
...s.sentinel === void 0 ? {} : { sentinel: res(s.sentinel) },
|
|
13422
|
+
...s.recoverAt === void 0 ? {} : { recoverAt: res(s.recoverAt) },
|
|
13423
|
+
...s.stopAt === void 0 ? {} : { stopAt: res(s.stopAt) }
|
|
13290
13424
|
}));
|
|
13291
13425
|
this.scanSkipSets = this.scanSkipSets.map((set) => set.map(res));
|
|
13292
13426
|
}
|
|
@@ -13414,6 +13548,8 @@ function emitRef(r) {
|
|
|
13414
13548
|
function emitScanSpec(s) {
|
|
13415
13549
|
const parts = [`kind:${s.kind}`, `flags:${s.flags}`, `skip:[${s.skip.map(emitRef).join(",")}]`];
|
|
13416
13550
|
if (s.sentinel !== void 0) parts.push(`sentinel:${emitRef(s.sentinel)}`);
|
|
13551
|
+
if (s.recoverAt !== void 0) parts.push(`recoverAt:${emitRef(s.recoverAt)}`);
|
|
13552
|
+
if (s.stopAt !== void 0) parts.push(`stopAt:${emitRef(s.stopAt)}`);
|
|
13417
13553
|
if (s.sent !== void 0) parts.push(`sent:${s.sent === null ? "null" : jsString(s.sent)}`);
|
|
13418
13554
|
if (s.open !== void 0) parts.push(`open:${jsString(s.open)}`);
|
|
13419
13555
|
if (s.close !== void 0) parts.push(`close:${jsString(s.close)}`);
|
|
@@ -13440,6 +13576,8 @@ function emitAssemblies(prog, cfgs) {
|
|
|
13440
13576
|
for (const s of prog.scans ?? []) {
|
|
13441
13577
|
for (const r of s.skip) extraIps.push(r[0]);
|
|
13442
13578
|
if (s.sentinel !== void 0) extraIps.push(s.sentinel[0]);
|
|
13579
|
+
if (s.recoverAt !== void 0) extraIps.push(s.recoverAt[0]);
|
|
13580
|
+
if (s.stopAt !== void 0) extraIps.push(s.stopAt[0]);
|
|
13443
13581
|
}
|
|
13444
13582
|
for (const set of prog.scanSkip ?? []) for (const r of set) extraIps.push(r[0]);
|
|
13445
13583
|
const out = [];
|
|
@@ -13608,7 +13746,12 @@ function children(def, winners) {
|
|
|
13608
13746
|
case "sepBy":
|
|
13609
13747
|
return [def.parser, def.separator];
|
|
13610
13748
|
case "scanTo":
|
|
13611
|
-
return [
|
|
13749
|
+
return [
|
|
13750
|
+
def.sentinel,
|
|
13751
|
+
...def.skip,
|
|
13752
|
+
...def.recoverAt === void 0 ? [] : [def.recoverAt],
|
|
13753
|
+
...def.stopAt === void 0 ? [] : [def.stopAt]
|
|
13754
|
+
];
|
|
13612
13755
|
case "lazy": {
|
|
13613
13756
|
let resolved;
|
|
13614
13757
|
try {
|
|
@@ -13721,7 +13864,7 @@ function payloadKey(p, d) {
|
|
|
13721
13864
|
case "expect":
|
|
13722
13865
|
return `expect\0${d.label ?? ""}\0${d.expected.join("")}`;
|
|
13723
13866
|
case "scanTo":
|
|
13724
|
-
return `scanTo\0${d.raw}\0${d.orEOF}`;
|
|
13867
|
+
return `scanTo\0${d.raw}\0${d.orEOF}\0${d.recoverAt !== void 0}\0${d.stopAt !== void 0}`;
|
|
13725
13868
|
case "guard":
|
|
13726
13869
|
return `guard\0${fnKey(d.predSrc, d.predicate)}`;
|
|
13727
13870
|
case "adjacency":
|
|
@@ -13836,8 +13979,12 @@ function segment(d, index) {
|
|
|
13836
13979
|
return index === 0 ? "sepBy.item" : "sepBy.sep";
|
|
13837
13980
|
case "recover":
|
|
13838
13981
|
return index === 0 ? "recover.body" : "recover.sentinel";
|
|
13839
|
-
case "scanTo":
|
|
13840
|
-
|
|
13982
|
+
case "scanTo": {
|
|
13983
|
+
if (index === 0) return "scanTo.sentinel";
|
|
13984
|
+
if (index <= d.skip.length) return `scanTo.skip[${index - 1}]`;
|
|
13985
|
+
if (d.recoverAt !== void 0 && index === d.skip.length + 1) return "scanTo.recoverAt";
|
|
13986
|
+
return "scanTo.stopAt";
|
|
13987
|
+
}
|
|
13841
13988
|
default:
|
|
13842
13989
|
return d.tag;
|
|
13843
13990
|
}
|
|
@@ -15097,7 +15244,12 @@ function childrenOf2(def) {
|
|
|
15097
15244
|
case "sepBy":
|
|
15098
15245
|
return [def.parser, def.separator];
|
|
15099
15246
|
case "scanTo":
|
|
15100
|
-
return [
|
|
15247
|
+
return [
|
|
15248
|
+
def.sentinel,
|
|
15249
|
+
...def.skip,
|
|
15250
|
+
...def.recoverAt === void 0 ? [] : [def.recoverAt],
|
|
15251
|
+
...def.stopAt === void 0 ? [] : [def.stopAt]
|
|
15252
|
+
];
|
|
15101
15253
|
case "routed":
|
|
15102
15254
|
return def.fallback ? [def.fallback] : [];
|
|
15103
15255
|
case "literal":
|