@thomasfosterau/effect-parse 0.0.0-stage → 0.0.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/LICENSE +21 -0
- package/README.md +550 -2
- package/dist/Ascii.d.ts +392 -0
- package/dist/Ascii.d.ts.map +1 -0
- package/dist/Ascii.js +610 -0
- package/dist/Ascii.js.map +1 -0
- package/dist/Binary.d.ts +153 -0
- package/dist/Binary.d.ts.map +1 -0
- package/dist/Binary.js +171 -0
- package/dist/Binary.js.map +1 -0
- package/dist/Bits.d.ts +60 -0
- package/dist/Bits.d.ts.map +1 -0
- package/dist/Bits.js +144 -0
- package/dist/Bits.js.map +1 -0
- package/dist/Encoding.d.ts +116 -0
- package/dist/Encoding.d.ts.map +1 -0
- package/dist/Encoding.js +85 -0
- package/dist/Encoding.js.map +1 -0
- package/dist/Expression.d.ts +124 -0
- package/dist/Expression.d.ts.map +1 -0
- package/dist/Expression.js +139 -0
- package/dist/Expression.js.map +1 -0
- package/dist/Input.d.ts +301 -0
- package/dist/Input.d.ts.map +1 -0
- package/dist/Input.js +312 -0
- package/dist/Input.js.map +1 -0
- package/dist/Nom.d.ts +518 -0
- package/dist/Nom.d.ts.map +1 -0
- package/dist/Nom.js +519 -0
- package/dist/Nom.js.map +1 -0
- package/dist/ParseError.d.ts +120 -0
- package/dist/ParseError.d.ts.map +1 -0
- package/dist/ParseError.js +301 -0
- package/dist/ParseError.js.map +1 -0
- package/dist/Parser.d.ts +1312 -0
- package/dist/Parser.d.ts.map +1 -0
- package/dist/Parser.js +1936 -0
- package/dist/Parser.js.map +1 -0
- package/dist/ParserSchema.d.ts +31 -0
- package/dist/ParserSchema.d.ts.map +1 -0
- package/dist/ParserSchema.js +56 -0
- package/dist/ParserSchema.js.map +1 -0
- package/dist/ParserStream.d.ts +127 -0
- package/dist/ParserStream.d.ts.map +1 -0
- package/dist/ParserStream.js +270 -0
- package/dist/ParserStream.js.map +1 -0
- package/dist/Text.d.ts +330 -0
- package/dist/Text.d.ts.map +1 -0
- package/dist/Text.js +529 -0
- package/dist/Text.js.map +1 -0
- package/dist/Token.d.ts +225 -0
- package/dist/Token.d.ts.map +1 -0
- package/dist/Token.js +294 -0
- package/dist/Token.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/compiler/closure.d.ts +25 -0
- package/dist/internal/compiler/closure.d.ts.map +1 -0
- package/dist/internal/compiler/closure.js +1668 -0
- package/dist/internal/compiler/closure.js.map +1 -0
- package/dist/internal/compiler/entries.d.ts +19 -0
- package/dist/internal/compiler/entries.d.ts.map +1 -0
- package/dist/internal/compiler/entries.js +32 -0
- package/dist/internal/compiler/entries.js.map +1 -0
- package/dist/internal/compiler/first.d.ts +33 -0
- package/dist/internal/compiler/first.d.ts.map +1 -0
- package/dist/internal/compiler/first.js +235 -0
- package/dist/internal/compiler/first.js.map +1 -0
- package/dist/internal/compiler/jit.d.ts +20 -0
- package/dist/internal/compiler/jit.d.ts.map +1 -0
- package/dist/internal/compiler/jit.js +1030 -0
- package/dist/internal/compiler/jit.js.map +1 -0
- package/dist/internal/compiler/registry.d.ts +34 -0
- package/dist/internal/compiler/registry.d.ts.map +1 -0
- package/dist/internal/compiler/registry.js +46 -0
- package/dist/internal/compiler/registry.js.map +1 -0
- package/dist/internal/compiler/sets.d.ts +29 -0
- package/dist/internal/compiler/sets.d.ts.map +1 -0
- package/dist/internal/compiler/sets.js +85 -0
- package/dist/internal/compiler/sets.js.map +1 -0
- package/dist/internal/entries.d.ts +27 -0
- package/dist/internal/entries.d.ts.map +1 -0
- package/dist/internal/entries.js +42 -0
- package/dist/internal/entries.js.map +1 -0
- package/dist/internal/node.d.ts +251 -0
- package/dist/internal/node.d.ts.map +1 -0
- package/dist/internal/node.js +73 -0
- package/dist/internal/node.js.map +1 -0
- package/dist/internal/numbers.d.ts +41 -0
- package/dist/internal/numbers.d.ts.map +1 -0
- package/dist/internal/numbers.js +302 -0
- package/dist/internal/numbers.js.map +1 -0
- package/dist/internal/resume.d.ts +39 -0
- package/dist/internal/resume.d.ts.map +1 -0
- package/dist/internal/resume.js +37 -0
- package/dist/internal/resume.js.map +1 -0
- package/dist/internal/text.d.ts +72 -0
- package/dist/internal/text.d.ts.map +1 -0
- package/dist/internal/text.js +391 -0
- package/dist/internal/text.js.map +1 -0
- package/dist/internal/tokens.d.ts +93 -0
- package/dist/internal/tokens.d.ts.map +1 -0
- package/dist/internal/tokens.js +400 -0
- package/dist/internal/tokens.js.map +1 -0
- package/package.json +115 -3
- package/src/Ascii.ts +741 -0
- package/src/Binary.ts +228 -0
- package/src/Bits.ts +192 -0
- package/src/Encoding.ts +128 -0
- package/src/Expression.ts +245 -0
- package/src/Input.ts +429 -0
- package/src/Nom.ts +642 -0
- package/src/ParseError.ts +378 -0
- package/src/Parser.ts +2763 -0
- package/src/ParserSchema.ts +87 -0
- package/src/ParserStream.ts +390 -0
- package/src/Text.ts +757 -0
- package/src/Token.ts +416 -0
- package/src/index.ts +16 -0
- package/src/internal/compiler/closure.ts +1583 -0
- package/src/internal/compiler/entries.ts +36 -0
- package/src/internal/compiler/first.ts +252 -0
- package/src/internal/compiler/jit.ts +1091 -0
- package/src/internal/compiler/registry.ts +79 -0
- package/src/internal/compiler/sets.ts +100 -0
- package/src/internal/entries.ts +51 -0
- package/src/internal/node.ts +207 -0
- package/src/internal/numbers.ts +291 -0
- package/src/internal/resume.ts +55 -0
- package/src/internal/text.ts +411 -0
- package/src/internal/tokens.ts +409 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Text encodings for the `Text` module.
|
|
3
|
+
*
|
|
4
|
+
* An {@link Encoding} tells the `Text` parsers how to read Unicode code
|
|
5
|
+
* points out of an input. JavaScript strings are read natively, without any
|
|
6
|
+
* conversion. Byte inputs are decoded as they are parsed, so offsets stay
|
|
7
|
+
* byte offsets, slices that are kept as bytes (`Parser.taken`) are
|
|
8
|
+
* zero-copy views, and partial input that ends in the middle of a character
|
|
9
|
+
* reports `Incomplete`.
|
|
10
|
+
*
|
|
11
|
+
* ```ts
|
|
12
|
+
* import { Encoding, Text } from "@thomasfosterau/effect-parse"
|
|
13
|
+
*
|
|
14
|
+
* Text.utf8.encoding === Encoding.utf8
|
|
15
|
+
* Text.make(Encoding.latin1) // the Text parsers for any Encoding, including your own
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* @since 0.1.0
|
|
19
|
+
*/
|
|
20
|
+
import * as Option from "effect/Option";
|
|
21
|
+
/**
|
|
22
|
+
* A text encoding: how to read Unicode code points out of an input. The
|
|
23
|
+
* `Text` module is generic over encodings, so one grammar can parse
|
|
24
|
+
* JavaScript strings, UTF-8 bytes, UTF-16 bytes and so on.
|
|
25
|
+
*
|
|
26
|
+
* Decoding is strict: malformed sequences (invalid UTF-8, unpaired UTF-16
|
|
27
|
+
* surrogates) are reported as invalid, never replaced.
|
|
28
|
+
*
|
|
29
|
+
* @since 0.1.0
|
|
30
|
+
* @category models
|
|
31
|
+
*/
|
|
32
|
+
export interface Encoding<I extends string | Uint8Array = string | Uint8Array> {
|
|
33
|
+
/** The name of the encoding, e.g. `"UTF-8"`. Used in error messages. */
|
|
34
|
+
readonly name: string;
|
|
35
|
+
/**
|
|
36
|
+
* The size of a code unit, in input units: 1 for strings, UTF-8 and
|
|
37
|
+
* Latin-1, 2 for UTF-16 bytes. Code points start at multiples of it.
|
|
38
|
+
*/
|
|
39
|
+
readonly unit: number;
|
|
40
|
+
/**
|
|
41
|
+
* Whether every input unit below `0x80` encodes the ASCII character with
|
|
42
|
+
* that value, and is never part of a longer sequence. Enables fast paths.
|
|
43
|
+
*/
|
|
44
|
+
readonly asciiCompatible: boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Decodes the code point starting at `offset` (with `offset < end`).
|
|
47
|
+
* Returns the code point, `-1` if the input is malformed there, or `-2` if
|
|
48
|
+
* the input ends inside a sequence (more input could complete it).
|
|
49
|
+
*/
|
|
50
|
+
readonly decode: (input: I, offset: number, end: number) => number;
|
|
51
|
+
/** The number of input units that encode a code point. */
|
|
52
|
+
readonly width: (codePoint: number) => number;
|
|
53
|
+
/** Encodes a string. Throws if the string can't be represented. */
|
|
54
|
+
readonly encode: (text: string) => I;
|
|
55
|
+
/**
|
|
56
|
+
* Decodes the units `[start, end)` to a string. The parsers only call it
|
|
57
|
+
* on ranges they have checked are well formed.
|
|
58
|
+
*/
|
|
59
|
+
readonly text: (input: I, start: number, end: number) => string;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* JavaScript strings, read as UTF-16 code units. Offsets are code-unit
|
|
63
|
+
* indices and slices are plain `String.prototype.slice`s. Unpaired
|
|
64
|
+
* surrogates are malformed.
|
|
65
|
+
*
|
|
66
|
+
* @since 0.1.0
|
|
67
|
+
* @category encodings
|
|
68
|
+
*/
|
|
69
|
+
export declare const string: Encoding<string>;
|
|
70
|
+
/**
|
|
71
|
+
* UTF-8 bytes. Overlong encodings, surrogates and code points above
|
|
72
|
+
* U+10FFFF are malformed.
|
|
73
|
+
*
|
|
74
|
+
* @since 0.1.0
|
|
75
|
+
* @category encodings
|
|
76
|
+
*/
|
|
77
|
+
export declare const utf8: Encoding<Uint8Array>;
|
|
78
|
+
/**
|
|
79
|
+
* UTF-16 bytes, little endian. Unpaired surrogates are malformed.
|
|
80
|
+
*
|
|
81
|
+
* @since 0.1.0
|
|
82
|
+
* @category encodings
|
|
83
|
+
*/
|
|
84
|
+
export declare const utf16le: Encoding<Uint8Array>;
|
|
85
|
+
/**
|
|
86
|
+
* UTF-16 bytes, big endian. Unpaired surrogates are malformed.
|
|
87
|
+
*
|
|
88
|
+
* @since 0.1.0
|
|
89
|
+
* @category encodings
|
|
90
|
+
*/
|
|
91
|
+
export declare const utf16be: Encoding<Uint8Array>;
|
|
92
|
+
/**
|
|
93
|
+
* ISO-8859-1 (Latin-1) bytes: each byte is the code point U+0000 to U+00FF
|
|
94
|
+
* of the same value.
|
|
95
|
+
*
|
|
96
|
+
* @since 0.1.0
|
|
97
|
+
* @category encodings
|
|
98
|
+
*/
|
|
99
|
+
export declare const latin1: Encoding<Uint8Array>;
|
|
100
|
+
/**
|
|
101
|
+
* Detects the encoding of bytes from a byte order mark: UTF-8
|
|
102
|
+
* (`EF BB BF`), UTF-16LE (`FF FE`) or UTF-16BE (`FE FF`). The mark itself
|
|
103
|
+
* is not skipped; parse it with `Text.bom`.
|
|
104
|
+
*
|
|
105
|
+
* @example
|
|
106
|
+
* ```ts
|
|
107
|
+
* import { Encoding } from "@thomasfosterau/effect-parse"
|
|
108
|
+
*
|
|
109
|
+
* Encoding.sniff(new Uint8Array([0xff, 0xfe, 0x41, 0x00])) // Option.some(Encoding.utf16le)
|
|
110
|
+
* ```
|
|
111
|
+
*
|
|
112
|
+
* @since 0.1.0
|
|
113
|
+
* @category utils
|
|
114
|
+
*/
|
|
115
|
+
export declare const sniff: (bytes: Uint8Array) => Option.Option<Encoding<Uint8Array>>;
|
|
116
|
+
//# sourceMappingURL=Encoding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Encoding.d.ts","sourceRoot":"","sources":["../src/Encoding.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAGvC;;;;;;;;;;GAUG;AACH,MAAM,WAAW,QAAQ,CAAC,CAAC,SAAS,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU;IAC3E,wEAAwE;IACxE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB;;;OAGG;IACH,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAA;IACjC;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;IAClE,0DAA0D;IAC1D,QAAQ,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,CAAA;IAC7C,mEAAmE;IACnE,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,CAAC,CAAA;IACpC;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;CAChE;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAmB,CAAA;AAEvD;;;;;;GAMG;AACH,eAAO,MAAM,IAAI,EAAE,QAAQ,CAAC,UAAU,CAAiB,CAAA;AAEvD;;;;;GAKG;AACH,eAAO,MAAM,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAoB,CAAA;AAE7D;;;;;GAKG;AACH,eAAO,MAAM,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAoB,CAAA;AAE7D;;;;;;GAMG;AACH,eAAO,MAAM,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAmB,CAAA;AAE3D;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,KAAK,UAAW,UAAU,KAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAK3E,CAAA"}
|
package/dist/Encoding.js
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Text encodings for the `Text` module.
|
|
3
|
+
*
|
|
4
|
+
* An {@link Encoding} tells the `Text` parsers how to read Unicode code
|
|
5
|
+
* points out of an input. JavaScript strings are read natively, without any
|
|
6
|
+
* conversion. Byte inputs are decoded as they are parsed, so offsets stay
|
|
7
|
+
* byte offsets, slices that are kept as bytes (`Parser.taken`) are
|
|
8
|
+
* zero-copy views, and partial input that ends in the middle of a character
|
|
9
|
+
* reports `Incomplete`.
|
|
10
|
+
*
|
|
11
|
+
* ```ts
|
|
12
|
+
* import { Encoding, Text } from "@thomasfosterau/effect-parse"
|
|
13
|
+
*
|
|
14
|
+
* Text.utf8.encoding === Encoding.utf8
|
|
15
|
+
* Text.make(Encoding.latin1) // the Text parsers for any Encoding, including your own
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* @since 0.1.0
|
|
19
|
+
*/
|
|
20
|
+
import * as Option from "effect/Option";
|
|
21
|
+
import * as internal from "./internal/text.js";
|
|
22
|
+
/**
|
|
23
|
+
* JavaScript strings, read as UTF-16 code units. Offsets are code-unit
|
|
24
|
+
* indices and slices are plain `String.prototype.slice`s. Unpaired
|
|
25
|
+
* surrogates are malformed.
|
|
26
|
+
*
|
|
27
|
+
* @since 0.1.0
|
|
28
|
+
* @category encodings
|
|
29
|
+
*/
|
|
30
|
+
export const string = internal.string;
|
|
31
|
+
/**
|
|
32
|
+
* UTF-8 bytes. Overlong encodings, surrogates and code points above
|
|
33
|
+
* U+10FFFF are malformed.
|
|
34
|
+
*
|
|
35
|
+
* @since 0.1.0
|
|
36
|
+
* @category encodings
|
|
37
|
+
*/
|
|
38
|
+
export const utf8 = internal.utf8;
|
|
39
|
+
/**
|
|
40
|
+
* UTF-16 bytes, little endian. Unpaired surrogates are malformed.
|
|
41
|
+
*
|
|
42
|
+
* @since 0.1.0
|
|
43
|
+
* @category encodings
|
|
44
|
+
*/
|
|
45
|
+
export const utf16le = internal.utf16le;
|
|
46
|
+
/**
|
|
47
|
+
* UTF-16 bytes, big endian. Unpaired surrogates are malformed.
|
|
48
|
+
*
|
|
49
|
+
* @since 0.1.0
|
|
50
|
+
* @category encodings
|
|
51
|
+
*/
|
|
52
|
+
export const utf16be = internal.utf16be;
|
|
53
|
+
/**
|
|
54
|
+
* ISO-8859-1 (Latin-1) bytes: each byte is the code point U+0000 to U+00FF
|
|
55
|
+
* of the same value.
|
|
56
|
+
*
|
|
57
|
+
* @since 0.1.0
|
|
58
|
+
* @category encodings
|
|
59
|
+
*/
|
|
60
|
+
export const latin1 = internal.latin1;
|
|
61
|
+
/**
|
|
62
|
+
* Detects the encoding of bytes from a byte order mark: UTF-8
|
|
63
|
+
* (`EF BB BF`), UTF-16LE (`FF FE`) or UTF-16BE (`FE FF`). The mark itself
|
|
64
|
+
* is not skipped; parse it with `Text.bom`.
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```ts
|
|
68
|
+
* import { Encoding } from "@thomasfosterau/effect-parse"
|
|
69
|
+
*
|
|
70
|
+
* Encoding.sniff(new Uint8Array([0xff, 0xfe, 0x41, 0x00])) // Option.some(Encoding.utf16le)
|
|
71
|
+
* ```
|
|
72
|
+
*
|
|
73
|
+
* @since 0.1.0
|
|
74
|
+
* @category utils
|
|
75
|
+
*/
|
|
76
|
+
export const sniff = (bytes) => {
|
|
77
|
+
if (bytes[0] === 0xef && bytes[1] === 0xbb && bytes[2] === 0xbf)
|
|
78
|
+
return Option.some(utf8);
|
|
79
|
+
if (bytes[0] === 0xff && bytes[1] === 0xfe)
|
|
80
|
+
return Option.some(utf16le);
|
|
81
|
+
if (bytes[0] === 0xfe && bytes[1] === 0xff)
|
|
82
|
+
return Option.some(utf16be);
|
|
83
|
+
return Option.none();
|
|
84
|
+
};
|
|
85
|
+
//# sourceMappingURL=Encoding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Encoding.js","sourceRoot":"","sources":["../src/Encoding.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,QAAQ,MAAM,oBAAoB,CAAA;AA2C9C;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,MAAM,GAAqB,QAAQ,CAAC,MAAM,CAAA;AAEvD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,IAAI,GAAyB,QAAQ,CAAC,IAAI,CAAA;AAEvD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,OAAO,GAAyB,QAAQ,CAAC,OAAO,CAAA;AAE7D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,OAAO,GAAyB,QAAQ,CAAC,OAAO,CAAA;AAE7D;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,MAAM,GAAyB,QAAQ,CAAC,MAAM,CAAA;AAE3D;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,KAAiB,EAAuC,EAAE;IAC9E,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzF,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACvE,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACvE,OAAO,MAAM,CAAC,IAAI,EAAE,CAAA;AACtB,CAAC,CAAA"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Operator-precedence expression parsing with a Pratt parser (from
|
|
3
|
+
* `nom-language`'s `precedence`, and winnow's expression parser).
|
|
4
|
+
*
|
|
5
|
+
* Describe the operand parser and a table of prefix, postfix and infix
|
|
6
|
+
* operators with their precedence (higher binds tighter) and associativity.
|
|
7
|
+
* Each operator carries a function that folds its operands into a result.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* import { Ascii, Expression, Parser, Token } from "@thomasfosterau/effect-parse"
|
|
12
|
+
*
|
|
13
|
+
* const op = (s: string) => Parser.delimited(Ascii.space0, Token.literal(s), Ascii.space0)
|
|
14
|
+
*
|
|
15
|
+
* const arithmetic: Parser.Parser<number, string> = Expression.make({
|
|
16
|
+
* operand: Parser.alt(
|
|
17
|
+
* Ascii.decInt,
|
|
18
|
+
* Parser.delimited(op("("), Parser.suspend(() => arithmetic), op(")"))
|
|
19
|
+
* ),
|
|
20
|
+
* operators: [
|
|
21
|
+
* Expression.prefix(op("-"), 4, (_, x) => -x),
|
|
22
|
+
* Expression.postfix(op("!"), 5, (x) => factorial(x)),
|
|
23
|
+
* Expression.infixRight(op("^"), 3, (l, _, r) => l ** r),
|
|
24
|
+
* Expression.infixLeft(op("*"), 2, (l, _, r) => l * r),
|
|
25
|
+
* Expression.infixLeft(op("/"), 2, (l, _, r) => l / r),
|
|
26
|
+
* Expression.infixLeft(op("+"), 1, (l, _, r) => l + r),
|
|
27
|
+
* Expression.infixLeft(op("-"), 1, (l, _, r) => l - r)
|
|
28
|
+
* ]
|
|
29
|
+
* })
|
|
30
|
+
*
|
|
31
|
+
* declare const factorial: (n: number) => number
|
|
32
|
+
* Parser.parse(arithmetic, "1 + 2 * 3 ^ 2") // Result.succeed(19)
|
|
33
|
+
* ```
|
|
34
|
+
*
|
|
35
|
+
* @since 0.1.0
|
|
36
|
+
*/
|
|
37
|
+
import type { Input } from "./Input.js";
|
|
38
|
+
import type { Parser } from "./Parser.js";
|
|
39
|
+
/**
|
|
40
|
+
* An operator in an expression grammar.
|
|
41
|
+
*
|
|
42
|
+
* @since 0.1.0
|
|
43
|
+
* @category models
|
|
44
|
+
*/
|
|
45
|
+
export type Operator<A, E = never, R = never, I extends Input = string> = Prefix<A, E, R, I> | Postfix<A, E, R, I> | Infix<A, E, R, I>;
|
|
46
|
+
interface OperatorBase<E, R, I extends Input> {
|
|
47
|
+
readonly parser: Parser<unknown, E, R, I>;
|
|
48
|
+
readonly precedence: number;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* @since 0.1.0
|
|
52
|
+
* @category models
|
|
53
|
+
*/
|
|
54
|
+
export interface Prefix<A, E = never, R = never, I extends Input = string> extends OperatorBase<E, R, I> {
|
|
55
|
+
readonly _tag: "Prefix";
|
|
56
|
+
readonly fold: (op: any, operand: A) => A;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* @since 0.1.0
|
|
60
|
+
* @category models
|
|
61
|
+
*/
|
|
62
|
+
export interface Postfix<A, E = never, R = never, I extends Input = string> extends OperatorBase<E, R, I> {
|
|
63
|
+
readonly _tag: "Postfix";
|
|
64
|
+
readonly fold: (operand: A, op: any) => A;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* @since 0.1.0
|
|
68
|
+
* @category models
|
|
69
|
+
*/
|
|
70
|
+
export interface Infix<A, E = never, R = never, I extends Input = string> extends OperatorBase<E, R, I> {
|
|
71
|
+
readonly _tag: "Infix";
|
|
72
|
+
readonly associativity: "left" | "right";
|
|
73
|
+
readonly fold: (left: A, op: any, right: A) => A;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* A prefix operator, e.g. unary minus.
|
|
77
|
+
*
|
|
78
|
+
* @since 0.1.0
|
|
79
|
+
* @category operators
|
|
80
|
+
*/
|
|
81
|
+
export declare const prefix: <O, E, R, I extends Input, A>(parser: Parser<O, E, R, I>, precedence: number, fold: (op: O, operand: A) => A) => Prefix<A, E, R, I>;
|
|
82
|
+
/**
|
|
83
|
+
* A postfix operator, e.g. factorial or a function call suffix.
|
|
84
|
+
*
|
|
85
|
+
* @since 0.1.0
|
|
86
|
+
* @category operators
|
|
87
|
+
*/
|
|
88
|
+
export declare const postfix: <O, E, R, I extends Input, A>(parser: Parser<O, E, R, I>, precedence: number, fold: (operand: A, op: O) => A) => Postfix<A, E, R, I>;
|
|
89
|
+
/**
|
|
90
|
+
* A left-associative infix operator: `a - b - c` is `(a - b) - c`.
|
|
91
|
+
*
|
|
92
|
+
* @since 0.1.0
|
|
93
|
+
* @category operators
|
|
94
|
+
*/
|
|
95
|
+
export declare const infixLeft: <O, E, R, I extends Input, A>(parser: Parser<O, E, R, I>, precedence: number, fold: (left: A, op: O, right: A) => A) => Infix<A, E, R, I>;
|
|
96
|
+
/**
|
|
97
|
+
* A right-associative infix operator: `a ^ b ^ c` is `a ^ (b ^ c)`.
|
|
98
|
+
*
|
|
99
|
+
* @since 0.1.0
|
|
100
|
+
* @category operators
|
|
101
|
+
*/
|
|
102
|
+
export declare const infixRight: <O, E, R, I extends Input, A>(parser: Parser<O, E, R, I>, precedence: number, fold: (left: A, op: O, right: A) => A) => Infix<A, E, R, I>;
|
|
103
|
+
type OpError<Op> = Op extends OperatorBase<infer E, infer _R, infer _I> ? E : never;
|
|
104
|
+
type OpServices<Op> = Op extends OperatorBase<infer _E, infer R, infer _I> ? R : never;
|
|
105
|
+
type OpInput<Op> = [Op] extends [never] ? Input : [Op] extends [OperatorBase<infer _E, infer _R, infer I>] ? I : never;
|
|
106
|
+
/**
|
|
107
|
+
* Builds an expression parser from an operand parser and an operator table.
|
|
108
|
+
*
|
|
109
|
+
* Precedences are compared numerically: higher binds tighter. A prefix
|
|
110
|
+
* operator applies to everything that binds tighter than it, so with `-`
|
|
111
|
+
* at precedence 4 and `^` at 3, `-2 ^ 2` parses as `(-2) ^ 2`.
|
|
112
|
+
*
|
|
113
|
+
* When several operators of the same kind match, the first one in the
|
|
114
|
+
* table wins, so list longer operators (`<=`) before their prefixes (`<`).
|
|
115
|
+
*
|
|
116
|
+
* @since 0.1.0
|
|
117
|
+
* @category constructors
|
|
118
|
+
*/
|
|
119
|
+
export declare const make: <A, E, R, I extends Input, const Ops extends ReadonlyArray<Operator<A, any, any, any>>>(options: {
|
|
120
|
+
readonly operand: Parser<A, E, R, I>;
|
|
121
|
+
readonly operators: Ops;
|
|
122
|
+
}) => Parser<A, E | OpError<Ops[number]>, R | OpServices<Ops[number]>, I & OpInput<Ops[number]>>;
|
|
123
|
+
export {};
|
|
124
|
+
//# sourceMappingURL=Expression.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Expression.d.ts","sourceRoot":"","sources":["../src/Expression.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { Fail, mergeFailures } from "./Input.js";
|
|
2
|
+
import { make as makeParser } from "./Parser.js";
|
|
3
|
+
/**
|
|
4
|
+
* A prefix operator, e.g. unary minus.
|
|
5
|
+
*
|
|
6
|
+
* @since 0.1.0
|
|
7
|
+
* @category operators
|
|
8
|
+
*/
|
|
9
|
+
export const prefix = (parser, precedence, fold) => ({ _tag: "Prefix", parser, precedence, fold });
|
|
10
|
+
/**
|
|
11
|
+
* A postfix operator, e.g. factorial or a function call suffix.
|
|
12
|
+
*
|
|
13
|
+
* @since 0.1.0
|
|
14
|
+
* @category operators
|
|
15
|
+
*/
|
|
16
|
+
export const postfix = (parser, precedence, fold) => ({ _tag: "Postfix", parser, precedence, fold });
|
|
17
|
+
/**
|
|
18
|
+
* A left-associative infix operator: `a - b - c` is `(a - b) - c`.
|
|
19
|
+
*
|
|
20
|
+
* @since 0.1.0
|
|
21
|
+
* @category operators
|
|
22
|
+
*/
|
|
23
|
+
export const infixLeft = (parser, precedence, fold) => ({ _tag: "Infix", associativity: "left", parser, precedence, fold });
|
|
24
|
+
/**
|
|
25
|
+
* A right-associative infix operator: `a ^ b ^ c` is `a ^ (b ^ c)`.
|
|
26
|
+
*
|
|
27
|
+
* @since 0.1.0
|
|
28
|
+
* @category operators
|
|
29
|
+
*/
|
|
30
|
+
export const infixRight = (parser, precedence, fold) => ({ _tag: "Infix", associativity: "right", parser, precedence, fold });
|
|
31
|
+
/**
|
|
32
|
+
* Builds an expression parser from an operand parser and an operator table.
|
|
33
|
+
*
|
|
34
|
+
* Precedences are compared numerically: higher binds tighter. A prefix
|
|
35
|
+
* operator applies to everything that binds tighter than it, so with `-`
|
|
36
|
+
* at precedence 4 and `^` at 3, `-2 ^ 2` parses as `(-2) ^ 2`.
|
|
37
|
+
*
|
|
38
|
+
* When several operators of the same kind match, the first one in the
|
|
39
|
+
* table wins, so list longer operators (`<=`) before their prefixes (`<`).
|
|
40
|
+
*
|
|
41
|
+
* @since 0.1.0
|
|
42
|
+
* @category constructors
|
|
43
|
+
*/
|
|
44
|
+
export const make = (options) => {
|
|
45
|
+
const operand = options.operand.step;
|
|
46
|
+
const prefixes = options.operators.filter((o) => o._tag === "Prefix");
|
|
47
|
+
const postfixes = options.operators.filter((o) => o._tag === "Postfix");
|
|
48
|
+
const infixes = options.operators.filter((o) => o._tag === "Infix");
|
|
49
|
+
// Attempts each operator in turn. Returns the index of the first match
|
|
50
|
+
// (with its output in `matched`), -1 if none matched, or -2 on a fatal
|
|
51
|
+
// failure. Expectations of failed attempts are accumulated in `failure`.
|
|
52
|
+
let matched;
|
|
53
|
+
let failure;
|
|
54
|
+
const tryOps = (state, ops, mustConsume) => {
|
|
55
|
+
const start = state.pos;
|
|
56
|
+
for (let i = 0; i < ops.length; i++) {
|
|
57
|
+
const out = ops[i].parser.step(state);
|
|
58
|
+
if (out !== Fail) {
|
|
59
|
+
// A prefix or postfix operator matching nothing would apply forever
|
|
60
|
+
if (mustConsume && state.pos === start) {
|
|
61
|
+
state.failMessage("Cut", "Assert", "prefix and postfix operators must always consume");
|
|
62
|
+
return -2;
|
|
63
|
+
}
|
|
64
|
+
matched = out;
|
|
65
|
+
return i;
|
|
66
|
+
}
|
|
67
|
+
if (state.mode !== "Backtrack")
|
|
68
|
+
return -2;
|
|
69
|
+
failure = failure === undefined ? state.failure : mergeFailures(failure, state.failure);
|
|
70
|
+
state.pos = start;
|
|
71
|
+
}
|
|
72
|
+
return -1;
|
|
73
|
+
};
|
|
74
|
+
const expr = (state, minPower) => {
|
|
75
|
+
let lhs;
|
|
76
|
+
failure = undefined;
|
|
77
|
+
const p = tryOps(state, prefixes, true);
|
|
78
|
+
if (p === -2)
|
|
79
|
+
return Fail;
|
|
80
|
+
if (p >= 0) {
|
|
81
|
+
const op = prefixes[p];
|
|
82
|
+
const opOut = matched;
|
|
83
|
+
const operandValue = expr(state, op.precedence * 2);
|
|
84
|
+
if (operandValue === Fail)
|
|
85
|
+
return Fail;
|
|
86
|
+
lhs = op.fold(opOut, operandValue);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
const prefixFailure = failure;
|
|
90
|
+
lhs = operand(state);
|
|
91
|
+
if (lhs === Fail) {
|
|
92
|
+
if (prefixFailure !== undefined && state.mode === "Backtrack") {
|
|
93
|
+
state.failWith("Backtrack", mergeFailures(prefixFailure, state.failure));
|
|
94
|
+
}
|
|
95
|
+
return Fail;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
while (true) {
|
|
99
|
+
const start = state.pos;
|
|
100
|
+
failure = undefined;
|
|
101
|
+
const q = tryOps(state, postfixes, true);
|
|
102
|
+
if (q === -2)
|
|
103
|
+
return Fail;
|
|
104
|
+
if (q >= 0) {
|
|
105
|
+
const op = postfixes[q];
|
|
106
|
+
if (op.precedence * 2 < minPower) {
|
|
107
|
+
state.pos = start;
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
lhs = op.fold(lhs, matched);
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
const postfixFailure = failure;
|
|
114
|
+
const i = tryOps(state, infixes, false);
|
|
115
|
+
if (i === -2)
|
|
116
|
+
return Fail;
|
|
117
|
+
if (i < 0) {
|
|
118
|
+
const f = postfixFailure === undefined ? failure : failure === undefined ? postfixFailure : mergeFailures(postfixFailure, failure);
|
|
119
|
+
if (f !== undefined && f.offset === state.pos)
|
|
120
|
+
state.setHint(f.offset, f.expected);
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
const op = infixes[i];
|
|
124
|
+
const leftPower = op.precedence * 2;
|
|
125
|
+
if (leftPower < minPower) {
|
|
126
|
+
state.pos = start;
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
const opOut = matched;
|
|
130
|
+
const rhs = expr(state, op.associativity === "left" ? leftPower + 1 : leftPower);
|
|
131
|
+
if (rhs === Fail)
|
|
132
|
+
return Fail;
|
|
133
|
+
lhs = op.fold(lhs, opOut, rhs);
|
|
134
|
+
}
|
|
135
|
+
return lhs;
|
|
136
|
+
};
|
|
137
|
+
return makeParser((state) => expr(state, 0), "expression");
|
|
138
|
+
};
|
|
139
|
+
//# sourceMappingURL=Expression.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Expression.js","sourceRoot":"","sources":["../src/Expression.ts"],"names":[],"mappings":"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"}
|