@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 +1 -1
- package/dist/base.d.ts.map +1 -1
- package/dist/index.js +17 -4
- package/dist/lib.d.ts +2 -2
- package/dist/lib.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/base.ts +11 -11
- package/src/lib.ts +15 -3
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
|
|
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
|
package/dist/base.d.ts.map
CHANGED
|
@@ -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,
|
|
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
|
-
|
|
37
|
-
|
|
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
|
|
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
|
-
|
|
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":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAGjD,eAAO,MAAM,OAAO,GAAI,CAAC,EAAE,QAAQ,UAAU,CAAC,CAAC,CAAC,KAAG,MAAM,CAAC,CAAC,CAUvD,CAAC;AAEL,eAAO,MAAM,KAAK,GAAI,OAAO,MAAM,EAAE,KAAK,MAAM,KAAG,MAAM,CAAC,MAAM,CAM5D,CAAC;AAEL,eAAO,MAAM,MAAM,GAAI,EAAE,SAAS,GAAG,EAAE,EAAE,GAAG,SAAS,GAAG,CAAC,IAAI,MAAM,EAAE,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAE,KAAG,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAS3G,CAAC;AAEL,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,GAAG,EAAE,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG;IACpD,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC;CACnD,CAAC;AAEF,eAAO,MAAM,GAAG,GAAI,EAAE,SAAS,GAAG,EAAE,EAAE,GAAG,SAAS,GAAG,CAAC,IAAI,MAAM,EAAE,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAE,KAAG,UAAU,CAAC,EAAE,CAgBvG,CAAA;AAED,eAAO,MAAM,IAAI,GAAI,CAAC,EAAE,QAAQ,UAAU,CAAC,CAAC,CAAC,KAAG,MAAM,CAAC,CAAC,EAAE,CAatD,CAAC;AAEL,eAAO,MAAM,IAAI,GAAI,CAAC,EAAE,QAAQ,UAAU,CAAC,CAAC,CAAC,KAAG,MAAM,CAAC,CAAC,EAAE,CACD,CAAC;AAE1D,eAAO,MAAM,KAAK,gBAAkB,CAAC;AAErC,eAAO,MAAM,GAAG,gBACO,CAAC;AAExB,eAAO,MAAM,KAAK,GAAI,CAAC,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,qBAIrC,CAAC;AAEL,eAAO,MAAM,GAAG,gBAMd,CAAC;AAEH,eAAO,MAAM,KAAK,gBAAkB,CAAC;AACrC,eAAO,MAAM,KAAK,gBAAkB,CAAC;AACrC,eAAO,MAAM,KAAK,gBAAuB,CAAC;AAC1C,eAAO,MAAM,KAAK,gBAAuB,CAAC;AAE1C,eAAO,MAAM,KAAK,GAAI,CAAC,EAAE,CAAC,EAAE,MAAM,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,cAAa,OAAO,GAAG,QAAQ,GAAG,
|
|
1
|
+
{"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
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
|
-
|
|
71
|
-
|
|
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
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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
|
-
|
|
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;
|