tarsec 0.0.7 → 0.0.9

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 (44) hide show
  1. package/README.md +6 -6
  2. package/dist/combinators.d.ts +8 -6
  3. package/dist/combinators.js +130 -57
  4. package/dist/lib/combinators.d.ts +8 -6
  5. package/dist/lib/combinators.js +130 -57
  6. package/dist/lib/parsers.d.ts +1 -1
  7. package/dist/lib/parsers.js +12 -39
  8. package/dist/lib/trace.d.ts +3 -3
  9. package/dist/lib/trace.js +1 -1
  10. package/dist/lib/types.d.ts +25 -9
  11. package/dist/lib/types.js +37 -0
  12. package/dist/parsers.d.ts +1 -1
  13. package/dist/parsers.js +12 -39
  14. package/dist/trace.d.ts +3 -3
  15. package/dist/trace.js +1 -1
  16. package/dist/types.d.ts +25 -9
  17. package/dist/types.js +37 -0
  18. package/package.json +3 -3
  19. package/dist/lib/parsers.test.d.ts +0 -1
  20. package/dist/lib/parsers.test.js +0 -235
  21. package/dist/tests/combinators/many.test.d.ts +0 -1
  22. package/dist/tests/combinators/many.test.js +0 -27
  23. package/dist/tests/combinators/many1.test.d.ts +0 -1
  24. package/dist/tests/combinators/many1.test.js +0 -27
  25. package/dist/tests/combinators/or.test.d.ts +0 -1
  26. package/dist/tests/combinators/or.test.js +0 -31
  27. package/dist/tests/combinators/seq.test.d.ts +0 -1
  28. package/dist/tests/combinators/seq.test.js +0 -41
  29. package/dist/tests/integration/hello_capture.test.d.ts +0 -1
  30. package/dist/tests/integration/hello_capture.test.js +0 -30
  31. package/dist/tests/integration/hello_world.test.d.ts +0 -1
  32. package/dist/tests/integration/hello_world.test.js +0 -23
  33. package/dist/tests/parsers/char.test.d.ts +0 -1
  34. package/dist/tests/parsers/char.test.js +0 -35
  35. package/dist/tests/parsers/noneOf.test.d.ts +0 -1
  36. package/dist/tests/parsers/noneOf.test.js +0 -26
  37. package/dist/tests/parsers/oneOf.test.d.ts +0 -1
  38. package/dist/tests/parsers/oneOf.test.js +0 -26
  39. package/dist/tests/parsers/str.test.d.ts +0 -1
  40. package/dist/tests/parsers/str.test.js +0 -38
  41. package/dist/vitest.config.d.ts +0 -3
  42. package/dist/vitest.config.js +0 -34
  43. package/dist/vitest.globals.d.ts +0 -18
  44. package/dist/vitest.globals.js +0 -25
package/README.md CHANGED
@@ -19,14 +19,14 @@ npm install tarsec
19
19
  ## Hello world
20
20
 
21
21
  ```ts
22
- import { str, seq, space } from "tarsec";
22
+ import { getResults, str, seq, space } from "tarsec";
23
23
 
24
24
  // define a parser
25
25
  const parser = seq([
26
26
  str("hello"),
27
27
  space,
28
28
  str("world")
29
- ]);
29
+ ], getResults);
30
30
 
31
31
  // then use it
32
32
  parser("hello world"); // success
@@ -55,12 +55,12 @@ const parser = seq([
55
55
  */
56
56
  capture(many1WithJoin(noneOf("!")), "person"),
57
57
  char("!"),
58
- ]);
58
+ ], getCaptures);
59
59
 
60
60
  // parse
61
- const result = parser("hello adit!");
61
+ const parsed = parser("hello adit!");
62
62
 
63
- console.log(result.success); // true
64
- console.log(result.captures); // { person: "adit" }
63
+ console.log(parsed.success); // true
64
+ console.log(parsed.result); // { person: "adit" }
65
65
  ```
66
66
 
@@ -1,15 +1,17 @@
1
- import { Parser } from "./types";
1
+ import { CaptureParser, GeneralParser, MergedCaptures, MergedResults, Parser, Prettify } from "./types";
2
2
  export declare function many<T>(parser: Parser<T>): Parser<T[]>;
3
3
  export declare function many1<T>(parser: Parser<T>): Parser<T[]>;
4
+ export declare function count<T>(parser: Parser<T>): Parser<number>;
4
5
  export declare function manyWithJoin(parser: Parser<string>): Parser<string>;
5
6
  export declare function many1WithJoin(parser: Parser<string>): Parser<string>;
6
- export declare function or<T>(parsers: Parser<T>[], name?: string): Parser<T>;
7
+ export declare function or<const T extends readonly Parser<any>[]>(parsers: T, name?: string): Parser<MergedResults<T>>;
7
8
  export declare function optional<T>(parser: Parser<T>): Parser<T | null>;
8
9
  export declare function not(parser: Parser<any>): Parser<null>;
9
10
  export declare function between<O, C, P>(open: Parser<O>, close: Parser<C>, parser: Parser<P>): Parser<P>;
10
11
  export declare function sepBy<S, P>(separator: Parser<S>, parser: Parser<P>): Parser<P[]>;
11
- export declare function seq<M, C extends string>(parsers: Parser<M>[], name?: string): Parser<M[], C>;
12
- export declare function capture<M, C extends string>(parser: Parser<M>, name: string): Parser<M, C>;
13
- export declare function captureCaptures<M, C extends string>(parser: Parser<M>, name: string): Parser<M, C>;
14
- export declare function shapeCaptures<M, C extends string>(parser: Parser<M>, func: (captures: Record<string, any>) => Record<string, any>, name: string): Parser<M, C>;
12
+ export declare function getResults<R, C>(results: R, captures: C): R;
13
+ export declare function getCaptures<R, C>(results: R, captures: C): C;
14
+ export declare function seq<const T extends readonly GeneralParser<any, any>[], U>(parsers: T, transform: (results: MergedResults<T>[], captures: MergedCaptures<T>) => U, debugName?: string): Parser<U>;
15
+ export declare function capture<T, const S extends string>(parser: Parser<T>, name: S): CaptureParser<T, Record<S, T>>;
16
+ export declare function wrap<T, const S extends string>(parser: Parser<T>, name: S): Parser<Prettify<Record<S, T>>>;
15
17
  export declare function transform<T, X>(parser: Parser<T>, transformerFunc: (x: T) => X): Parser<X>;
@@ -4,25 +4,26 @@
4
4
  if (v !== undefined) module.exports = v;
5
5
  }
6
6
  else if (typeof define === "function" && define.amd) {
7
- define(["require", "exports", "./trace", "./utils"], factory);
7
+ define(["require", "exports", "./trace", "./types", "./utils"], factory);
8
8
  }
9
9
  })(function (require, exports) {
10
10
  "use strict";
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.transform = exports.shapeCaptures = exports.captureCaptures = exports.capture = exports.seq = exports.sepBy = exports.between = exports.not = exports.optional = exports.or = exports.many1WithJoin = exports.manyWithJoin = exports.many1 = exports.many = void 0;
12
+ exports.transform = exports.wrap = exports.capture = exports.seq = exports.getCaptures = exports.getResults = exports.sepBy = exports.between = exports.not = exports.optional = exports.or = exports.many1WithJoin = exports.manyWithJoin = exports.count = exports.many1 = exports.many = void 0;
13
13
  const trace_1 = require("./trace");
14
+ const types_1 = require("./types");
14
15
  const utils_1 = require("./utils");
15
16
  function many(parser) {
16
17
  return (0, trace_1.trace)("many", (input) => {
17
- let match = [];
18
+ let results = [];
18
19
  let rest = input;
19
20
  while (true) {
20
- let result = parser(rest);
21
- if (!result.success) {
22
- return { success: true, match, rest };
21
+ let parsed = parser(rest);
22
+ if (!parsed.success) {
23
+ return (0, types_1.success)(results, rest);
23
24
  }
24
- match.push(result.match);
25
- rest = result.rest;
25
+ results.push(parsed.result);
26
+ rest = parsed.rest;
26
27
  }
27
28
  });
28
29
  }
@@ -42,6 +43,16 @@
42
43
  });
43
44
  }
44
45
  exports.many1 = many1;
46
+ function count(parser) {
47
+ return (0, trace_1.trace)("count", (input) => {
48
+ const result = many(parser)(input);
49
+ if (result.success) {
50
+ return (0, types_1.success)(result.result.length, result.rest);
51
+ }
52
+ return result;
53
+ });
54
+ }
55
+ exports.count = count;
45
56
  function manyWithJoin(parser) {
46
57
  return transform(many(parser), (x) => x.join(""));
47
58
  }
@@ -50,6 +61,10 @@
50
61
  return transform(many1(parser), (x) => x.join(""));
51
62
  }
52
63
  exports.many1WithJoin = many1WithJoin;
64
+ /* seq<, U>(
65
+ parsers: T,
66
+ transform: (results: MergedResults<T>[], captures: MergedCaptures<T>) => U,
67
+ */
53
68
  function or(parsers, name = "") {
54
69
  return (0, trace_1.trace)(`or(${name})`, (input) => {
55
70
  for (let parser of parsers) {
@@ -58,11 +73,7 @@
58
73
  return result;
59
74
  }
60
75
  }
61
- return {
62
- success: false,
63
- rest: input,
64
- message: "all parsers failed",
65
- };
76
+ return (0, types_1.failure)(`all parsers failed`, input);
66
77
  });
67
78
  }
68
79
  exports.or = or;
@@ -72,7 +83,7 @@
72
83
  if (result.success) {
73
84
  return result;
74
85
  }
75
- return { success: true, match: null, rest: input };
86
+ return (0, types_1.success)(null, input);
76
87
  });
77
88
  }
78
89
  exports.optional = optional;
@@ -86,7 +97,7 @@
86
97
  message: "unexpected match",
87
98
  };
88
99
  }
89
- return { success: true, match: null, rest: input };
100
+ return (0, types_1.success)(null, input);
90
101
  });
91
102
  }
92
103
  exports.not = not;
@@ -104,95 +115,157 @@
104
115
  if (!result2.success) {
105
116
  return result2;
106
117
  }
107
- return { success: true, match: parserResult.match, rest: result2.rest };
118
+ return (0, types_1.success)(parserResult.result, result2.rest);
108
119
  };
109
120
  }
110
121
  exports.between = between;
111
122
  function sepBy(separator, parser) {
112
123
  return (input) => {
113
- let match = [];
124
+ let results = [];
114
125
  let rest = input;
115
126
  while (true) {
116
127
  const result = parser(rest);
117
128
  if (!result.success) {
118
- return { success: true, match, rest };
129
+ return (0, types_1.success)(results, rest);
119
130
  }
120
- match.push(result.match);
131
+ results.push(result.result);
121
132
  rest = result.rest;
122
133
  const sepResult = separator(rest);
123
134
  if (!sepResult.success) {
124
- return { success: true, match, rest };
135
+ return (0, types_1.success)(results, rest);
125
136
  }
126
137
  rest = sepResult.rest;
127
138
  }
128
139
  };
129
140
  }
130
141
  exports.sepBy = sepBy;
131
- function seq(parsers, name = "") {
132
- return (0, trace_1.trace)(`seq(${name})`, (input) => {
133
- let match = [];
142
+ function getResults(results, captures) {
143
+ return results;
144
+ }
145
+ exports.getResults = getResults;
146
+ function getCaptures(results, captures) {
147
+ return captures;
148
+ }
149
+ exports.getCaptures = getCaptures;
150
+ function seq(parsers, transform, debugName = "") {
151
+ return (0, trace_1.trace)(`seq(${debugName})`, (input) => {
152
+ const results = [];
134
153
  let rest = input;
135
- // @ts-ignore
136
- let captures = {};
154
+ const captures = {};
137
155
  for (let parser of parsers) {
138
- let result = parser(rest);
139
- if (!result.success) {
140
- return result;
156
+ let parsed = parser(rest);
157
+ if (!parsed.success) {
158
+ return parsed;
141
159
  }
142
- match.push(result.match);
143
- rest = result.rest;
144
- if (result.captures) {
145
- captures = (0, utils_1.mergeCaptures)(captures, result.captures);
160
+ results.push(parsed.result);
161
+ rest = parsed.rest;
162
+ if ((0, types_1.isCaptureResult)(parsed)) {
163
+ for (const key in parsed.captures) {
164
+ captures[key] = parsed.captures[key];
165
+ }
146
166
  }
147
167
  }
148
- return { success: true, match, rest, captures };
168
+ const result = transform(results, captures);
169
+ return (0, types_1.success)(result, rest);
149
170
  });
150
171
  }
151
172
  exports.seq = seq;
152
173
  function capture(parser, name) {
153
- return (0, trace_1.trace)(`captures(${(0, utils_1.escape)(name)})`, (input) => {
174
+ return (0, trace_1.trace)(`capture(${(0, utils_1.escape)(name)})`, (input) => {
154
175
  let result = parser(input);
155
176
  if (result.success) {
156
177
  const captures = {
157
- [name]: result.match,
178
+ [name]: result.result,
158
179
  };
159
- return Object.assign(Object.assign({}, result), { captures: (0, utils_1.mergeCaptures)(result.captures || {}, captures) });
180
+ return Object.assign(Object.assign({}, result), { captures });
160
181
  }
161
182
  return result;
162
183
  });
163
184
  }
164
185
  exports.capture = capture;
165
- function captureCaptures(parser, name) {
166
- return (0, trace_1.trace)(`captures(${(0, utils_1.escape)(name)})`, (input) => {
186
+ function wrap(parser, name) {
187
+ return (0, trace_1.trace)(`capture(${(0, utils_1.escape)(name)})`, (input) => {
167
188
  let result = parser(input);
168
189
  if (result.success) {
169
- const captures = {
170
- [name]: result.captures,
171
- };
172
- return Object.assign(Object.assign({}, result), { captures: (0, utils_1.mergeCaptures)(result.captures || {}, captures) });
190
+ return Object.assign(Object.assign({}, result), { result: {
191
+ [name]: result.result,
192
+ } });
173
193
  }
174
194
  return result;
175
195
  });
176
196
  }
177
- exports.captureCaptures = captureCaptures;
178
- function shapeCaptures(parser, func, name) {
179
- return (0, trace_1.trace)(`captures(${(0, utils_1.escape)(name)})`, (input) => {
180
- let result = parser(input);
181
- if (result.success) {
182
- const captures = result.captures || {};
183
- return Object.assign(Object.assign({}, result), { captures: func(captures) });
184
- }
185
- return result;
186
- });
197
+ exports.wrap = wrap;
198
+ /*
199
+ export function setCapturesAsMatch<M, C extends PlainObject>(
200
+ parser: Parser<M, C>
201
+ ): Parser<C> {
202
+ return trace(`setCapturesAsMatch`, (input: string) => {
203
+ let result = parser(input);
204
+ if (result.success) {
205
+ return {
206
+ ...result,
207
+ match: result.captures as any,
208
+ captures: {},
209
+ };
210
+ }
211
+ return result;
212
+ });
213
+ }
214
+
215
+ export function captureCaptures<
216
+ M,
217
+ C extends PlainObject,
218
+ const S extends string
219
+ >(parser: Parser<M, C>, name: S): Parser<C, Record<S, C>> {
220
+ return trace(`captureCaptures(${escape(name)})`, (input: string) => {
221
+ return capture(setCapturesAsMatch(parser), name)(input);
222
+ });
223
+ } */
224
+ /* export function captureCaptures<M, C extends string>(
225
+ parser: Parser<M>,
226
+ name: string
227
+ ): Parser<M, C> {
228
+ return trace(`captures(${escape(name)})`, (input: string) => {
229
+ let result = parser(input);
230
+ if (result.success) {
231
+ const captures: Record<string, any> = {
232
+ [name]: result.captures,
233
+ };
234
+ return {
235
+ ...result,
236
+ captures: mergeCaptures(result.captures || {}, captures),
237
+ };
238
+ }
239
+ return result;
240
+ });
187
241
  }
188
- exports.shapeCaptures = shapeCaptures;
242
+
243
+ */
244
+ /* export function shapeCaptures<M, C extends string>(
245
+ parser: Parser<M>,
246
+ func: (captures: Record<string, any>) => Record<string, any>,
247
+ name: string
248
+ ): Parser<M, C> {
249
+ return trace(`captures(${escape(name)})`, (input: string) => {
250
+ let result = parser(input);
251
+ if (result.success) {
252
+ const captures: Record<string, any> = result.captures || {};
253
+
254
+ return {
255
+ ...result,
256
+ captures: func(captures),
257
+ };
258
+ }
259
+ return result;
260
+ });
261
+ } */
189
262
  function transform(parser, transformerFunc) {
190
263
  return (0, trace_1.trace)(`transform(${transformerFunc})`, (input) => {
191
- let result = parser(input);
192
- if (result.success) {
193
- return Object.assign(Object.assign({}, result), { match: transformerFunc(result.match) });
264
+ let parsed = parser(input);
265
+ if (parsed.success) {
266
+ return Object.assign(Object.assign({}, parsed), { result: transformerFunc(parsed.result) });
194
267
  }
195
- return result;
268
+ return parsed;
196
269
  });
197
270
  }
198
271
  exports.transform = transform;
@@ -1,15 +1,17 @@
1
- import { Parser } from "./types";
1
+ import { CaptureParser, GeneralParser, MergedCaptures, MergedResults, Parser, Prettify } from "./types";
2
2
  export declare function many<T>(parser: Parser<T>): Parser<T[]>;
3
3
  export declare function many1<T>(parser: Parser<T>): Parser<T[]>;
4
+ export declare function count<T>(parser: Parser<T>): Parser<number>;
4
5
  export declare function manyWithJoin(parser: Parser<string>): Parser<string>;
5
6
  export declare function many1WithJoin(parser: Parser<string>): Parser<string>;
6
- export declare function or<T>(parsers: Parser<T>[], name?: string): Parser<T>;
7
+ export declare function or<const T extends readonly Parser<any>[]>(parsers: T, name?: string): Parser<MergedResults<T>>;
7
8
  export declare function optional<T>(parser: Parser<T>): Parser<T | null>;
8
9
  export declare function not(parser: Parser<any>): Parser<null>;
9
10
  export declare function between<O, C, P>(open: Parser<O>, close: Parser<C>, parser: Parser<P>): Parser<P>;
10
11
  export declare function sepBy<S, P>(separator: Parser<S>, parser: Parser<P>): Parser<P[]>;
11
- export declare function seq<M, C extends string>(parsers: Parser<M>[], name?: string): Parser<M[], C>;
12
- export declare function capture<M, C extends string>(parser: Parser<M>, name: string): Parser<M, C>;
13
- export declare function captureCaptures<M, C extends string>(parser: Parser<M>, name: string): Parser<M, C>;
14
- export declare function shapeCaptures<M, C extends string>(parser: Parser<M>, func: (captures: Record<string, any>) => Record<string, any>, name: string): Parser<M, C>;
12
+ export declare function getResults<R, C>(results: R, captures: C): R;
13
+ export declare function getCaptures<R, C>(results: R, captures: C): C;
14
+ export declare function seq<const T extends readonly GeneralParser<any, any>[], U>(parsers: T, transform: (results: MergedResults<T>[], captures: MergedCaptures<T>) => U, debugName?: string): Parser<U>;
15
+ export declare function capture<T, const S extends string>(parser: Parser<T>, name: S): CaptureParser<T, Record<S, T>>;
16
+ export declare function wrap<T, const S extends string>(parser: Parser<T>, name: S): Parser<Prettify<Record<S, T>>>;
15
17
  export declare function transform<T, X>(parser: Parser<T>, transformerFunc: (x: T) => X): Parser<X>;