@spakhm/ts-parsec 0.4.1 → 0.4.3

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/dist/base.d.ts CHANGED
@@ -22,7 +22,7 @@ export declare function toParser<T extends string>(p: T): parser<T>;
22
22
  export declare function toParser<T>(p: parserlike<T>): parser<T>;
23
23
  export declare const str: <T extends string>(match: T) => parser<T>;
24
24
  export declare const lex: <T>(p: parserlike<T>) => parser<T>;
25
- export declare const lexMode: (wsMode: ws_mode) => <T>(p: parserlike<T>) => parser<T>;
25
+ export declare const lexMode: <T>(wsMode: ws_mode, p: parserlike<T>) => parser<T>;
26
26
  export declare const ws: (wsMode: "drop_all" | "keep_newlines") => parser<{}>;
27
27
  export declare const fwd: <T>(thunk: (() => parserlike<T>)) => parser<T>;
28
28
  //# sourceMappingURL=base.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAKhD,MAAM,MAAM,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,CAAC,CAAC;CAAE,GAAG;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE,CAAC,CAAC;CAAE,CAAC;AAC9E,MAAM,MAAM,YAAY,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;CAAE,CAAC;AAEtE,eAAO,MAAM,EAAE,GAAI,CAAC,EAAE,KAAK,CAAC,KAAG,MAAM,CAAC,CAAC,EAAE,KAAK,CAA2B,CAAC;AAC1E,eAAO,MAAM,GAAG,GAAI,KAAK,MAAM,EAAE,KAAK,MAAM,EAAE,KAAK,MAAM,KAAG,MAAM,CAAC,KAAK,EAAE,YAAY,CAC3C,CAAC;AAK5C,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;AACtE,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG;IACpC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC;CAC9C,CAAC;AACF,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;AAK7D,wBAAgB,QAAQ,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AAC5D,wBAAgB,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AA6BzD,eAAO,MAAM,GAAG,GAAI,CAAC,SAAS,MAAM,EAAE,OAAO,CAAC,KAAG,MAAM,CAAC,CAAC,CAQpD,CAAC;AAEN,eAAO,MAAM,GAAG,GAAI,CAAC,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,cAUrC,CAAC;AAEH,eAAO,MAAM,OAAO,GAAI,QAAQ,OAAO,MACpC,CAAC,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,cAOhB,CAAC;AAEP,eAAO,MAAM,EAAE,GAAI,QAAQ,UAAU,GAAG,eAAe,eAqBnD,CAAC;AAKL,eAAO,MAAM,GAAG,GAAI,CAAC,EAAE,OAAO,CAAC,MAAM,UAAU,CAAC,CAAC,CAAC,CAAC,KAAG,MAAM,CAAC,CAAC,CACL,CAAC"}
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAKhD,MAAM,MAAM,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,CAAC,CAAC;CAAE,GAAG;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE,CAAC,CAAC;CAAE,CAAC;AAC9E,MAAM,MAAM,YAAY,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;CAAE,CAAC;AAEtE,eAAO,MAAM,EAAE,GAAI,CAAC,EAAE,KAAK,CAAC,KAAG,MAAM,CAAC,CAAC,EAAE,KAAK,CAA2B,CAAC;AAC1E,eAAO,MAAM,GAAG,GAAI,KAAK,MAAM,EAAE,KAAK,MAAM,EAAE,KAAK,MAAM,KAAG,MAAM,CAAC,KAAK,EAAE,YAAY,CAC3C,CAAC;AAK5C,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;AACtE,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG;IACpC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC;CAC9C,CAAC;AACF,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;AAK7D,wBAAgB,QAAQ,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AAC5D,wBAAgB,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AA6BzD,eAAO,MAAM,GAAG,GAAI,CAAC,SAAS,MAAM,EAAE,OAAO,CAAC,KAAG,MAAM,CAAC,CAAC,CAQpD,CAAC;AAEN,eAAO,MAAM,GAAG,GAAI,CAAC,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,cAWrC,CAAC;AAEH,eAAO,MAAM,OAAO,GAAI,CAAC,EAAE,QAAQ,OAAO,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,cAOxD,CAAC;AAEL,eAAO,MAAM,EAAE,GAAI,QAAQ,UAAU,GAAG,eAAe,eAqBnD,CAAC;AAKL,eAAO,MAAM,GAAG,GAAI,CAAC,EAAE,OAAO,CAAC,MAAM,UAAU,CAAC,CAAC,CAAC,CAAC,KAAG,MAAM,CAAC,CAAC,CACL,CAAC"}
package/dist/index.js CHANGED
@@ -33,13 +33,14 @@ var lex = (p) => toParser((source) => {
33
33
  if (source.ws_mode === "keep_all") {
34
34
  return toParser(p)(source);
35
35
  } else {
36
- return lexMode("keep_all")((source2) => {
37
- ws("drop_all")(source2);
36
+ const wsMode = source.ws_mode;
37
+ return lexMode("keep_all", (source2) => {
38
+ ws(wsMode)(source2);
38
39
  return toParser(p)(source2);
39
40
  })(source);
40
41
  }
41
42
  });
42
- var lexMode = (wsMode) => (p) => toParser((source) => {
43
+ var lexMode = (wsMode, p) => toParser((source) => {
43
44
  const prev_ws_mode = source.ws_mode;
44
45
  source.ws_mode = wsMode;
45
46
  const res = toParser(p)(source);
@@ -146,14 +147,26 @@ var sepBy = (item, sep, trailingSep = "allow") => toParser((source) => {
146
147
  res.push(res_.res);
147
148
  }
148
149
  while (true) {
150
+ source.push();
149
151
  const sepres_ = attempt(sep)(source);
150
152
  if (sepres_.type == "err") {
153
+ source.pop_rollback();
151
154
  return trailingSep === "require" ? err(0, 0, "") : ok(res);
152
155
  }
153
156
  const res_2 = attempt(item)(source);
154
157
  if (res_2.type == "err") {
155
- return trailingSep === "forbid" ? err(0, 0, "") : ok(res);
158
+ if (trailingSep === "forbid") {
159
+ source.pop_rollback();
160
+ return err(0, 0, "");
161
+ } else if (trailingSep === "leave") {
162
+ source.pop_rollback();
163
+ return ok(res);
164
+ } else {
165
+ source.pop_continue();
166
+ return ok(res);
167
+ }
156
168
  } else {
169
+ source.pop_continue();
157
170
  res.push(res_2.res);
158
171
  }
159
172
  }
package/dist/lib.d.ts CHANGED
@@ -16,8 +16,8 @@ export declare const lower: parser<string>;
16
16
  export declare const upper: parser<string>;
17
17
  export declare const alpha: parser<string>;
18
18
  export declare const alnum: parser<string>;
19
- export declare const sepBy: <T, U>(item: parserlike<T>, sep: parserlike<U>, trailingSep?: "allow" | "forbid" | "require") => parser<T[]>;
20
- export declare const sepBy1: <T, U>(item: parserlike<T>, sep: parserlike<U>, trailingSep?: "allow" | "forbid" | "require") => parser<T[]>;
19
+ export declare const sepBy: <T, U>(item: parserlike<T>, sep: parserlike<U>, trailingSep?: "allow" | "forbid" | "require" | "leave") => parser<T[]>;
20
+ export declare const sepBy1: <T, U>(item: parserlike<T>, sep: parserlike<U>, trailingSep?: "allow" | "forbid" | "require" | "leave") => parser<T[]>;
21
21
  export declare function binop<O, D, N>(operator: parserlike<O>, operand: parserlike<D>, makeNode: (op: O, left: D | N, right: D) => N): parser<N | D>;
22
22
  export declare function binopr<O, D, N>(operator: parserlike<O>, operand: parserlike<D>, makeNode: (op: O, left: D, right: D | N) => N): parser<N | D>;
23
23
  export declare const noop: parser<boolean>;
package/dist/lib.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spakhm/ts-parsec",
3
- "version": "0.4.1",
3
+ "version": "0.4.3",
4
4
  "license": "MIT",
5
5
  "author": "Slava Akhmechet",
6
6
  "type": "module",
package/src/base.ts CHANGED
@@ -67,22 +67,22 @@ export const lex = <T>(p: parserlike<T>) => toParser((source: stream) => {
67
67
  // nested lex call, don't drop more whitespace
68
68
  return toParser(p)(source);
69
69
  } else {
70
- return lexMode('keep_all')((source: stream) => {
71
- ws('drop_all')(source); // lex always drops all ws including newlines
70
+ const wsMode = source.ws_mode;
71
+ return lexMode('keep_all', (source: stream) => {
72
+ ws(wsMode)(source); // respect the current ws_mode
72
73
  return toParser(p)(source);
73
74
  })(source);
74
75
  }
75
76
  });
76
77
 
77
- export const lexMode = (wsMode: ws_mode) =>
78
- <T>(p: parserlike<T>) =>
79
- toParser((source: stream) => {
80
- const prev_ws_mode = source.ws_mode;
81
- source.ws_mode = wsMode;
82
- const res = toParser(p)(source);
83
- source.ws_mode = prev_ws_mode;
84
- return res;
85
- });
78
+ export const lexMode = <T>(wsMode: ws_mode, p: parserlike<T>) =>
79
+ toParser((source: stream) => {
80
+ const prev_ws_mode = source.ws_mode;
81
+ source.ws_mode = wsMode;
82
+ const res = toParser(p)(source);
83
+ source.ws_mode = prev_ws_mode;
84
+ return res;
85
+ });
86
86
 
87
87
  export const ws = (wsMode: 'drop_all' | 'keep_newlines') =>
88
88
  toParser((source: stream) => {
package/src/lib.ts CHANGED
@@ -97,7 +97,7 @@ export const upper = range('A', 'Z');
97
97
  export const alpha = either(lower, upper);
98
98
  export const alnum = either(alpha, digit);
99
99
 
100
- export const sepBy = <T, U>(item: parserlike<T>, sep: parserlike<U>, trailingSep: 'allow' | 'forbid' | 'require' = 'allow'): parser<T[]> =>
100
+ export const sepBy = <T, U>(item: parserlike<T>, sep: parserlike<U>, trailingSep: 'allow' | 'forbid' | 'require' | 'leave' = 'allow'): parser<T[]> =>
101
101
  toParser((source: stream) => {
102
102
  const res: T[] = [];
103
103
 
@@ -109,21 +109,33 @@ export const sepBy = <T, U>(item: parserlike<T>, sep: parserlike<U>, trailingSep
109
109
  }
110
110
 
111
111
  while (true) {
112
+ source.push();
112
113
  const sepres_ = attempt(sep)(source);
113
114
  if (sepres_.type == 'err') {
115
+ source.pop_rollback();
114
116
  return trailingSep === 'require' ? err(0, 0, '') : ok(res);
115
117
  }
116
118
 
117
119
  const res_ = attempt(item)(source);
118
120
  if (res_.type == 'err') {
119
- return trailingSep === 'forbid' ? err(0, 0, '') : ok(res);
121
+ if (trailingSep === 'forbid') {
122
+ source.pop_rollback();
123
+ return err(0, 0, '');
124
+ } else if (trailingSep === 'leave') {
125
+ source.pop_rollback();
126
+ return ok(res);
127
+ } else {
128
+ source.pop_continue();
129
+ return ok(res);
130
+ }
120
131
  } else {
132
+ source.pop_continue();
121
133
  res.push(res_.res);
122
134
  }
123
135
  }
124
136
  });
125
137
 
126
- export const sepBy1 = <T, U>(item: parserlike<T>, sep: parserlike<U>, trailingSep: 'allow' | 'forbid' | 'require' = 'allow'): parser<T[]> =>
138
+ export const sepBy1 = <T, U>(item: parserlike<T>, sep: parserlike<U>, trailingSep: 'allow' | 'forbid' | 'require' | 'leave' = 'allow'): parser<T[]> =>
127
139
  toParser((source: stream) => {
128
140
  const res = sepBy(item, sep, trailingSep)(source);
129
141
  if (res.type == 'err') return res;