@spakhm/ts-parsec 0.1.8 → 0.3.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.
@@ -1,376 +0,0 @@
1
- 'use strict';
2
-
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
- var ok = function ok(res) {
6
- return {
7
- type: 'ok',
8
- res: res
9
- };
10
- };
11
- var err = function err(row, col, msg) {
12
- return {
13
- type: 'err',
14
- err: {
15
- row: row,
16
- col: col,
17
- msg: msg
18
- }
19
- };
20
- };
21
- function toParser(pl) {
22
- if (typeof pl == 'string') {
23
- return str(pl);
24
- }
25
- if ('map' in pl) {
26
- return pl;
27
- }
28
- var fn_ = pl;
29
- fn_.map = function (fnTransform) {
30
- return toParser(function (source) {
31
- var res = fn_(source);
32
- if (res.type == 'ok') {
33
- return ok(fnTransform(res.res));
34
- } else {
35
- return res;
36
- }
37
- });
38
- };
39
- return fn_;
40
- }
41
- /*
42
- The most basic of parsers
43
- */
44
- var str = function str(match) {
45
- return lex(toParser(function (source) {
46
- for (var i = 0; i < match.length; i++) {
47
- if (source.next() != match[i]) {
48
- return err(0, 0, '');
49
- }
50
- }
51
- return ok(match);
52
- }));
53
- };
54
- var lex = function lex(p) {
55
- return toParser(function (source) {
56
- if (!source.drop_ws) {
57
- // this call to lex is nested (i.e. we're in lex mode already)
58
- // don't drop more whitespace
59
- return toParser(p)(source);
60
- } else {
61
- return keepWs(function (source) {
62
- ws(source);
63
- return toParser(p)(source);
64
- })(source);
65
- }
66
- });
67
- };
68
- var keepWs = function keepWs(p) {
69
- return toParser(function (source) {
70
- var prev_drop_ws = source.drop_ws;
71
- source.drop_ws = false;
72
- var res = toParser(p)(source);
73
- source.drop_ws = prev_drop_ws;
74
- return res;
75
- });
76
- };
77
- var ws = /*#__PURE__*/toParser(function (source) {
78
- while (true) {
79
- source.push();
80
- var ch = source.next();
81
- if ((ch == null ? void 0 : ch.trim()) === "") {
82
- source.pop_continue();
83
- } else {
84
- source.pop_rollback();
85
- break;
86
- }
87
- }
88
- return ok({});
89
- });
90
- /*
91
- Laziness helper
92
- */
93
- var fwd = function fwd(thunk) {
94
- return toParser(function (source) {
95
- return toParser(thunk())(source);
96
- });
97
- };
98
- /*
99
- TODO:
100
- - In `either('foo').map(...)` the string 'foo' gets mapped to unknown.
101
- Should fix that.
102
- - If I could push infinite regress through map, it would be trivial to
103
- just specify the AST type in map, and avoid the trick in `form`.
104
- */
105
-
106
- var attempt = function attempt(parser) {
107
- return toParser(function (source) {
108
- source.push();
109
- var res = toParser(parser)(source);
110
- if (res.type == 'ok') {
111
- source.pop_continue();
112
- } else {
113
- source.pop_rollback();
114
- }
115
- return res;
116
- });
117
- };
118
- var range = function range(start, end) {
119
- return toParser(function (source) {
120
- var next = source.next();
121
- if (!next) return err(0, 0, '');
122
- if (next >= start[0] && next <= end[0]) return ok(next);
123
- return err(0, 0, '');
124
- });
125
- };
126
- var either = function either() {
127
- for (var _len = arguments.length, parsers = new Array(_len), _key = 0; _key < _len; _key++) {
128
- parsers[_key] = arguments[_key];
129
- }
130
- return toParser(function (source) {
131
- for (var _i = 0, _parsers = parsers; _i < _parsers.length; _i++) {
132
- var parser = _parsers[_i];
133
- var res = attempt(parser)(source);
134
- if (res.type == 'ok') {
135
- return res;
136
- }
137
- }
138
- return err(0, 0, '');
139
- });
140
- };
141
- var seq = function seq() {
142
- for (var _len2 = arguments.length, parsers = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
143
- parsers[_key2] = arguments[_key2];
144
- }
145
- var p = toParser(function (source) {
146
- var res = [];
147
- for (var _i2 = 0, _parsers2 = parsers; _i2 < _parsers2.length; _i2++) {
148
- var parser = _parsers2[_i2];
149
- var res_ = toParser(parser)(source);
150
- if (res_.type == 'ok') {
151
- res.push(res_.res);
152
- } else {
153
- return err(0, 0, '');
154
- }
155
- }
156
- return ok(res);
157
- });
158
- p.map2 = function (fn) {
159
- return p.map(function (x) {
160
- return fn.apply(void 0, x);
161
- });
162
- };
163
- return p;
164
- };
165
- var many = function many(parser) {
166
- return toParser(function (source) {
167
- var res = [];
168
- while (true) {
169
- var _res = attempt(parser)(source);
170
- if (_res.type == 'ok') {
171
- res.push(_res.res);
172
- } else {
173
- break;
174
- }
175
- }
176
- return ok(res);
177
- });
178
- };
179
- var some = function some(parser) {
180
- return seq(parser, many(parser)).map2(function (ft, rt) {
181
- return [ft].concat(rt);
182
- });
183
- };
184
- var digit = /*#__PURE__*/range('0', '9');
185
- var nat = /*#__PURE__*/lex(some(digit)).map(function (val) {
186
- return parseInt(val.join(""));
187
- });
188
- var maybe = function maybe(p) {
189
- return toParser(function (source) {
190
- var res = attempt(p)(source);
191
- return res.type == 'ok' ? res : ok(null);
192
- });
193
- };
194
- var _int = /*#__PURE__*/seq(maybe(either('-', '+')), nat).map2(function (sign, val) {
195
- if (sign === '-') {
196
- return -val;
197
- } else {
198
- return val;
199
- }
200
- });
201
- var lower = /*#__PURE__*/range('a', 'z');
202
- var upper = /*#__PURE__*/range('A', 'Z');
203
- var alpha = /*#__PURE__*/either(lower, upper);
204
- var alnum = /*#__PURE__*/either(alpha, digit);
205
- var sepBy = function sepBy(item, sep, allowTrailingSep) {
206
- if (allowTrailingSep === void 0) {
207
- allowTrailingSep = true;
208
- }
209
- return toParser(function (source) {
210
- var res = [];
211
- var res_ = attempt(item)(source);
212
- if (res_.type == 'err') {
213
- return ok(res);
214
- } else {
215
- res.push(res_.res);
216
- }
217
- while (true) {
218
- var sepres_ = attempt(sep)(source);
219
- if (sepres_.type == 'err') {
220
- return ok(res);
221
- }
222
- var _res_ = attempt(item)(source);
223
- if (_res_.type == 'err') {
224
- return allowTrailingSep ? ok(res) : err(0, 0, '');
225
- } else {
226
- res.push(_res_.res);
227
- }
228
- }
229
- });
230
- };
231
- function binop(operator, operand, makeNode) {
232
- return toParser(function (source) {
233
- var p = seq(operand, many(seq(operator, operand))).map2(function (left, rights) {
234
- var acc = rights.reduce(function (acc, _ref) {
235
- var op = _ref[0],
236
- right = _ref[1];
237
- return makeNode(op, acc, right);
238
- }, left);
239
- return acc;
240
- });
241
- return p(source);
242
- });
243
- }
244
- function binopr(operator, operand, makeNode) {
245
- return toParser(function (source) {
246
- var p = seq(operand, many(seq(operator, operand))).map2(function (left, rights) {
247
- if (rights.length === 0) return left;
248
- // Start from the last operand and reduce from right to left
249
- var acc = rights[rights.length - 1][1];
250
- for (var i = rights.length - 2; i >= 0; i--) {
251
- var _rights$i = rights[i],
252
- op = _rights$i[0],
253
- right = _rights$i[1];
254
- acc = makeNode(op, right, acc);
255
- }
256
- return makeNode(rights[0][0], left, acc);
257
- });
258
- return p(source);
259
- });
260
- }
261
- var noop = /*#__PURE__*/toParser(function (_) {
262
- return ok(true);
263
- });
264
- var not = function not(p) {
265
- return toParser(function (source) {
266
- var res = toParser(p)(source);
267
- if (res.type == 'ok') {
268
- return err(0, 0, "");
269
- } else {
270
- return ok(null);
271
- }
272
- });
273
- };
274
- var peek = function peek(p) {
275
- return toParser(function (source) {
276
- source.push();
277
- var res = toParser(p)(source);
278
- source.pop_rollback();
279
- return res;
280
- });
281
- };
282
- var anych = function anych(opts) {
283
- return toParser(function (source) {
284
- if (opts != null && opts.but) {
285
- var _res2 = peek(opts.but)(source);
286
- if (_res2.type == 'ok') {
287
- return err(0, 0, "");
288
- }
289
- }
290
- var res = source.next();
291
- return res ? ok(res) : err(0, 0, "");
292
- });
293
- };
294
-
295
- var string_stream = /*#__PURE__*/function () {
296
- function string_stream(source, drop_ws) {
297
- if (drop_ws === void 0) {
298
- drop_ws = true;
299
- }
300
- this.source = source;
301
- this.drop_ws = drop_ws;
302
- this.row = 1;
303
- this.col = 1;
304
- this.idx = 0;
305
- this.stack = [];
306
- }
307
- var _proto = string_stream.prototype;
308
- _proto.next = function next() {
309
- if (this.idx == this.source.length) {
310
- return null;
311
- }
312
- var ch = this.source[this.idx++];
313
- this.col++;
314
- if (ch == '\n') {
315
- this.row++;
316
- this.col = 1;
317
- }
318
- if (this.drop_ws && ch.trim() === "") {
319
- return this.next();
320
- } else {
321
- return ch;
322
- }
323
- };
324
- _proto.push = function push() {
325
- this.stack.push({
326
- row: this.row,
327
- col: this.col,
328
- idx: this.idx
329
- });
330
- };
331
- _proto.pop_continue = function pop_continue() {
332
- this.stack.pop();
333
- };
334
- _proto.pop_rollback = function pop_rollback() {
335
- var x = this.stack.pop();
336
- this.row = x.row;
337
- this.col = x.col;
338
- this.idx = x.idx;
339
- };
340
- return string_stream;
341
- }();
342
- var fromString = function fromString(source) {
343
- return new string_stream(source);
344
- };
345
-
346
- exports.alnum = alnum;
347
- exports.alpha = alpha;
348
- exports.anych = anych;
349
- exports.attempt = attempt;
350
- exports.binop = binop;
351
- exports.binopr = binopr;
352
- exports.digit = digit;
353
- exports.either = either;
354
- exports.err = err;
355
- exports.fromString = fromString;
356
- exports.fwd = fwd;
357
- exports.int = _int;
358
- exports.keepWs = keepWs;
359
- exports.lex = lex;
360
- exports.lower = lower;
361
- exports.many = many;
362
- exports.maybe = maybe;
363
- exports.nat = nat;
364
- exports.noop = noop;
365
- exports.not = not;
366
- exports.ok = ok;
367
- exports.peek = peek;
368
- exports.range = range;
369
- exports.sepBy = sepBy;
370
- exports.seq = seq;
371
- exports.some = some;
372
- exports.str = str;
373
- exports.toParser = toParser;
374
- exports.upper = upper;
375
- exports.ws = ws;
376
- //# sourceMappingURL=ts-parsec.cjs.development.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ts-parsec.cjs.development.js","sources":["../src/base.ts","../src/lib.ts","../src/stream.ts"],"sourcesContent":["import type { stream } from './stream';\n\n/*\n Result handling\n*/\nexport type result<T, E> = { type: 'ok', res: T, } | { type: 'err', err: E, };\nexport type parser_error = { row: number, col: number, msg: string, };\n\nexport const ok = <T>(res: T): result<T, never> => ({ type: 'ok', res, });\nexport const err = (row: number, col: number, msg: string): result<never, parser_error> =>\n ({ type: 'err', err: { row, col, msg, }});\n\n/*\n Parser types\n*/\nexport type parserFn<T> = (source: stream) => result<T, parser_error>;\nexport type parser<T> = parserFn<T> & {\n map: <U>(fn: ((value: T) => U)) => parser<U>,\n};\nexport type parserlike<T> = parserFn<T> | parser<T> | string;\n\n/*\n Allowing functions and strings to act like parsers\n*/\nexport function toParser<T extends string>(p: T): parser<T>;\nexport function toParser<T>(p: parserlike<T>): parser<T>;\nexport function toParser <T>(pl: parserlike<T>) {\n if (typeof pl == 'string') {\n return str(pl);\n }\n\n if ('map' in pl) {\n return pl;\n }\n\n const fn_: parser<T> = pl as parser<T>;\n\n fn_.map = <U>(fnTransform: (value: T) => U): parser<U> => {\n return toParser((source: stream): result<U, parser_error> => {\n const res = fn_(source);\n if (res.type == 'ok') {\n return ok(fnTransform(res.res));\n } else {\n return res;\n }\n });\n };\n\n return fn_;\n}\n\n/*\n The most basic of parsers\n*/\nexport const str = <T extends string>(match: T): parser<T> =>\n lex(toParser((source: stream) => {\n for (let i = 0; i < match.length; i++) {\n if(source.next() != match[i]) {\n return err(0, 0, '');\n }\n }\n return ok(match);\n }));\n\nexport const lex = <T>(p: parserlike<T>) => toParser((source: stream) => {\n if (!source.drop_ws) {\n // this call to lex is nested (i.e. we're in lex mode already)\n // don't drop more whitespace\n return toParser(p)(source);\n } else {\n return keepWs((source: stream) => {\n ws(source);\n return toParser(p)(source);\n })(source);\n }\n});\n\nexport const keepWs = <T>(p: parserlike<T>) =>\n toParser((source: stream) => {\n const prev_drop_ws = source.drop_ws;\n source.drop_ws = false;\n const res = toParser(p)(source);\n source.drop_ws = prev_drop_ws;\n return res;\n });\n\nexport const ws = toParser((source: stream) => {\n while (true) {\n source.push();\n const ch = source.next();\n if (ch?.trim() === \"\") {\n source.pop_continue();\n } else {\n source.pop_rollback();\n break;\n }\n }\n return ok({});\n});\n\n/*\n Laziness helper\n*/\nexport const fwd = <T>(thunk: (() => parserlike<T>)): parser<T> =>\n toParser((source: stream) => toParser(thunk())(source));\n\n/*\n TODO:\n - In `either('foo').map(...)` the string 'foo' gets mapped to unknown.\n Should fix that.\n - If I could push infinite regress through map, it would be trivial to\n just specify the AST type in map, and avoid the trick in `form`.\n*/\n","import type { stream } from './stream';\nimport type { parser, parserlike } from './base';\nimport { err, ok, toParser, lex } from './base';\n\nexport const attempt = <T>(parser: parserlike<T>): parser<T> =>\n toParser((source: stream) => {\n source.push();\n const res = toParser(parser)(source);\n if (res.type == 'ok') {\n source.pop_continue();\n } else {\n source.pop_rollback();\n }\n return res;\n });\n\nexport const range = (start: string, end: string): parser<string> =>\n toParser((source: stream) => {\n const next = source.next();\n if (!next) return err(0, 0, '');\n if (next >= start[0] && next <= end[0]) return ok(next);\n return err(0, 0, '');\n });\n \nexport const either = <Ts extends any[]>(...parsers: { [K in keyof Ts]: parserlike<Ts[K]> }): parser<Ts[number]> =>\n toParser((source: stream) => {\n for (const parser of parsers) {\n const res = attempt(parser)(source);\n if (res.type == 'ok') {\n return res;\n }\n }\n return err(0, 0, '');\n });\n\nexport type seq_parser<T extends any[]> = parser<T> & {\n map2: <U>(fn: ((...values: T) => U)) => parser<U>,\n};\n\nexport const seq = <Ts extends any[]>(...parsers: { [K in keyof Ts]: parserlike<Ts[K]> }): seq_parser<Ts> => {\n const p = toParser((source: stream) => {\n const res: unknown[] = [];\n for (const parser of parsers) {\n const res_ = toParser(parser)(source);\n if (res_.type == 'ok') {\n res.push(res_.res);\n } else {\n return err(0, 0, '');\n }\n }\n return ok(res as any);\n }) as seq_parser<Ts>;\n p.map2 = <U>(fn: ((...values: Ts) => U)) =>\n p.map(x => fn(...x));\n return p;\n}\n\nexport const many = <T>(parser: parserlike<T>): parser<T[]> =>\n toParser((source: stream) => {\n const res: T[] = [];\n while (true) {\n const _res = attempt(parser)(source);\n if (_res.type == 'ok') {\n res.push(_res.res);\n } else {\n break;\n }\n }\n\n return ok(res);\n });\n\nexport const some = <T>(parser: parserlike<T>): parser<T[]> =>\n seq(parser, many(parser)).map2((ft, rt) => [ft, ...rt]);\n\nexport const digit = range('0', '9');\n\nexport const nat = lex(some(digit)).map((val) =>\n parseInt(val.join(\"\")));\n\nexport const maybe = <T>(p: parserlike<T>) =>\n toParser((source: stream) => {\n const res = attempt(p)(source);\n return res.type == 'ok' ? res : ok(null);\n });\n\nexport const int = seq(maybe(either('-', '+')), nat).map2((sign, val) => {\n if (sign === '-') {\n return -val;\n } else {\n return val;\n }\n});\n\nexport const lower = range('a', 'z');\nexport const upper = range('A', 'Z');\nexport const alpha = either(lower, upper);\nexport const alnum = either(alpha, digit);\n\nexport const sepBy = <T, U>(item: parserlike<T>, sep: parserlike<U>, allowTrailingSep: boolean = true): parser<T[]> =>\n toParser((source: stream) => {\n const res: T[] = [];\n\n const res_ = attempt(item)(source);\n if (res_.type == 'err') {\n return ok(res);\n } else {\n res.push(res_.res);\n }\n\n while (true) {\n const sepres_ = attempt(sep)(source);\n if (sepres_.type == 'err') {\n return ok(res);\n }\n \n const res_ = attempt(item)(source);\n if (res_.type == 'err') {\n return allowTrailingSep ? ok(res) : err(0, 0, '');\n } else {\n res.push(res_.res);\n }\n }\n });\n\nexport function binop<O, D, N>(\n operator: parserlike<O>,\n operand: parserlike<D>,\n makeNode: (op: O, left: D | N, right: D) => N\n): parser<N | D> {\n return toParser((source: stream) => {\n const p = seq(operand, many(seq(operator, operand))).map2<N | D>((left, rights) => {\n const acc = rights.reduce<N | D>(\n (acc, [op, right]) => makeNode(op, acc, right), left);\n return acc;\n });\n return p(source);\n });\n}\n\nexport function binopr<O, D, N>(\n operator: parserlike<O>,\n operand: parserlike<D>,\n makeNode: (op: O, left: D, right: D | N) => N\n): parser<N | D> {\n return toParser((source: stream) => {\n const p = seq(operand, many(seq(operator, operand))).map2<N | D>((left, rights) => {\n if (rights.length === 0) return left;\n\n // Start from the last operand and reduce from right to left\n let acc: D | N = rights[rights.length - 1][1];\n for (let i = rights.length - 2; i >= 0; i--) {\n const [op, right] = rights[i];\n acc = makeNode(op, right, acc);\n }\n\n return makeNode(rights[0][0], left, acc);\n });\n\n return p(source);\n });\n}\n\nexport const noop = toParser((_: stream) => ok(true));\n\nexport const not = <T>(p: parserlike<T>) => toParser((source: stream) => {\n const res = toParser(p)(source);\n if (res.type == 'ok') {\n return err(0, 0, \"\");\n } else {\n return ok(null);\n }\n});\n\nexport const peek = <T>(p: parserlike<T>) => toParser((source: stream) => {\n source.push();\n const res = toParser(p)(source);\n source.pop_rollback();\n return res;\n});\n\nexport const anych = (opts?: { but: parserlike<unknown> }) => toParser((source: stream) => {\n if (opts?.but) {\n const res = peek(opts.but)(source);\n if (res.type == 'ok') {\n return err(0, 0, \"\");\n }\n }\n const res = source.next()\n return res ? ok(res) : err(0, 0, \"\");\n});\n","\nexport type stream = {\n row: number,\n col: number,\n drop_ws: boolean,\n next: () => string | null,\n push: () => void,\n pop_continue: () => void,\n pop_rollback: () => void,\n};\n\nclass string_stream {\n row: number = 1;\n col: number = 1;\n idx: number = 0;\n\n stack: {\n row: number,\n col: number,\n idx: number,\n }[] = [];\n\n constructor(public source: string, public drop_ws: boolean = true) {}\n\n next(): string | null {\n if (this.idx == this.source.length) {\n return null;\n }\n const ch = this.source[this.idx++];\n this.col++;\n if (ch == '\\n') {\n this.row++;\n this.col = 1;\n }\n\n if (this.drop_ws && ch.trim() === \"\") {\n return this.next();\n } else {\n return ch;\n }\n }\n\n push() {\n this.stack.push({\n row: this.row, col: this.col, idx: this.idx,\n })\n }\n\n pop_continue() {\n this.stack.pop();\n }\n\n pop_rollback() {\n const x = this.stack.pop()!;\n this.row = x.row;\n this.col = x.col;\n this.idx = x.idx;\n }\n}\n\nexport const fromString = (source: string): stream => {\n return new string_stream(source);\n}\n"],"names":["ok","res","type","err","row","col","msg","toParser","pl","str","fn_","map","fnTransform","source","match","lex","i","length","next","p","drop_ws","keepWs","ws","prev_drop_ws","push","ch","trim","pop_continue","pop_rollback","fwd","thunk","attempt","parser","range","start","end","either","_len","arguments","parsers","Array","_key","_i","_parsers","seq","_len2","_key2","_i2","_parsers2","res_","map2","fn","x","apply","many","_res","some","ft","rt","concat","digit","nat","val","parseInt","join","maybe","int","sign","lower","upper","alpha","alnum","sepBy","item","sep","allowTrailingSep","sepres_","binop","operator","operand","makeNode","left","rights","acc","reduce","_ref","op","right","binopr","_rights$i","noop","_","not","peek","anych","opts","but","string_stream","_proto","prototype","idx","stack","pop","fromString"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var r=function(r){return{type:"ok",res:r}},t=function(r,t,n){return{type:"err",err:{row:r,col:t,msg:n}}};function n(t){if("string"==typeof t)return e(t);if("map"in t)return t;var o=t;return o.map=function(t){return n((function(n){var e=o(n);return"ok"==e.type?r(t(e.res)):e}))},o}var e=function(e){return o(n((function(n){for(var o=0;o<e.length;o++)if(n.next()!=e[o])return t(0,0,"");return r(e)})))},o=function(r){return n((function(t){return t.drop_ws?u((function(t){return i(t),n(r)(t)}))(t):n(r)(t)}))},u=function(r){return n((function(t){var e=t.drop_ws;t.drop_ws=!1;var o=n(r)(t);return t.drop_ws=e,o}))},i=n((function(t){for(;;){t.push();var n=t.next();if(""!==(null==n?void 0:n.trim())){t.pop_rollback();break}t.pop_continue()}return r({})})),p=function(r){return n((function(t){t.push();var e=n(r)(t);return"ok"==e.type?t.pop_continue():t.pop_rollback(),e}))},s=function(e,o){return n((function(n){var u=n.next();return u&&u>=e[0]&&u<=o[0]?r(u):t(0,0,"")}))},c=function(){for(var r=arguments.length,e=new Array(r),o=0;o<r;o++)e[o]=arguments[o];return n((function(r){for(var n=0,o=e;n<o.length;n++){var u=p(o[n])(r);if("ok"==u.type)return u}return t(0,0,"")}))},f=function(){for(var e=arguments.length,o=new Array(e),u=0;u<e;u++)o[u]=arguments[u];var i=n((function(e){for(var u=[],i=0,p=o;i<p.length;i++){var s=n(p[i])(e);if("ok"!=s.type)return t(0,0,"");u.push(s.res)}return r(u)}));return i.map2=function(r){return i.map((function(t){return r.apply(void 0,t)}))},i},a=function(t){return n((function(n){for(var e=[];;){var o=p(t)(n);if("ok"!=o.type)break;e.push(o.res)}return r(e)}))},h=function(r){return f(r,a(r)).map2((function(r,t){return[r].concat(t)}))},x=s("0","9"),l=o(h(x)).map((function(r){return parseInt(r.join(""))})),v=function(t){return n((function(n){var e=p(t)(n);return"ok"==e.type?e:r(null)}))},y=f(v(c("-","+")),l).map2((function(r,t){return"-"===r?-t:t})),d=s("a","z"),k=s("A","Z"),w=c(d,k),m=c(w,x),_=n((function(t){return r(!0)})),g=function(r){return n((function(t){t.push();var e=n(r)(t);return t.pop_rollback(),e}))},b=function(){function r(r,t){void 0===t&&(t=!0),this.source=r,this.drop_ws=t,this.row=1,this.col=1,this.idx=0,this.stack=[]}var t=r.prototype;return t.next=function(){if(this.idx==this.source.length)return null;var r=this.source[this.idx++];return this.col++,"\n"==r&&(this.row++,this.col=1),this.drop_ws&&""===r.trim()?this.next():r},t.push=function(){this.stack.push({row:this.row,col:this.col,idx:this.idx})},t.pop_continue=function(){this.stack.pop()},t.pop_rollback=function(){var r=this.stack.pop();this.row=r.row,this.col=r.col,this.idx=r.idx},r}();exports.alnum=m,exports.alpha=w,exports.anych=function(e){return n((function(n){if(null!=e&&e.but&&"ok"==g(e.but)(n).type)return t(0,0,"");var o=n.next();return o?r(o):t(0,0,"")}))},exports.attempt=p,exports.binop=function(r,t,e){return n((function(n){return f(t,a(f(r,t))).map2((function(r,t){return t.reduce((function(r,t){return e(t[0],r,t[1])}),r)}))(n)}))},exports.binopr=function(r,t,e){return n((function(n){return f(t,a(f(r,t))).map2((function(r,t){if(0===t.length)return r;for(var n=t[t.length-1][1],o=t.length-2;o>=0;o--){var u=t[o];n=e(u[0],u[1],n)}return e(t[0][0],r,n)}))(n)}))},exports.digit=x,exports.either=c,exports.err=t,exports.fromString=function(r){return new b(r)},exports.fwd=function(r){return n((function(t){return n(r())(t)}))},exports.int=y,exports.keepWs=u,exports.lex=o,exports.lower=d,exports.many=a,exports.maybe=v,exports.nat=l,exports.noop=_,exports.not=function(e){return n((function(o){return"ok"==n(e)(o).type?t(0,0,""):r(null)}))},exports.ok=r,exports.peek=g,exports.range=s,exports.sepBy=function(e,o,u){return void 0===u&&(u=!0),n((function(n){var i=[],s=p(e)(n);if("err"==s.type)return r(i);for(i.push(s.res);;){if("err"==p(o)(n).type)return r(i);var c=p(e)(n);if("err"==c.type)return u?r(i):t(0,0,"");i.push(c.res)}}))},exports.seq=f,exports.some=h,exports.str=e,exports.toParser=n,exports.upper=k,exports.ws=i;
2
- //# sourceMappingURL=ts-parsec.cjs.production.min.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ts-parsec.cjs.production.min.js","sources":["../src/base.ts","../src/lib.ts","../src/stream.ts"],"sourcesContent":["import type { stream } from './stream';\n\n/*\n Result handling\n*/\nexport type result<T, E> = { type: 'ok', res: T, } | { type: 'err', err: E, };\nexport type parser_error = { row: number, col: number, msg: string, };\n\nexport const ok = <T>(res: T): result<T, never> => ({ type: 'ok', res, });\nexport const err = (row: number, col: number, msg: string): result<never, parser_error> =>\n ({ type: 'err', err: { row, col, msg, }});\n\n/*\n Parser types\n*/\nexport type parserFn<T> = (source: stream) => result<T, parser_error>;\nexport type parser<T> = parserFn<T> & {\n map: <U>(fn: ((value: T) => U)) => parser<U>,\n};\nexport type parserlike<T> = parserFn<T> | parser<T> | string;\n\n/*\n Allowing functions and strings to act like parsers\n*/\nexport function toParser<T extends string>(p: T): parser<T>;\nexport function toParser<T>(p: parserlike<T>): parser<T>;\nexport function toParser <T>(pl: parserlike<T>) {\n if (typeof pl == 'string') {\n return str(pl);\n }\n\n if ('map' in pl) {\n return pl;\n }\n\n const fn_: parser<T> = pl as parser<T>;\n\n fn_.map = <U>(fnTransform: (value: T) => U): parser<U> => {\n return toParser((source: stream): result<U, parser_error> => {\n const res = fn_(source);\n if (res.type == 'ok') {\n return ok(fnTransform(res.res));\n } else {\n return res;\n }\n });\n };\n\n return fn_;\n}\n\n/*\n The most basic of parsers\n*/\nexport const str = <T extends string>(match: T): parser<T> =>\n lex(toParser((source: stream) => {\n for (let i = 0; i < match.length; i++) {\n if(source.next() != match[i]) {\n return err(0, 0, '');\n }\n }\n return ok(match);\n }));\n\nexport const lex = <T>(p: parserlike<T>) => toParser((source: stream) => {\n if (!source.drop_ws) {\n // this call to lex is nested (i.e. we're in lex mode already)\n // don't drop more whitespace\n return toParser(p)(source);\n } else {\n return keepWs((source: stream) => {\n ws(source);\n return toParser(p)(source);\n })(source);\n }\n});\n\nexport const keepWs = <T>(p: parserlike<T>) =>\n toParser((source: stream) => {\n const prev_drop_ws = source.drop_ws;\n source.drop_ws = false;\n const res = toParser(p)(source);\n source.drop_ws = prev_drop_ws;\n return res;\n });\n\nexport const ws = toParser((source: stream) => {\n while (true) {\n source.push();\n const ch = source.next();\n if (ch?.trim() === \"\") {\n source.pop_continue();\n } else {\n source.pop_rollback();\n break;\n }\n }\n return ok({});\n});\n\n/*\n Laziness helper\n*/\nexport const fwd = <T>(thunk: (() => parserlike<T>)): parser<T> =>\n toParser((source: stream) => toParser(thunk())(source));\n\n/*\n TODO:\n - In `either('foo').map(...)` the string 'foo' gets mapped to unknown.\n Should fix that.\n - If I could push infinite regress through map, it would be trivial to\n just specify the AST type in map, and avoid the trick in `form`.\n*/\n","import type { stream } from './stream';\nimport type { parser, parserlike } from './base';\nimport { err, ok, toParser, lex } from './base';\n\nexport const attempt = <T>(parser: parserlike<T>): parser<T> =>\n toParser((source: stream) => {\n source.push();\n const res = toParser(parser)(source);\n if (res.type == 'ok') {\n source.pop_continue();\n } else {\n source.pop_rollback();\n }\n return res;\n });\n\nexport const range = (start: string, end: string): parser<string> =>\n toParser((source: stream) => {\n const next = source.next();\n if (!next) return err(0, 0, '');\n if (next >= start[0] && next <= end[0]) return ok(next);\n return err(0, 0, '');\n });\n \nexport const either = <Ts extends any[]>(...parsers: { [K in keyof Ts]: parserlike<Ts[K]> }): parser<Ts[number]> =>\n toParser((source: stream) => {\n for (const parser of parsers) {\n const res = attempt(parser)(source);\n if (res.type == 'ok') {\n return res;\n }\n }\n return err(0, 0, '');\n });\n\nexport type seq_parser<T extends any[]> = parser<T> & {\n map2: <U>(fn: ((...values: T) => U)) => parser<U>,\n};\n\nexport const seq = <Ts extends any[]>(...parsers: { [K in keyof Ts]: parserlike<Ts[K]> }): seq_parser<Ts> => {\n const p = toParser((source: stream) => {\n const res: unknown[] = [];\n for (const parser of parsers) {\n const res_ = toParser(parser)(source);\n if (res_.type == 'ok') {\n res.push(res_.res);\n } else {\n return err(0, 0, '');\n }\n }\n return ok(res as any);\n }) as seq_parser<Ts>;\n p.map2 = <U>(fn: ((...values: Ts) => U)) =>\n p.map(x => fn(...x));\n return p;\n}\n\nexport const many = <T>(parser: parserlike<T>): parser<T[]> =>\n toParser((source: stream) => {\n const res: T[] = [];\n while (true) {\n const _res = attempt(parser)(source);\n if (_res.type == 'ok') {\n res.push(_res.res);\n } else {\n break;\n }\n }\n\n return ok(res);\n });\n\nexport const some = <T>(parser: parserlike<T>): parser<T[]> =>\n seq(parser, many(parser)).map2((ft, rt) => [ft, ...rt]);\n\nexport const digit = range('0', '9');\n\nexport const nat = lex(some(digit)).map((val) =>\n parseInt(val.join(\"\")));\n\nexport const maybe = <T>(p: parserlike<T>) =>\n toParser((source: stream) => {\n const res = attempt(p)(source);\n return res.type == 'ok' ? res : ok(null);\n });\n\nexport const int = seq(maybe(either('-', '+')), nat).map2((sign, val) => {\n if (sign === '-') {\n return -val;\n } else {\n return val;\n }\n});\n\nexport const lower = range('a', 'z');\nexport const upper = range('A', 'Z');\nexport const alpha = either(lower, upper);\nexport const alnum = either(alpha, digit);\n\nexport const sepBy = <T, U>(item: parserlike<T>, sep: parserlike<U>, allowTrailingSep: boolean = true): parser<T[]> =>\n toParser((source: stream) => {\n const res: T[] = [];\n\n const res_ = attempt(item)(source);\n if (res_.type == 'err') {\n return ok(res);\n } else {\n res.push(res_.res);\n }\n\n while (true) {\n const sepres_ = attempt(sep)(source);\n if (sepres_.type == 'err') {\n return ok(res);\n }\n \n const res_ = attempt(item)(source);\n if (res_.type == 'err') {\n return allowTrailingSep ? ok(res) : err(0, 0, '');\n } else {\n res.push(res_.res);\n }\n }\n });\n\nexport function binop<O, D, N>(\n operator: parserlike<O>,\n operand: parserlike<D>,\n makeNode: (op: O, left: D | N, right: D) => N\n): parser<N | D> {\n return toParser((source: stream) => {\n const p = seq(operand, many(seq(operator, operand))).map2<N | D>((left, rights) => {\n const acc = rights.reduce<N | D>(\n (acc, [op, right]) => makeNode(op, acc, right), left);\n return acc;\n });\n return p(source);\n });\n}\n\nexport function binopr<O, D, N>(\n operator: parserlike<O>,\n operand: parserlike<D>,\n makeNode: (op: O, left: D, right: D | N) => N\n): parser<N | D> {\n return toParser((source: stream) => {\n const p = seq(operand, many(seq(operator, operand))).map2<N | D>((left, rights) => {\n if (rights.length === 0) return left;\n\n // Start from the last operand and reduce from right to left\n let acc: D | N = rights[rights.length - 1][1];\n for (let i = rights.length - 2; i >= 0; i--) {\n const [op, right] = rights[i];\n acc = makeNode(op, right, acc);\n }\n\n return makeNode(rights[0][0], left, acc);\n });\n\n return p(source);\n });\n}\n\nexport const noop = toParser((_: stream) => ok(true));\n\nexport const not = <T>(p: parserlike<T>) => toParser((source: stream) => {\n const res = toParser(p)(source);\n if (res.type == 'ok') {\n return err(0, 0, \"\");\n } else {\n return ok(null);\n }\n});\n\nexport const peek = <T>(p: parserlike<T>) => toParser((source: stream) => {\n source.push();\n const res = toParser(p)(source);\n source.pop_rollback();\n return res;\n});\n\nexport const anych = (opts?: { but: parserlike<unknown> }) => toParser((source: stream) => {\n if (opts?.but) {\n const res = peek(opts.but)(source);\n if (res.type == 'ok') {\n return err(0, 0, \"\");\n }\n }\n const res = source.next()\n return res ? ok(res) : err(0, 0, \"\");\n});\n","\nexport type stream = {\n row: number,\n col: number,\n drop_ws: boolean,\n next: () => string | null,\n push: () => void,\n pop_continue: () => void,\n pop_rollback: () => void,\n};\n\nclass string_stream {\n row: number = 1;\n col: number = 1;\n idx: number = 0;\n\n stack: {\n row: number,\n col: number,\n idx: number,\n }[] = [];\n\n constructor(public source: string, public drop_ws: boolean = true) {}\n\n next(): string | null {\n if (this.idx == this.source.length) {\n return null;\n }\n const ch = this.source[this.idx++];\n this.col++;\n if (ch == '\\n') {\n this.row++;\n this.col = 1;\n }\n\n if (this.drop_ws && ch.trim() === \"\") {\n return this.next();\n } else {\n return ch;\n }\n }\n\n push() {\n this.stack.push({\n row: this.row, col: this.col, idx: this.idx,\n })\n }\n\n pop_continue() {\n this.stack.pop();\n }\n\n pop_rollback() {\n const x = this.stack.pop()!;\n this.row = x.row;\n this.col = x.col;\n this.idx = x.idx;\n }\n}\n\nexport const fromString = (source: string): stream => {\n return new string_stream(source);\n}\n"],"names":["ok","res","type","err","row","col","msg","toParser","pl","str","fn_","map","fnTransform","source","match","lex","i","length","next","p","drop_ws","keepWs","ws","prev_drop_ws","push","ch","trim","pop_rollback","pop_continue","attempt","parser","range","start","end","either","_len","arguments","parsers","Array","_key","_i","_parsers","seq","_len2","_key2","_i2","_parsers2","res_","map2","fn","x","apply","many","_res","some","ft","rt","concat","digit","nat","val","parseInt","join","maybe","int","sign","lower","upper","alpha","alnum","noop","_","peek","string_stream","this","_proto","prototype","idx","stack","pop","opts","but","operator","operand","makeNode","left","rights","reduce","acc","_ref","_rights$i","thunk","item","sep","allowTrailingSep"],"mappings":"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"}