@thomasfosterau/effect-parse 0.0.0-stage → 0.1.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.
Files changed (133) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +550 -2
  3. package/dist/Ascii.d.ts +392 -0
  4. package/dist/Ascii.d.ts.map +1 -0
  5. package/dist/Ascii.js +610 -0
  6. package/dist/Ascii.js.map +1 -0
  7. package/dist/Binary.d.ts +153 -0
  8. package/dist/Binary.d.ts.map +1 -0
  9. package/dist/Binary.js +171 -0
  10. package/dist/Binary.js.map +1 -0
  11. package/dist/Bits.d.ts +60 -0
  12. package/dist/Bits.d.ts.map +1 -0
  13. package/dist/Bits.js +144 -0
  14. package/dist/Bits.js.map +1 -0
  15. package/dist/Encoding.d.ts +116 -0
  16. package/dist/Encoding.d.ts.map +1 -0
  17. package/dist/Encoding.js +85 -0
  18. package/dist/Encoding.js.map +1 -0
  19. package/dist/Expression.d.ts +124 -0
  20. package/dist/Expression.d.ts.map +1 -0
  21. package/dist/Expression.js +139 -0
  22. package/dist/Expression.js.map +1 -0
  23. package/dist/Input.d.ts +301 -0
  24. package/dist/Input.d.ts.map +1 -0
  25. package/dist/Input.js +312 -0
  26. package/dist/Input.js.map +1 -0
  27. package/dist/Nom.d.ts +518 -0
  28. package/dist/Nom.d.ts.map +1 -0
  29. package/dist/Nom.js +519 -0
  30. package/dist/Nom.js.map +1 -0
  31. package/dist/ParseError.d.ts +120 -0
  32. package/dist/ParseError.d.ts.map +1 -0
  33. package/dist/ParseError.js +301 -0
  34. package/dist/ParseError.js.map +1 -0
  35. package/dist/Parser.d.ts +1312 -0
  36. package/dist/Parser.d.ts.map +1 -0
  37. package/dist/Parser.js +1936 -0
  38. package/dist/Parser.js.map +1 -0
  39. package/dist/ParserSchema.d.ts +31 -0
  40. package/dist/ParserSchema.d.ts.map +1 -0
  41. package/dist/ParserSchema.js +56 -0
  42. package/dist/ParserSchema.js.map +1 -0
  43. package/dist/ParserStream.d.ts +127 -0
  44. package/dist/ParserStream.d.ts.map +1 -0
  45. package/dist/ParserStream.js +270 -0
  46. package/dist/ParserStream.js.map +1 -0
  47. package/dist/Text.d.ts +330 -0
  48. package/dist/Text.d.ts.map +1 -0
  49. package/dist/Text.js +529 -0
  50. package/dist/Text.js.map +1 -0
  51. package/dist/Token.d.ts +225 -0
  52. package/dist/Token.d.ts.map +1 -0
  53. package/dist/Token.js +294 -0
  54. package/dist/Token.js.map +1 -0
  55. package/dist/index.d.ts +17 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +17 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/internal/compiler/closure.d.ts +25 -0
  60. package/dist/internal/compiler/closure.d.ts.map +1 -0
  61. package/dist/internal/compiler/closure.js +1668 -0
  62. package/dist/internal/compiler/closure.js.map +1 -0
  63. package/dist/internal/compiler/entries.d.ts +19 -0
  64. package/dist/internal/compiler/entries.d.ts.map +1 -0
  65. package/dist/internal/compiler/entries.js +32 -0
  66. package/dist/internal/compiler/entries.js.map +1 -0
  67. package/dist/internal/compiler/first.d.ts +33 -0
  68. package/dist/internal/compiler/first.d.ts.map +1 -0
  69. package/dist/internal/compiler/first.js +235 -0
  70. package/dist/internal/compiler/first.js.map +1 -0
  71. package/dist/internal/compiler/jit.d.ts +20 -0
  72. package/dist/internal/compiler/jit.d.ts.map +1 -0
  73. package/dist/internal/compiler/jit.js +1030 -0
  74. package/dist/internal/compiler/jit.js.map +1 -0
  75. package/dist/internal/compiler/registry.d.ts +34 -0
  76. package/dist/internal/compiler/registry.d.ts.map +1 -0
  77. package/dist/internal/compiler/registry.js +46 -0
  78. package/dist/internal/compiler/registry.js.map +1 -0
  79. package/dist/internal/compiler/sets.d.ts +29 -0
  80. package/dist/internal/compiler/sets.d.ts.map +1 -0
  81. package/dist/internal/compiler/sets.js +85 -0
  82. package/dist/internal/compiler/sets.js.map +1 -0
  83. package/dist/internal/entries.d.ts +27 -0
  84. package/dist/internal/entries.d.ts.map +1 -0
  85. package/dist/internal/entries.js +42 -0
  86. package/dist/internal/entries.js.map +1 -0
  87. package/dist/internal/node.d.ts +251 -0
  88. package/dist/internal/node.d.ts.map +1 -0
  89. package/dist/internal/node.js +73 -0
  90. package/dist/internal/node.js.map +1 -0
  91. package/dist/internal/numbers.d.ts +41 -0
  92. package/dist/internal/numbers.d.ts.map +1 -0
  93. package/dist/internal/numbers.js +302 -0
  94. package/dist/internal/numbers.js.map +1 -0
  95. package/dist/internal/resume.d.ts +39 -0
  96. package/dist/internal/resume.d.ts.map +1 -0
  97. package/dist/internal/resume.js +37 -0
  98. package/dist/internal/resume.js.map +1 -0
  99. package/dist/internal/text.d.ts +72 -0
  100. package/dist/internal/text.d.ts.map +1 -0
  101. package/dist/internal/text.js +391 -0
  102. package/dist/internal/text.js.map +1 -0
  103. package/dist/internal/tokens.d.ts +93 -0
  104. package/dist/internal/tokens.d.ts.map +1 -0
  105. package/dist/internal/tokens.js +400 -0
  106. package/dist/internal/tokens.js.map +1 -0
  107. package/package.json +115 -3
  108. package/src/Ascii.ts +741 -0
  109. package/src/Binary.ts +228 -0
  110. package/src/Bits.ts +192 -0
  111. package/src/Encoding.ts +128 -0
  112. package/src/Expression.ts +245 -0
  113. package/src/Input.ts +429 -0
  114. package/src/Nom.ts +642 -0
  115. package/src/ParseError.ts +378 -0
  116. package/src/Parser.ts +2763 -0
  117. package/src/ParserSchema.ts +87 -0
  118. package/src/ParserStream.ts +390 -0
  119. package/src/Text.ts +757 -0
  120. package/src/Token.ts +416 -0
  121. package/src/index.ts +16 -0
  122. package/src/internal/compiler/closure.ts +1583 -0
  123. package/src/internal/compiler/entries.ts +36 -0
  124. package/src/internal/compiler/first.ts +252 -0
  125. package/src/internal/compiler/jit.ts +1091 -0
  126. package/src/internal/compiler/registry.ts +79 -0
  127. package/src/internal/compiler/sets.ts +100 -0
  128. package/src/internal/entries.ts +51 -0
  129. package/src/internal/node.ts +207 -0
  130. package/src/internal/numbers.ts +291 -0
  131. package/src/internal/resume.ts +55 -0
  132. package/src/internal/text.ts +411 -0
  133. 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"}
@@ -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":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,OAAO,KAAK,EAAE,KAAK,EAAS,MAAM,YAAY,CAAA;AAG9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAGzC;;;;;GAKG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,SAAS,KAAK,GAAG,MAAM,IAClE,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAClB,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GACnB,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;AAErB,UAAU,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,KAAK;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACzC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAC5B;AAED;;;GAGG;AACH,MAAM,WAAW,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,SAAS,KAAK,GAAG,MAAM,CAAE,SAAQ,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACtG,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,CAAA;CAC1C;AAED;;;GAGG;AACH,MAAM,WAAW,OAAO,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,SAAS,KAAK,GAAG,MAAM,CAAE,SAAQ,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACvG,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;IACxB,QAAQ,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,CAAA;CAC1C;AAED;;;GAGG;AACH,MAAM,WAAW,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,SAAS,KAAK,GAAG,MAAM,CAAE,SAAQ,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACrG,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;IACtB,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAA;IACxC,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,CAAA;CACjD;AAED;;;;;GAKG;AACH,eAAO,MAAM,MAAM,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,KAAK,EAAE,CAAC,UACxC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,cACd,MAAM,QACZ,CAAC,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,KAC7B,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAmD,CAAA;AAEvE;;;;;GAKG;AACH,eAAO,MAAM,OAAO,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,KAAK,EAAE,CAAC,UACzC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,cACd,MAAM,QACZ,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,KAC7B,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAoD,CAAA;AAEzE;;;;;GAKG;AACH,eAAO,MAAM,SAAS,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,KAAK,EAAE,CAAC,UAC3C,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,cACd,MAAM,QACZ,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,KACpC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAyE,CAAA;AAE5F;;;;;GAKG;AACH,eAAO,MAAM,UAAU,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,KAAK,EAAE,CAAC,UAC5C,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,cACd,MAAM,QACZ,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,KACpC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAA0E,CAAA;AAE7F,KAAK,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,YAAY,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;AACnF,KAAK,UAAU,CAAC,EAAE,IAAI,EAAE,SAAS,YAAY,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;AACtF,KAAK,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;AAEtH;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,IAAI,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,KAAK,EAAE,KAAK,CAAC,GAAG,SAAS,aAAa,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,WAAW;IACnH,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACpC,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAA;CACxB,KAAG,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CA0F5F,CAAA"}
@@ -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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"}