@thomasfosterau/effect-parse 0.1.0 → 0.2.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/README.md +247 -230
- package/dist/Ascii.d.ts +32 -53
- package/dist/Ascii.d.ts.map +1 -1
- package/dist/Ascii.js +576 -571
- package/dist/Ascii.js.map +1 -1
- package/dist/Binary.d.ts +6 -29
- package/dist/Binary.d.ts.map +1 -1
- package/dist/Binary.js +129 -116
- package/dist/Binary.js.map +1 -1
- package/dist/Bits.d.ts +4 -2
- package/dist/Bits.d.ts.map +1 -1
- package/dist/Bits.js +121 -123
- package/dist/Bits.js.map +1 -1
- package/dist/Compiler.d.ts +39 -0
- package/dist/Compiler.d.ts.map +1 -0
- package/dist/Compiler.js +48 -0
- package/dist/Compiler.js.map +1 -0
- package/dist/Encoding.d.ts +29 -46
- package/dist/Encoding.d.ts.map +1 -1
- package/dist/Encoding.js +76 -75
- package/dist/Encoding.js.map +1 -1
- package/dist/Expression.d.ts +15 -49
- package/dist/Expression.d.ts.map +1 -1
- package/dist/Expression.js +143 -131
- package/dist/Expression.js.map +1 -1
- package/dist/Input.d.ts +206 -177
- package/dist/Input.d.ts.map +1 -1
- package/dist/Input.js +317 -299
- package/dist/Input.js.map +1 -1
- package/dist/Nom.d.ts +44 -84
- package/dist/Nom.d.ts.map +1 -1
- package/dist/Nom.js +423 -453
- package/dist/Nom.js.map +1 -1
- package/dist/ParseError.d.ts +54 -49
- package/dist/ParseError.d.ts.map +1 -1
- package/dist/ParseError.js +233 -275
- package/dist/ParseError.js.map +1 -1
- package/dist/Parser.d.ts +345 -313
- package/dist/Parser.d.ts.map +1 -1
- package/dist/Parser.js +2010 -1802
- package/dist/Parser.js.map +1 -1
- package/dist/ParserSchema.d.ts +8 -7
- package/dist/ParserSchema.d.ts.map +1 -1
- package/dist/ParserSchema.js +49 -49
- package/dist/ParserSchema.js.map +1 -1
- package/dist/ParserStream.d.ts +26 -20
- package/dist/ParserStream.d.ts.map +1 -1
- package/dist/ParserStream.js +267 -255
- package/dist/ParserStream.js.map +1 -1
- package/dist/Syntax.d.ts +401 -0
- package/dist/Syntax.d.ts.map +1 -0
- package/dist/Syntax.js +717 -0
- package/dist/Syntax.js.map +1 -0
- package/dist/Text.d.ts +98 -134
- package/dist/Text.d.ts.map +1 -1
- package/dist/Text.js +534 -496
- package/dist/Text.js.map +1 -1
- package/dist/Token.d.ts +60 -42
- package/dist/Token.d.ts.map +1 -1
- package/dist/Token.js +331 -265
- package/dist/Token.js.map +1 -1
- package/dist/index.d.ts +16 -17
- package/dist/index.js +16 -17
- package/dist/internal/compiler/closure.d.ts +14 -16
- package/dist/internal/compiler/closure.d.ts.map +1 -1
- package/dist/internal/compiler/closure.js +1458 -1637
- package/dist/internal/compiler/closure.js.map +1 -1
- package/dist/internal/compiler/entries.d.ts +11 -11
- package/dist/internal/compiler/entries.d.ts.map +1 -1
- package/dist/internal/compiler/entries.js +36 -26
- package/dist/internal/compiler/entries.js.map +1 -1
- package/dist/internal/compiler/first.d.ts +19 -19
- package/dist/internal/compiler/first.d.ts.map +1 -1
- package/dist/internal/compiler/first.js +251 -227
- package/dist/internal/compiler/first.js.map +1 -1
- package/dist/internal/compiler/jit.d.ts +6 -17
- package/dist/internal/compiler/jit.d.ts.map +1 -1
- package/dist/internal/compiler/jit.js +860 -988
- package/dist/internal/compiler/jit.js.map +1 -1
- package/dist/internal/compiler/registry.d.ts +20 -21
- package/dist/internal/compiler/registry.d.ts.map +1 -1
- package/dist/internal/compiler/registry.js +21 -41
- package/dist/internal/compiler/registry.js.map +1 -1
- package/dist/internal/compiler/sets.d.ts +9 -13
- package/dist/internal/compiler/sets.d.ts.map +1 -1
- package/dist/internal/compiler/sets.js +76 -73
- package/dist/internal/compiler/sets.js.map +1 -1
- package/dist/internal/entries.d.ts +3 -3
- package/dist/internal/entries.d.ts.map +1 -1
- package/dist/internal/entries.js +38 -30
- package/dist/internal/entries.js.map +1 -1
- package/dist/internal/node.d.ts +177 -173
- package/dist/internal/node.d.ts.map +1 -1
- package/dist/internal/node.js +77 -66
- package/dist/internal/node.js.map +1 -1
- package/dist/internal/numbers.d.ts +7 -8
- package/dist/internal/numbers.d.ts.map +1 -1
- package/dist/internal/numbers.js +246 -276
- package/dist/internal/numbers.js.map +1 -1
- package/dist/internal/resume.d.ts +6 -24
- package/dist/internal/resume.d.ts.map +1 -1
- package/dist/internal/resume.js +30 -29
- package/dist/internal/resume.js.map +1 -1
- package/dist/internal/run.d.ts +15 -0
- package/dist/internal/run.d.ts.map +1 -0
- package/dist/internal/run.js +36 -0
- package/dist/internal/run.js.map +1 -0
- package/dist/internal/stack.d.ts +16 -0
- package/dist/internal/stack.d.ts.map +1 -0
- package/dist/internal/stack.js +26 -0
- package/dist/internal/stack.js.map +1 -0
- package/dist/internal/syntax.d.ts +146 -0
- package/dist/internal/syntax.d.ts.map +1 -0
- package/dist/internal/syntax.js +305 -0
- package/dist/internal/syntax.js.map +1 -0
- package/dist/internal/text.d.ts +10 -2
- package/dist/internal/text.d.ts.map +1 -1
- package/dist/internal/text.js +295 -345
- package/dist/internal/text.js.map +1 -1
- package/dist/internal/tokens.d.ts +25 -30
- package/dist/internal/tokens.d.ts.map +1 -1
- package/dist/internal/tokens.js +369 -363
- package/dist/internal/tokens.js.map +1 -1
- package/package.json +42 -28
- package/src/Ascii.ts +278 -187
- package/src/Binary.ts +150 -44
- package/src/Bits.ts +6 -3
- package/src/Compiler.ts +98 -0
- package/src/Expression.ts +10 -5
- package/src/Input.ts +106 -28
- package/src/Nom.ts +4 -3
- package/src/ParseError.ts +48 -51
- package/src/Parser.ts +1163 -795
- package/src/ParserStream.ts +104 -80
- package/src/Syntax.ts +900 -0
- package/src/Text.ts +272 -187
- package/src/Token.ts +180 -87
- package/src/index.ts +2 -0
- package/src/internal/compiler/closure.ts +121 -88
- package/src/internal/compiler/entries.ts +21 -8
- package/src/internal/compiler/first.ts +17 -15
- package/src/internal/compiler/jit.ts +360 -157
- package/src/internal/compiler/registry.ts +12 -33
- package/src/internal/compiler/sets.ts +17 -11
- package/src/internal/entries.ts +4 -2
- package/src/internal/node.ts +51 -37
- package/src/internal/numbers.ts +22 -20
- package/src/internal/resume.ts +8 -4
- package/src/internal/run.ts +41 -0
- package/src/internal/stack.ts +36 -0
- package/src/internal/syntax.ts +421 -0
- package/src/internal/text.ts +32 -25
- package/src/internal/tokens.ts +96 -51
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"numbers.js","sourceRoot":"","sources":["../../src/internal/numbers.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"numbers.js","names":[],"sources":["../../src/internal/numbers.ts"],"sourcesContent":["/**\n * Number conversions shared by the `Ascii` and `Text` parsers and the\n * compilers.\n */\nimport * as Predicate from \"effect/Predicate\"\nimport type { Input } from \"../Input.js\"\nimport { Fail } from \"../Input.js\"\nimport { latin1 } from \"./text.js\"\n\n/** The text of an input slice: as is for a string, Latin-1 for bytes, joined for tokens. */\nexport const toText = (s: Input): string =>\n Predicate.isString(s) ? s : s instanceof Uint8Array ? latin1.text(s, 0, s.length) : s.join(\"\")\n\n/** The value of the text matched by `Ascii.float` and `Text.float`. */\nexport const toFloat = (s: Input): number => {\n if (Predicate.isString(s)) {\n // Plain decimal notation (as opposed to `inf` or `nan`) ends in a digit or \".\"\n const last = s.charCodeAt(s.length - 1)\n if ((last >= 48 && last <= 57) || last === 46) return Number(s)\n }\n const t = toText(s).toLowerCase()\n const negative = t.startsWith(\"-\")\n const body = t.startsWith(\"-\") || t.startsWith(\"+\") ? t.slice(1) : t\n if (body === \"nan\") return NaN\n if (body.startsWith(\"inf\")) return negative ? -Infinity : Infinity\n return Number(t)\n}\n\n/**\n * The parsers that `Ascii.float` and `Text.float` map with `toFloat`: the\n * compilers replace them by {@link scanFloatString} and\n * {@link scanFloatBytes} when the text is in decimal notation.\n */\nexport const floatTexts = /*#__PURE__*/ new WeakSet<object>()\n\n/** Adds a parser to {@link floatTexts}. */\nexport const floatText = <P extends object>(p: P): P => {\n floatTexts.add(p)\n return p\n}\n\n/** The powers of ten that doubles represent exactly. */\nconst exact = /*#__PURE__*/ Array.from({ length: 23 }, (_, i) => Number(`1e${i}`))\n\n/**\n * Where the latest scan ended, when it succeeded, and the furthest offset it\n * read (when it succeeded or failed): streaming builds re-run the parser\n * when that is near the end of a partial input.\n */\nexport const floatScan = { end: 0, read: 0 }\n\nconst isDigit = (c: number): boolean => c >= 48 && c <= 57\n\n// Exact products of doubles (Dekker), without allocating: `a * b` is\n// `productHi + productLo` exactly, barring overflow and underflow\nconst Split = 134217729 // 2^27 + 1\nlet productHi = 0\nlet productLo = 0\nconst twoProduct = (a: number, b: number): void => {\n const p = a * b\n let t = Split * a\n const ah = t - (t - a)\n const al = a - ah\n t = Split * b\n const bh = t - (t - b)\n const bl = b - bh\n productHi = p\n productLo = ah * bh - p + ah * bl + al * bh + al * bl\n}\n\n/** 2^-96: a bound on the relative error of {@link decimal}'s 19-digit path. */\nconst Error19 = 1 / 2 ** 96\n\n/**\n * The double nearest to `±(high * 10^low digits + low) * 10^e10`, where\n * `high` holds the first 15 significant digits, and `low` the next `lowDigits`\n * (at most 4). Returns `undefined` when this can't tell it apart from the\n * neighbouring doubles, for the caller to use `Number`.\n *\n * Up to 15 digits, the digits and a power of ten up to 10^22 are exact\n * doubles, so one multiplication or division rounds correctly (Clinger's\n * fast path). Up to 19 digits, the digits are an exact sum of two doubles,\n * and multiplying or dividing that by an exact power of ten gives the value\n * to within a relative 2^-96 (double-double arithmetic). It is then rounded\n * once, and kept only if the bounds of that error round to the same double:\n * this is never the case for an exact tie, so ties go to `Number` too.\n */\nconst decimal = (negative: boolean, high: number, low: number, lowDigits: number, e10: number): number | undefined => {\n let v: number\n if (lowDigits === 0) {\n if (e10 > 22 || e10 < -22) return undefined\n v = e10 === 0 ? high : e10 > 0 ? high * exact[e10] : high / exact[-e10]\n } else {\n if (e10 > 22 || e10 < -22) return undefined\n // The digits: high * 10^lowDigits + low = wh + wl, exactly\n twoProduct(high, exact[lowDigits])\n const wh = productHi + low\n const wl = productLo + (low - (wh - productHi))\n let xh: number\n let xl: number\n if (e10 >= 0) {\n const p = exact[e10]\n twoProduct(wh, p)\n xh = productHi\n xl = productLo + wl * p\n } else {\n const p = exact[-e10]\n xh = wh / p\n twoProduct(xh, p)\n xl = (wh - productHi - productLo + wl) / p\n }\n v = xh + xl\n const error = (xh < 0 ? -xh : xh) * Error19\n if (xh + (xl + error) !== v || xh + (xl - error) !== v) return undefined\n }\n return negative ? -v : v\n}\n\n/**\n * Matches and converts what `Ascii.float` matches at `i`, when it is in\n * decimal notation: an optional sign, then digits or \".\" (the other forms,\n * `nan` and `inf`, start with a letter). Returns the value, setting\n * `floatScan.end`; `Fail` if the float parser fails there (always with\n * `Backtrack`); or `undefined` if the text does not start like a decimal\n * number, for the caller to run the parser.\n *\n * Numbers with up to 19 significant digits and a decimal exponent up to 22\n * are converted by {@link decimal}, the rest by `Number`, so the value is\n * always what `Number` gives for the text.\n */\nexport const scanFloatString = (s: string, i: number, end: number): number | Fail | undefined => {\n const start = i\n let c = i < end ? s.charCodeAt(i) : -1\n if (c === 45 || c === 43) {\n c = i + 1 < end ? s.charCodeAt(i + 1) : -1\n if (!isDigit(c) && c !== 46) return undefined\n i++\n } else if (!isDigit(c) && c !== 46) {\n return undefined\n }\n // The first 15 significant digits, the next 4, how many there are in all,\n // and the decimal exponent of the last one kept\n let high = 0\n let low = 0\n let digits = 0\n let e10 = 0\n if (c !== 46) {\n do {\n if (digits < 15) {\n if (high !== 0 || c !== 48) {\n high = high * 10 + (c - 48)\n digits++\n }\n } else {\n if (digits < 19) low = low * 10 + (c - 48)\n else e10++\n digits++\n }\n c = ++i < end ? s.charCodeAt(i) : -1\n } while (isDigit(c))\n if (c === 46) c = ++i < end ? s.charCodeAt(i) : -1\n } else {\n // \".\" must be followed by a digit\n c = ++i < end ? s.charCodeAt(i) : -1\n if (!isDigit(c)) {\n floatScan.read = i\n return Fail\n }\n }\n while (isDigit(c)) {\n if (digits < 15) {\n if (high !== 0 || c !== 48) {\n high = high * 10 + (c - 48)\n digits++\n }\n e10--\n } else {\n if (digits < 19) {\n low = low * 10 + (c - 48)\n e10--\n }\n digits++\n }\n c = ++i < end ? s.charCodeAt(i) : -1\n }\n let read = i\n if (c === 101 || c === 69) {\n // The exponent is optional: without digits, it is not consumed\n let j = i + 1\n c = j < end ? s.charCodeAt(j) : -1\n const negative = c === 45\n if (negative || c === 43) c = ++j < end ? s.charCodeAt(j) : -1\n if (isDigit(c)) {\n let e = 0\n do {\n // Past this, the number can only overflow or underflow\n if (e < 1e6) e = e * 10 + (c - 48)\n c = ++j < end ? s.charCodeAt(j) : -1\n } while (isDigit(c))\n e10 += negative ? -e : e\n i = j\n }\n read = j\n }\n floatScan.end = i\n floatScan.read = read\n const negative = s.charCodeAt(start) === 45\n if (high === 0) return negative ? -0 : 0\n const v = digits > 19 ? undefined : decimal(negative, high, low, digits > 15 ? digits - 15 : 0, e10)\n return v === undefined ? Number(s.slice(start, i)) : v\n}\n\n/** {@link scanFloatString} on bytes, or the units of an ASCII compatible encoding. */\nexport const scanFloatBytes = (b: Uint8Array, i: number, end: number): number | Fail | undefined => {\n const start = i\n let c = i < end ? b[i] : -1\n if (c === 45 || c === 43) {\n c = i + 1 < end ? b[i + 1] : -1\n if (!isDigit(c) && c !== 46) return undefined\n i++\n } else if (!isDigit(c) && c !== 46) {\n return undefined\n }\n let high = 0\n let low = 0\n let digits = 0\n let e10 = 0\n if (c !== 46) {\n do {\n if (digits < 15) {\n if (high !== 0 || c !== 48) {\n high = high * 10 + (c - 48)\n digits++\n }\n } else {\n if (digits < 19) low = low * 10 + (c - 48)\n else e10++\n digits++\n }\n c = ++i < end ? b[i] : -1\n } while (isDigit(c))\n if (c === 46) c = ++i < end ? b[i] : -1\n } else {\n c = ++i < end ? b[i] : -1\n if (!isDigit(c)) {\n floatScan.read = i\n return Fail\n }\n }\n while (isDigit(c)) {\n if (digits < 15) {\n if (high !== 0 || c !== 48) {\n high = high * 10 + (c - 48)\n digits++\n }\n e10--\n } else {\n if (digits < 19) {\n low = low * 10 + (c - 48)\n e10--\n }\n digits++\n }\n c = ++i < end ? b[i] : -1\n }\n let read = i\n if (c === 101 || c === 69) {\n let j = i + 1\n c = j < end ? b[j] : -1\n const negative = c === 45\n if (negative || c === 43) c = ++j < end ? b[j] : -1\n if (isDigit(c)) {\n let e = 0\n do {\n if (e < 1e6) e = e * 10 + (c - 48)\n c = ++j < end ? b[j] : -1\n } while (isDigit(c))\n e10 += negative ? -e : e\n i = j\n }\n read = j\n }\n floatScan.end = i\n floatScan.read = read\n const negative = b[start] === 45\n if (high === 0) return negative ? -0 : 0\n const v = digits > 19 ? undefined : decimal(negative, high, low, digits > 15 ? digits - 15 : 0, e10)\n return v === undefined ? Number(asciiText(b, start, i)) : v\n}\n\n/** The text of ASCII bytes. */\nconst asciiText = (b: Uint8Array, start: number, end: number): string =>\n String.fromCharCode.apply(null, b.subarray(start, end) as unknown as Array<number>)\n"],"mappings":"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"}
|
|
@@ -1,33 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*
|
|
4
|
-
* In partial mode a parser only succeeds on what it has seen, so a value
|
|
5
|
-
* parsed from a prefix of the input stays the same when more input
|
|
6
|
-
* arrives. A repetition that runs out of input mid-way can therefore record
|
|
7
|
-
* how far it got (its accumulator and position) before the failure
|
|
8
|
-
* propagates. When the parse is attempted again with more input, the same
|
|
9
|
-
* repetition, entered at the same offset, takes its checkpoint and carries
|
|
10
|
-
* on from there instead of re-parsing every element.
|
|
11
|
-
*
|
|
12
|
-
* Checkpoints are keyed by a per-parser key and the offset the repetition
|
|
13
|
-
* started at. Taking a checkpoint removes it, so its accumulator has a
|
|
14
|
-
* single owner; the repetition saves a new one if it runs out again.
|
|
15
|
-
*
|
|
16
|
-
* A resumed repetition that then completes leaves a {@link Done}
|
|
17
|
-
* checkpoint with its result, since the input may still run out after it
|
|
18
|
-
* (in trailing whitespace, say) and the next attempt would otherwise parse
|
|
19
|
-
* it all again. `Done` checkpoints stay in place when taken.
|
|
20
|
-
*/
|
|
21
|
-
import type { State } from "../Input.js";
|
|
1
|
+
import { State } from "../Input.js";
|
|
2
|
+
//#region src/internal/resume.d.ts
|
|
22
3
|
/** The checkpoints of a resumable parse. */
|
|
23
4
|
export type Checkpoints = Map<object, Map<number, unknown>>;
|
|
24
5
|
/** Takes (and removes) the checkpoint of `key` entered at `offset`, if any. */
|
|
25
6
|
export declare const take: (state: State<any>, key: object, offset: number) => unknown;
|
|
26
7
|
/** The result of a repetition that completed, and where it ended. */
|
|
27
8
|
export declare class Done {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
9
|
+
readonly value: unknown;
|
|
10
|
+
readonly pos: number;
|
|
11
|
+
constructor(value: unknown, pos: number);
|
|
31
12
|
}
|
|
32
13
|
/**
|
|
33
14
|
* Returns `value`, the result of a repetition entered at `entry`; when the
|
|
@@ -36,4 +17,5 @@ export declare class Done {
|
|
|
36
17
|
export declare const done: <A>(state: State<any>, key: object, entry: number, resumed: boolean, value: A) => A;
|
|
37
18
|
/** Records the checkpoint of `key` entered at `offset`. */
|
|
38
19
|
export declare const save: (state: State<any>, key: object, offset: number, checkpoint: unknown) => void;
|
|
20
|
+
//#endregion
|
|
39
21
|
//# sourceMappingURL=resume.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resume.d.ts","
|
|
1
|
+
{"version":3,"file":"resume.d.ts","names":[],"sources":["../../src/internal/resume.ts"],"mappings":";;;YAuBY,cAAc,YAAY;;qBAGzB,OAAQ,OAAO,YAAY,aAAa;;qBASxC;WAEA;WACA;EADA,YAAA,gBACA;;;;;;qBAQA,OAAQ,GAAG,OAAO,YAAY,aAAa,eAAe,kBAAkB,OAAO,MAAI;;qBAMvF,OAAQ,OAAO,YAAY,aAAa,gBAAgB"}
|
package/dist/internal/resume.js
CHANGED
|
@@ -1,37 +1,38 @@
|
|
|
1
|
+
//#region src/internal/resume.ts
|
|
1
2
|
/** Takes (and removes) the checkpoint of `key` entered at `offset`, if any. */
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
byKey.delete(offset);
|
|
9
|
-
return checkpoint;
|
|
3
|
+
const take = (state, key, offset) => {
|
|
4
|
+
const byKey = state.resume?.get(key);
|
|
5
|
+
if (byKey === void 0) return void 0;
|
|
6
|
+
const checkpoint = byKey.get(offset);
|
|
7
|
+
if (checkpoint !== void 0 && !(checkpoint instanceof Done)) byKey.delete(offset);
|
|
8
|
+
return checkpoint;
|
|
10
9
|
};
|
|
11
10
|
/** The result of a repetition that completed, and where it ended. */
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
}
|
|
11
|
+
var Done = class {
|
|
12
|
+
value;
|
|
13
|
+
pos;
|
|
14
|
+
constructor(value, pos) {
|
|
15
|
+
this.value = value;
|
|
16
|
+
this.pos = pos;
|
|
17
|
+
}
|
|
18
|
+
};
|
|
20
19
|
/**
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
return value;
|
|
20
|
+
* Returns `value`, the result of a repetition entered at `entry`; when the
|
|
21
|
+
* repetition was resumed from a checkpoint, records it as {@link Done}.
|
|
22
|
+
*/
|
|
23
|
+
const done = (state, key, entry, resumed, value) => {
|
|
24
|
+
if (resumed && state.resume !== void 0) save(state, key, entry, new Done(value, state.pos));
|
|
25
|
+
return value;
|
|
28
26
|
};
|
|
29
27
|
/** Records the checkpoint of `key` entered at `offset`. */
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
28
|
+
const save = (state, key, offset, checkpoint) => {
|
|
29
|
+
const resume = state.resume;
|
|
30
|
+
if (resume === void 0) return;
|
|
31
|
+
let byKey = resume.get(key);
|
|
32
|
+
if (byKey === void 0) resume.set(key, byKey = /* @__PURE__ */ new Map());
|
|
33
|
+
byKey.set(offset, checkpoint);
|
|
36
34
|
};
|
|
35
|
+
//#endregion
|
|
36
|
+
export { Done, done, save, take };
|
|
37
|
+
|
|
37
38
|
//# sourceMappingURL=resume.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resume.js","
|
|
1
|
+
{"version":3,"file":"resume.js","names":[],"sources":["../../src/internal/resume.ts"],"sourcesContent":["/**\n * Checkpoints for resumable (streaming) parses.\n *\n * In partial mode a parser only succeeds on what it has seen, so a value\n * parsed from a prefix of the input stays the same when more input\n * arrives. A repetition that runs out of input mid-way can therefore record\n * how far it got (its accumulator and position) before the failure\n * propagates. When the parse is attempted again with more input, the same\n * repetition, entered at the same offset, takes its checkpoint and carries\n * on from there instead of re-parsing every element.\n *\n * Checkpoints are keyed by a per-parser key and the offset the repetition\n * started at. Taking a checkpoint removes it, so its accumulator has a\n * single owner; the repetition saves a new one if it runs out again.\n *\n * A resumed repetition that then completes leaves a {@link Done}\n * checkpoint with its result, since the input may still run out after it\n * (in trailing whitespace, say) and the next attempt would otherwise parse\n * it all again. `Done` checkpoints stay in place when taken.\n */\nimport type { State } from \"../Input.js\"\n\n/** The checkpoints of a resumable parse. */\nexport type Checkpoints = Map<object, Map<number, unknown>>\n\n/** Takes (and removes) the checkpoint of `key` entered at `offset`, if any. */\nexport const take = (state: State<any>, key: object, offset: number): unknown => {\n const byKey = state.resume?.get(key)\n if (byKey === undefined) return undefined\n const checkpoint = byKey.get(offset)\n if (checkpoint !== undefined && !(checkpoint instanceof Done)) byKey.delete(offset)\n return checkpoint\n}\n\n/** The result of a repetition that completed, and where it ended. */\nexport class Done {\n constructor(\n readonly value: unknown,\n readonly pos: number\n ) {}\n}\n\n/**\n * Returns `value`, the result of a repetition entered at `entry`; when the\n * repetition was resumed from a checkpoint, records it as {@link Done}.\n */\nexport const done = <A>(state: State<any>, key: object, entry: number, resumed: boolean, value: A): A => {\n if (resumed && state.resume !== undefined) save(state, key, entry, new Done(value, state.pos))\n return value\n}\n\n/** Records the checkpoint of `key` entered at `offset`. */\nexport const save = (state: State<any>, key: object, offset: number, checkpoint: unknown): void => {\n const resume = state.resume\n if (resume === undefined) return\n let byKey = resume.get(key)\n if (byKey === undefined) resume.set(key, (byKey = new Map()))\n byKey.set(offset, checkpoint)\n}\n"],"mappings":";;AA0BA,MAAa,QAAQ,OAAmB,KAAa,WAA4B;CAC/E,MAAM,QAAQ,MAAM,QAAQ,IAAI,GAAG;CACnC,IAAI,UAAU,KAAA,GAAW,OAAO,KAAA;CAChC,MAAM,aAAa,MAAM,IAAI,MAAM;CACnC,IAAI,eAAe,KAAA,KAAa,EAAE,sBAAsB,OAAO,MAAM,OAAO,MAAM;CAClF,OAAO;AACT;;AAGA,IAAa,OAAb,MAAkB;CAEL;CACA;CAFX,YACE,OACA,KACA;EAFS,KAAA,QAAA;EACA,KAAA,MAAA;CACR;AACL;;;;;AAMA,MAAa,QAAW,OAAmB,KAAa,OAAe,SAAkB,UAAgB;CACvG,IAAI,WAAW,MAAM,WAAW,KAAA,GAAW,KAAK,OAAO,KAAK,OAAO,IAAI,KAAK,OAAO,MAAM,GAAG,CAAC;CAC7F,OAAO;AACT;;AAGA,MAAa,QAAQ,OAAmB,KAAa,QAAgB,eAA8B;CACjG,MAAM,SAAS,MAAM;CACrB,IAAI,WAAW,KAAA,GAAW;CAC1B,IAAI,QAAQ,OAAO,IAAI,GAAG;CAC1B,IAAI,UAAU,KAAA,GAAW,OAAO,IAAI,KAAM,wBAAQ,IAAI,IAAI,CAAE;CAC5D,MAAM,IAAI,QAAQ,UAAU;AAC9B"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Fail, State } from "../Input.js";
|
|
2
|
+
import { ParserLike } from "./node.js";
|
|
3
|
+
//#region src/internal/run.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Runs `p` on `state` from `state.pos`: its compiled form when it has one
|
|
6
|
+
* and the state allows it, else its step. A compiled run that fails is
|
|
7
|
+
* thrown away and the step runs again from the same position, so a
|
|
8
|
+
* failure leaves the state exactly as the interpreter would; with
|
|
9
|
+
* `diagnostics` false it is not, and the state keeps the compiled run's
|
|
10
|
+
* `mode`, with the cursor back at the start. Partial states (and states
|
|
11
|
+
* with streaming checkpoints) use the resumable build.
|
|
12
|
+
*/
|
|
13
|
+
export declare const runOn: <A>(p: ParserLike, step: (state: State<any>) => A | Fail, state: State<any>, diagnostics?: boolean) => A | Fail;
|
|
14
|
+
//#endregion
|
|
15
|
+
//# sourceMappingURL=run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.d.ts","names":[],"sources":["../../src/internal/run.ts"],"mappings":";;;;;;;;;;;;qBAoBa,QAAS,GACpB,GAAG,YACH,OAAO,OAAO,eAAe,IAAI,MACjC,OAAO,YACP,0BACC,IAAI"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Fail } from "../Input.js";
|
|
2
|
+
import * as Registry from "./compiler/registry.js";
|
|
3
|
+
import * as Stack from "./stack.js";
|
|
4
|
+
//#region src/internal/run.ts
|
|
5
|
+
/**
|
|
6
|
+
* Running a parser on a caller-owned `State`, compiled when possible.
|
|
7
|
+
*
|
|
8
|
+
* Shared by `Parser.run` and `ParserStream.parseMany`, which keep one
|
|
9
|
+
* state across many small runs.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Runs `p` on `state` from `state.pos`: its compiled form when it has one
|
|
13
|
+
* and the state allows it, else its step. A compiled run that fails is
|
|
14
|
+
* thrown away and the step runs again from the same position, so a
|
|
15
|
+
* failure leaves the state exactly as the interpreter would; with
|
|
16
|
+
* `diagnostics` false it is not, and the state keeps the compiled run's
|
|
17
|
+
* `mode`, with the cursor back at the start. Partial states (and states
|
|
18
|
+
* with streaming checkpoints) use the resumable build.
|
|
19
|
+
*/
|
|
20
|
+
const runOn = (p, step, state, diagnostics = true) => {
|
|
21
|
+
if (state.tracer === void 0 && state.recovered === void 0 && state.syntax === void 0) {
|
|
22
|
+
const compiled = Registry.stepFor(p, state, state.partial || state.resume !== void 0);
|
|
23
|
+
if (compiled !== void 0) {
|
|
24
|
+
const start = state.pos;
|
|
25
|
+
const a = Stack.run(compiled, state);
|
|
26
|
+
if (a !== Fail) return a;
|
|
27
|
+
state.pos = start;
|
|
28
|
+
if (!diagnostics) return Fail;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return Stack.run(step, state);
|
|
32
|
+
};
|
|
33
|
+
//#endregion
|
|
34
|
+
export { runOn };
|
|
35
|
+
|
|
36
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","names":[],"sources":["../../src/internal/run.ts"],"sourcesContent":["/**\n * Running a parser on a caller-owned `State`, compiled when possible.\n *\n * Shared by `Parser.run` and `ParserStream.parseMany`, which keep one\n * state across many small runs.\n */\nimport { Fail, type State } from \"../Input.js\"\nimport * as Registry from \"./compiler/registry.js\"\nimport type { ParserLike } from \"./node.js\"\nimport * as Stack from \"./stack.js\"\n\n/**\n * Runs `p` on `state` from `state.pos`: its compiled form when it has one\n * and the state allows it, else its step. A compiled run that fails is\n * thrown away and the step runs again from the same position, so a\n * failure leaves the state exactly as the interpreter would; with\n * `diagnostics` false it is not, and the state keeps the compiled run's\n * `mode`, with the cursor back at the start. Partial states (and states\n * with streaming checkpoints) use the resumable build.\n */\nexport const runOn = <A>(\n p: ParserLike,\n step: (state: State<any>) => A | Fail,\n state: State<any>,\n diagnostics: boolean = true\n): A | Fail => {\n if (state.tracer === undefined && state.recovered === undefined && state.syntax === undefined) {\n const compiled = Registry.stepFor(p, state, state.partial || state.resume !== undefined)\n if (compiled !== undefined) {\n const start = state.pos\n const a = Stack.run(compiled, state)\n if (a !== Fail) {\n // SAFETY: the compiled step returns what the parser's step returns\n return a as A\n }\n state.pos = start\n if (!diagnostics) return Fail\n }\n }\n return Stack.run(step, state)\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAoBA,MAAa,SACX,GACA,MACA,OACA,cAAuB,SACV;CACb,IAAI,MAAM,WAAW,KAAA,KAAa,MAAM,cAAc,KAAA,KAAa,MAAM,WAAW,KAAA,GAAW;EAC7F,MAAM,WAAW,SAAS,QAAQ,GAAG,OAAO,MAAM,WAAW,MAAM,WAAW,KAAA,CAAS;EACvF,IAAI,aAAa,KAAA,GAAW;GAC1B,MAAM,QAAQ,MAAM;GACpB,MAAM,IAAI,MAAM,IAAI,UAAU,KAAK;GACnC,IAAI,MAAM,MAER,OAAO;GAET,MAAM,MAAM;GACZ,IAAI,CAAC,aAAa,OAAO;EAC3B;CACF;CACA,OAAO,MAAM,IAAI,MAAM,KAAK;AAC9B"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Fail, State } from "../Input.js";
|
|
2
|
+
//#region src/internal/stack.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* Whether `e` is the engine's call-stack overflow: a `RangeError` in V8
|
|
5
|
+
* and JavaScriptCore, an `InternalError` ("too much recursion") in
|
|
6
|
+
* SpiderMonkey.
|
|
7
|
+
*/
|
|
8
|
+
export declare const isStackOverflow: (e: unknown) => boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Runs `step`, turning a call-stack overflow into an unrecoverable
|
|
11
|
+
* `TooDeep` failure at the offset parsing had reached. Other exceptions
|
|
12
|
+
* propagate.
|
|
13
|
+
*/
|
|
14
|
+
export declare const run: <S extends State<any>, A>(step: (state: S) => A, state: S) => A | Fail;
|
|
15
|
+
//#endregion
|
|
16
|
+
//# sourceMappingURL=stack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stack.d.ts","names":[],"sources":["../../src/internal/stack.ts"],"mappings":";;;;;;;qBAmBa,kBAAmB;;;;;;qBASnB,MAAO,UAAU,YAAY,GAAG,OAAO,OAAO,MAAM,GAAG,OAAO,MAAI,IAAI"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
//#region src/internal/stack.ts
|
|
2
|
+
/** The message of a `TooDeep` failure. */
|
|
3
|
+
const tooDeepMessage = "input is nested too deeply: parsing exhausted the call stack";
|
|
4
|
+
/**
|
|
5
|
+
* Whether `e` is the engine's call-stack overflow: a `RangeError` in V8
|
|
6
|
+
* and JavaScriptCore, an `InternalError` ("too much recursion") in
|
|
7
|
+
* SpiderMonkey.
|
|
8
|
+
*/
|
|
9
|
+
const isStackOverflow = (e) => e instanceof RangeError && /call stack/i.test(e.message) || e instanceof Error && e.name === "InternalError" && /recursion/i.test(e.message);
|
|
10
|
+
/**
|
|
11
|
+
* Runs `step`, turning a call-stack overflow into an unrecoverable
|
|
12
|
+
* `TooDeep` failure at the offset parsing had reached. Other exceptions
|
|
13
|
+
* propagate.
|
|
14
|
+
*/
|
|
15
|
+
const run = (step, state) => {
|
|
16
|
+
try {
|
|
17
|
+
return step(state);
|
|
18
|
+
} catch (e) {
|
|
19
|
+
if (!isStackOverflow(e)) throw e;
|
|
20
|
+
return state.failMessage("Cut", "TooDeep", tooDeepMessage);
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
//#endregion
|
|
24
|
+
export { isStackOverflow, run };
|
|
25
|
+
|
|
26
|
+
//# sourceMappingURL=stack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stack.js","names":[],"sources":["../../src/internal/stack.ts"],"sourcesContent":["/**\n * Call-stack overflows.\n *\n * The interpreter and the compiled backends recurse once (or more) per\n * nesting level of a recursive grammar, so deeply nested input, such as\n * thousands of `{`, can exhaust the call stack. The runners catch the\n * engine's overflow error and report a `TooDeep` failure instead, keeping\n * their `Result` contract on untrusted input.\n */\nimport type { Fail, State } from \"../Input.js\"\n\n/** The message of a `TooDeep` failure. */\nconst tooDeepMessage = \"input is nested too deeply: parsing exhausted the call stack\"\n\n/**\n * Whether `e` is the engine's call-stack overflow: a `RangeError` in V8\n * and JavaScriptCore, an `InternalError` (\"too much recursion\") in\n * SpiderMonkey.\n */\nexport const isStackOverflow = (e: unknown): boolean =>\n (e instanceof RangeError && /call stack/i.test(e.message)) ||\n (e instanceof Error && e.name === \"InternalError\" && /recursion/i.test(e.message))\n\n/**\n * Runs `step`, turning a call-stack overflow into an unrecoverable\n * `TooDeep` failure at the offset parsing had reached. Other exceptions\n * propagate.\n */\nexport const run = <S extends State<any>, A>(step: (state: S) => A, state: S): A | Fail => {\n try {\n return step(state)\n } catch (e) {\n if (!isStackOverflow(e)) throw e\n return state.failMessage(\"Cut\", \"TooDeep\", tooDeepMessage)\n }\n}\n"],"mappings":";;AAYA,MAAM,iBAAiB;;;;;;AAOvB,MAAa,mBAAmB,MAC7B,aAAa,cAAc,cAAc,KAAK,EAAE,OAAO,KACvD,aAAa,SAAS,EAAE,SAAS,mBAAmB,aAAa,KAAK,EAAE,OAAO;;;;;;AAOlF,MAAa,OAAgC,MAAuB,UAAuB;CACzF,IAAI;EACF,OAAO,KAAK,KAAK;CACnB,SAAS,GAAG;EACV,IAAI,CAAC,gBAAgB,CAAC,GAAG,MAAM;EAC/B,OAAO,MAAM,YAAY,OAAO,WAAW,cAAc;CAC3D;AACF"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { ErrMode, Fail, Failure, Input, Source, State } from "../Input.js";
|
|
2
|
+
import * as Context from "effect/Context";
|
|
3
|
+
import { Encoding } from "../Encoding.js";
|
|
4
|
+
//#region src/internal/syntax.d.ts
|
|
5
|
+
/** What a failure inside an `ERROR` node was. Offsets are relative to the node. */
|
|
6
|
+
export interface ErrorInfo {
|
|
7
|
+
readonly failure: Failure;
|
|
8
|
+
readonly mode: ErrMode;
|
|
9
|
+
}
|
|
10
|
+
/** A position-independent syntax tree node. */
|
|
11
|
+
export declare class Green {
|
|
12
|
+
readonly kind: string;
|
|
13
|
+
readonly named: boolean;
|
|
14
|
+
/** The `Syntax.node` that built it; `undefined` for roots and errors, which are never reused alone. */
|
|
15
|
+
readonly key: object | undefined;
|
|
16
|
+
readonly width: number;
|
|
17
|
+
/** How far its parse looked, relative to its start (at least `width`). */
|
|
18
|
+
readonly lookahead: number;
|
|
19
|
+
readonly children: ReadonlyArray<Green>;
|
|
20
|
+
/** The children's starts, relative to this node's start. */
|
|
21
|
+
readonly offsets: ReadonlyArray<number>;
|
|
22
|
+
/** The children's field names, when any child has one. */
|
|
23
|
+
readonly fields: ReadonlyArray<string | undefined> | undefined;
|
|
24
|
+
readonly value: unknown;
|
|
25
|
+
/** Set on `ERROR` nodes. */
|
|
26
|
+
readonly error: ErrorInfo | undefined;
|
|
27
|
+
/** Whether this node or a descendant is an `ERROR` node. */
|
|
28
|
+
readonly hasError: boolean;
|
|
29
|
+
/** What its parse left behind for error reporting, replayed when it is reused. */
|
|
30
|
+
readonly diagnostics: Diagnostics | undefined;
|
|
31
|
+
constructor(kind: string, named: boolean,
|
|
32
|
+
/** The `Syntax.node` that built it; `undefined` for roots and errors, which are never reused alone. */
|
|
33
|
+
key: object | undefined, width: number,
|
|
34
|
+
/** How far its parse looked, relative to its start (at least `width`). */
|
|
35
|
+
lookahead: number, children: ReadonlyArray<Green>,
|
|
36
|
+
/** The children's starts, relative to this node's start. */
|
|
37
|
+
offsets: ReadonlyArray<number>,
|
|
38
|
+
/** The children's field names, when any child has one. */
|
|
39
|
+
fields: ReadonlyArray<string | undefined> | undefined, value: unknown,
|
|
40
|
+
/** Set on `ERROR` nodes. */
|
|
41
|
+
error: ErrorInfo | undefined,
|
|
42
|
+
/** Whether this node or a descendant is an `ERROR` node. */
|
|
43
|
+
hasError: boolean,
|
|
44
|
+
/** What its parse left behind for error reporting, replayed when it is reused. */
|
|
45
|
+
diagnostics: Diagnostics | undefined);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* The error-reporting state a node's parse leaves behind (see
|
|
49
|
+
* `State.deepest` and `State.setHint`). A reused node replays it, so that
|
|
50
|
+
* a reparse reports the errors a fresh parse does.
|
|
51
|
+
*/
|
|
52
|
+
export interface Diagnostics {
|
|
53
|
+
/** The furthest failure, at its offset in the parse that built the node... */
|
|
54
|
+
readonly deepest: Failure | undefined;
|
|
55
|
+
/** ...which started the node at `base`. */
|
|
56
|
+
readonly base: number;
|
|
57
|
+
/** Relative to the node's start. */
|
|
58
|
+
readonly hintOffset: number;
|
|
59
|
+
readonly hintExpected: ReadonlyArray<string> | undefined;
|
|
60
|
+
}
|
|
61
|
+
/** A completed node waiting for its parent, at an absolute position. */
|
|
62
|
+
declare class Child {
|
|
63
|
+
readonly green: Green;
|
|
64
|
+
readonly start: number;
|
|
65
|
+
readonly end: number;
|
|
66
|
+
field: string | undefined;
|
|
67
|
+
constructor(green: Green, start: number, end: number, field: string | undefined);
|
|
68
|
+
}
|
|
69
|
+
export declare const errorKind = "ERROR";
|
|
70
|
+
/** Moves a failure stored relative to a node back to absolute offsets. */
|
|
71
|
+
export declare const absolute: (f: Failure, start: number) => Failure;
|
|
72
|
+
/**
|
|
73
|
+
* A stretch of the new input copied unchanged from the previous one:
|
|
74
|
+
* `[newStart, newStart + length)` is `[oldStart, oldStart + length)`.
|
|
75
|
+
*/
|
|
76
|
+
export interface Segment {
|
|
77
|
+
readonly newStart: number;
|
|
78
|
+
readonly oldStart: number;
|
|
79
|
+
readonly length: number;
|
|
80
|
+
}
|
|
81
|
+
/** What a reparse may reuse. */
|
|
82
|
+
export interface Previous {
|
|
83
|
+
readonly root: Green;
|
|
84
|
+
readonly oldLength: number;
|
|
85
|
+
readonly newLength: number;
|
|
86
|
+
readonly segments: ReadonlyArray<Segment>;
|
|
87
|
+
readonly input: Input;
|
|
88
|
+
/** How far past its lookahead a parser may have read, besides a token at the lookahead. */
|
|
89
|
+
readonly extra: number;
|
|
90
|
+
readonly encoding: Encoding<any> | undefined;
|
|
91
|
+
}
|
|
92
|
+
/** The hooks that `Syntax` combinators and `Parser.resumeAfter`/`retryAfter` call. */
|
|
93
|
+
export interface Builder {
|
|
94
|
+
node(state: State<any>, step: (state: State<any>) => unknown, key: object, kind: string, named: boolean): unknown;
|
|
95
|
+
field(state: State<any>, step: (state: State<any>) => unknown, name: string): unknown;
|
|
96
|
+
/** After error recovery: `[start, pos)` was skipped after `failure`. */
|
|
97
|
+
skipped(start: number, failure: Failure, mode: ErrMode): void;
|
|
98
|
+
/**
|
|
99
|
+
* Called by token parsers that read input up to `end` (exclusive) beyond
|
|
100
|
+
* where they leave the cursor or record a failure.
|
|
101
|
+
*/
|
|
102
|
+
read(end: number): void;
|
|
103
|
+
}
|
|
104
|
+
/** The parse state of a `Syntax` parse. */
|
|
105
|
+
export declare class SyntaxState<I extends Input = Input> extends State<I> implements Builder {
|
|
106
|
+
cursor: number;
|
|
107
|
+
/** The furthest position the cursor reached, or failure recorded, since the innermost open node started. */
|
|
108
|
+
highWater: number;
|
|
109
|
+
/** Completed nodes waiting for their parent, in input order. */
|
|
110
|
+
stack: Array<Child>;
|
|
111
|
+
previous: Previous | undefined;
|
|
112
|
+
/** How many nodes were reused from the previous tree. */
|
|
113
|
+
reused: number;
|
|
114
|
+
/** Where {@link find} found the last node it found. */
|
|
115
|
+
lastParent: Green | undefined;
|
|
116
|
+
lastParentStart: number;
|
|
117
|
+
constructor(source: I | Source<I>, options: {
|
|
118
|
+
readonly context?: Context.Context<never> | undefined;
|
|
119
|
+
}, previous: Previous | undefined);
|
|
120
|
+
failWith(mode: ErrMode, failure: Failure): Fail;
|
|
121
|
+
setHint(offset: number, expected: ReadonlyArray<string>): void;
|
|
122
|
+
node(state: State<any>, step: (state: State<any>) => unknown, key: object, kind: string, named: boolean): unknown;
|
|
123
|
+
read(end: number): void;
|
|
124
|
+
/** Records `failure` as the furthest failure if it is, as `failWith` does. */
|
|
125
|
+
private deepen;
|
|
126
|
+
field(state: State<any>, step: (state: State<any>) => unknown, name: string): unknown;
|
|
127
|
+
skipped(start: number, failure: Failure, mode: ErrMode): void;
|
|
128
|
+
/**
|
|
129
|
+
* Builds the root over the whole input from the nodes left on the stack.
|
|
130
|
+
* When the parse failed, or stopped before the end, the rest of the input
|
|
131
|
+
* becomes an `ERROR` node.
|
|
132
|
+
*/
|
|
133
|
+
finish(kind: string, value: unknown, fatal: ErrorInfo | undefined, errorStart: number): Green;
|
|
134
|
+
/**
|
|
135
|
+
* The outermost node of the previous tree built by `key` that starts at
|
|
136
|
+
* `offset`. Reused nodes are mostly siblings, found one after the other,
|
|
137
|
+
* so the search starts from the parent of the last one found when
|
|
138
|
+
* `offset` lies inside it: no ancestor of that parent can start there.
|
|
139
|
+
*/
|
|
140
|
+
private find;
|
|
141
|
+
/** The node of the previous tree built by `key` at `pos` (in the new input), if it can be reused. */
|
|
142
|
+
private reusable;
|
|
143
|
+
}
|
|
144
|
+
//#endregion
|
|
145
|
+
export {};
|
|
146
|
+
//# sourceMappingURL=syntax.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"syntax.d.ts","names":[],"sources":["../../src/internal/syntax.ts"],"mappings":";;;;;iBAmCiB;WACN,SAAS;WACT,MAAM;;;qBAIJ;WAEA;WACA;;WAEA;WACA;;WAEA;WACA,UAAU,cAAc;;WAExB,SAAS;;WAET,QAAQ;WACR;;WAEA,OAAO;;WAEP;;WAEA,aAAa;EAlBb,YAAA,cACA;;EAEA,yBACA;;EAEA,mBACA,UAAU,cAAc;;EAExB,SAAS;;EAET,QAAQ,+CACR;;EAEA,OAAO;;EAEP;;EAEA,aAAa;;;;;;;iBAST;;WAEN,SAAS;;WAET;;WAEA;WACA,cAAc;;;cAInB;WAEO,OAAO;WACP;WACA;EACF;EAHE,YAAA,OAAO,OACP,eACA,aACF;;qBAIE;;qBAMA,WAAY,GAAG,SAAS,kBAAgB;;;;;iBAuCpC;WACN;WACA;WACA;;;iBAIM;WACN,MAAM;WACN;WACA;WACA,UAAU,cAAc;WACxB,OAAO;;WAEP;WACA,UAAU;;;iBAIJ;EACf,KAAK,OAAO,YAAY,OAAO,OAAO,wBAAwB,aAAa,cAAc;EACzF,MAAM,OAAO,YAAY,OAAO,OAAO,wBAAwB;;EAE/D,QAAQ,eAAe,SAAS,SAAS,MAAM;;;;;EAK/C,KAAK;;;qBAIM,YAAY,UAAU,QAAQ,eAAe,MAAM,cAAc;EAGpE;;EAEA;;EAEA,OAAO,MAAM;EACb,UAAU;;EAEV;;EAEA,YAAY;EACZ;EAsBN,YAAA,QAAQ,IAAI,OAAO,IACnB;aACW,UAAU,QAAQ;KAE7B,UAAU;EAcH,SAAS,MAAM,SAAS,SAAS,UAAU;EAK3C,QAAQ,gBAAgB,UAAU;EAK3C,KAAK,OAAO,YAAY,OAAO,OAAO,wBAAwB,aAAa,cAAc;EA0DzF,KAAK;;UAMG;EAIR,MAAM,OAAO,YAAY,OAAO,OAAO,wBAAwB;EAQ/D,QAAQ,eAAe,SAAS,SAAS,MAAM;;;;;;EAiB/C,OAAO,cAAc,gBAAgB,OAAO,uBAAuB,qBAAqB;;;;;;;UAqBhF;;UAsCA"}
|