diff options
| author | Akshay Nair <phenax5@gmail.com> | 2023-08-10 21:27:42 +0530 |
|---|---|---|
| committer | Akshay Nair <phenax5@gmail.com> | 2023-08-10 21:27:42 +0530 |
| commit | 3854a42db888a58f0452bfb23b6e17df5bf8ad39 (patch) | |
| tree | bc19fbfaaa637467844a99baf8565cb340691346 /src/utils/parser-comb.ts | |
| parent | db97b1a9c42fe945ca37256f5ee18d52c6aa32b4 (diff) | |
| download | css-everything-3854a42db888a58f0452bfb23b6e17df5bf8ad39.tar.gz css-everything-3854a42db888a58f0452bfb23b6e17df5bf8ad39.zip | |
feat: multi expression parser done
Diffstat (limited to '')
| -rw-r--r-- | src/utils/parser-comb.ts | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/utils/parser-comb.ts b/src/utils/parser-comb.ts index 9cea86f..49f633e 100644 --- a/src/utils/parser-comb.ts +++ b/src/utils/parser-comb.ts @@ -17,12 +17,14 @@ export type ParseResult<T> = Result<{ value: T, input: string }, { error: string export type Parser<T> = (input: string) => ParseResult<T>; export const regex = (re: RegExp): Parser<string> => input => { + if (input.length === 0) return Result.Err({ error: 'fuckedinput', input }) const res = input.match(re) if (!res) return Result.Err({ error: 'fucked', input }); return Result.Ok({ value: res[0], input: input.replace(re, '') }); } export const string = (str: string): Parser<string> => input => { + if (input.length === 0) return Result.Err({ error: 'fuckedinput', input }) if (!input.startsWith(str)) return Result.Err({ error: 'fuckedstring', input }) return Result.Ok({ value: str, input: input.slice(str.length) }); } @@ -61,3 +63,24 @@ export const suffixed = <A>(parser: Parser<A>, parserSuffix: Parser<any>): Parse export const between = <A>(prefix: Parser<any>, parser: Parser<A>, suffix: Parser<any>): Parser<A> => suffixed(prefixed(prefix, parser), suffix) +export const many0 = <A>(parser: Parser<A>): Parser<Array<A>> => originalInput => + match(parser(originalInput), { + Ok: ({ value, input }) => map(many0(parser), ls => [value, ...ls])(input), + Err: ({ input }) => Result.Ok({ value: [], input }), + }) + +export const many1 = <A>(parser: Parser<A>): Parser<Array<A>> => originalInput => + match(parser(originalInput), { + Ok: ({ value, input }) => map(many0(parser), ls => [value, ...ls])(input), + Err: err => Result.Err(err), + }) + +export const sepBy = <A>(parser: Parser<A>, sepP: Parser<any>): Parser<Array<A>> => originalInput => + match(parser(originalInput), { + Ok: ({ value, input }) => map( + many0(prefixed(sepP, parser)), + ls => [value, ...ls] + )(input), + Err: _ => Result.Ok({ value: [], input: originalInput }), + }) + |
