@spakhm/ts-parsec 0.1.6 → 0.1.8

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/README.md CHANGED
@@ -1,5 +1,6 @@
1
1
 
2
- This is a parser combinator library written in typescript. Design
2
+ This is a parser combinator library written in typescript. You can
3
+ find a writeup about it [here](https://www.spakhm.com/ts-parsec). Design
3
4
  goals:
4
5
 
5
6
  - Produces recursive descent parsers capable of parsing PEG grammars.
package/dist/lib.d.ts CHANGED
@@ -22,3 +22,6 @@ export declare function binopr<O, D, N>(operator: parserlike<O>, operand: parser
22
22
  export declare const noop: parser<boolean>;
23
23
  export declare const not: <T>(p: parserlike<T>) => parser<null>;
24
24
  export declare const peek: <T>(p: parserlike<T>) => parser<T>;
25
+ export declare const anych: (opts?: {
26
+ but: parserlike<unknown>;
27
+ } | undefined) => parser<string>;
@@ -279,6 +279,18 @@ var peek = function peek(p) {
279
279
  return res;
280
280
  });
281
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
+ };
282
294
 
283
295
  var string_stream = /*#__PURE__*/function () {
284
296
  function string_stream(source, drop_ws) {
@@ -333,6 +345,7 @@ var fromString = function fromString(source) {
333
345
 
334
346
  exports.alnum = alnum;
335
347
  exports.alpha = alpha;
348
+ exports.anych = anych;
336
349
  exports.attempt = attempt;
337
350
  exports.binop = binop;
338
351
  exports.binopr = binopr;
@@ -1 +1 @@
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 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","string_stream","_proto","prototype","idx","stack","pop","fromString"],"mappings":"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"}
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 +1,2 @@
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)}))},d=f(v(c("-","+")),l).map2((function(r,t){return"-"===r?-t:t})),k=s("a","z"),y=s("A","Z"),w=c(k,y),m=c(w,x),_=n((function(t){return r(!0)})),g=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.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 g(r)},exports.fwd=function(r){return n((function(t){return n(r())(t)}))},exports.int=d,exports.keepWs=u,exports.lex=o,exports.lower=k,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=function(r){return n((function(t){t.push();var e=n(r)(t);return t.pop_rollback(),e}))},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=y,exports.ws=i;
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
2
  //# sourceMappingURL=ts-parsec.cjs.production.min.js.map
@@ -1 +1 @@
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 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","_","string_stream","this","_proto","prototype","idx","stack","pop","operator","operand","makeNode","left","rights","reduce","acc","_ref","_rights$i","thunk","item","sep","allowTrailingSep"],"mappings":"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"}
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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"}
@@ -275,6 +275,18 @@ var peek = function peek(p) {
275
275
  return res;
276
276
  });
277
277
  };
278
+ var anych = function anych(opts) {
279
+ return toParser(function (source) {
280
+ if (opts != null && opts.but) {
281
+ var _res2 = peek(opts.but)(source);
282
+ if (_res2.type == 'ok') {
283
+ return err(0, 0, "");
284
+ }
285
+ }
286
+ var res = source.next();
287
+ return res ? ok(res) : err(0, 0, "");
288
+ });
289
+ };
278
290
 
279
291
  var string_stream = /*#__PURE__*/function () {
280
292
  function string_stream(source, drop_ws) {
@@ -327,5 +339,5 @@ var fromString = function fromString(source) {
327
339
  return new string_stream(source);
328
340
  };
329
341
 
330
- export { alnum, alpha, attempt, binop, binopr, digit, either, err, fromString, fwd, _int as int, keepWs, lex, lower, many, maybe, nat, noop, not, ok, peek, range, sepBy, seq, some, str, toParser, upper, ws };
342
+ export { alnum, alpha, anych, attempt, binop, binopr, digit, either, err, fromString, fwd, _int as int, keepWs, lex, lower, many, maybe, nat, noop, not, ok, peek, range, sepBy, seq, some, str, toParser, upper, ws };
331
343
  //# sourceMappingURL=ts-parsec.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ts-parsec.esm.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 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","string_stream","_proto","prototype","idx","stack","pop","fromString"],"mappings":"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"}
1
+ {"version":3,"file":"ts-parsec.esm.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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"}
package/package.json CHANGED
@@ -1 +1 @@
1
- {"version":"0.1.6","license":"MIT","main":"dist/index.js","typings":"dist/index.d.ts","files":["dist","src"],"engines":{"node":">=10"},"scripts":{"start":"tsdx watch","build":"tsdx build","test":"tsdx test","lint":"tsdx lint","prepare":"tsdx build","size":"size-limit","analyze":"size-limit --why"},"husky":{"hooks":{"pre-commit":"tsdx lint"}},"prettier":{"printWidth":80,"semi":true,"singleQuote":true,"trailingComma":"es5"},"name":"@spakhm/ts-parsec","author":"Slava Akhmechet","module":"dist/ts-parsec.esm.js","size-limit":[{"path":"dist/ts-parsec.cjs.production.min.js","limit":"10 KB"},{"path":"dist/ts-parsec.esm.js","limit":"10 KB"}],"devDependencies":{"@size-limit/preset-small-lib":"^11.1.6","husky":"^9.1.6","size-limit":"^11.1.6","tsdx":"^0.14.1","tslib":"^2.7.0","typescript":"^3.9.10"}}
1
+ {"version":"0.1.8","license":"MIT","main":"dist/index.js","typings":"dist/index.d.ts","files":["dist","src"],"engines":{"node":">=10"},"scripts":{"start":"tsdx watch","build":"tsdx build","test":"tsdx test","lint":"tsdx lint","prepare":"tsdx build","size":"size-limit","analyze":"size-limit --why"},"husky":{"hooks":{"pre-commit":"tsdx lint"}},"prettier":{"printWidth":80,"semi":true,"singleQuote":true,"trailingComma":"es5"},"name":"@spakhm/ts-parsec","author":"Slava Akhmechet","module":"dist/ts-parsec.esm.js","size-limit":[{"path":"dist/ts-parsec.cjs.production.min.js","limit":"10 KB"},{"path":"dist/ts-parsec.esm.js","limit":"10 KB"}],"devDependencies":{"@size-limit/preset-small-lib":"^11.1.6","husky":"^9.1.6","size-limit":"^11.1.6","tsdx":"^0.14.1","tslib":"^2.7.0","typescript":"^3.9.10"}}
package/src/lib.ts CHANGED
@@ -178,3 +178,14 @@ export const peek = <T>(p: parserlike<T>) => toParser((source: stream) => {
178
178
  source.pop_rollback();
179
179
  return res;
180
180
  });
181
+
182
+ export const anych = (opts?: { but: parserlike<unknown> }) => toParser((source: stream) => {
183
+ if (opts?.but) {
184
+ const res = peek(opts.but)(source);
185
+ if (res.type == 'ok') {
186
+ return err(0, 0, "");
187
+ }
188
+ }
189
+ const res = source.next()
190
+ return res ? ok(res) : err(0, 0, "");
191
+ });