diff options
| author | Akshay Nair <phenax5@gmail.com> | 2022-01-08 21:17:10 +0530 |
|---|---|---|
| committer | Akshay Nair <phenax5@gmail.com> | 2022-01-08 21:17:10 +0530 |
| commit | b3b2c39df680f88e1e6d3615245754ae5f0380d0 (patch) | |
| tree | 4af350ce393244d2c8dbcfdb0bd46cbb91ee41ef /src/parser | |
| parent | e246f2341ee13926f4273c6d634cef4fe07f040e (diff) | |
| download | elxr-b3b2c39df680f88e1e6d3615245754ae5f0380d0.tar.gz elxr-b3b2c39df680f88e1e6d3615245754ae5f0380d0.zip | |
feat(eval): implements object property matching
Diffstat (limited to 'src/parser')
| -rw-r--r-- | src/parser/index.ts | 30 | ||||
| -rw-r--r-- | src/parser/utils.ts | 16 |
2 files changed, 29 insertions, 17 deletions
diff --git a/src/parser/index.ts b/src/parser/index.ts index 2f5781e..386fa94 100644 --- a/src/parser/index.ts +++ b/src/parser/index.ts @@ -30,8 +30,8 @@ const anyBool = mapTo(symbol('\\b'), _ => Expr.AnyBool(null)) const truthy = mapTo(symbol('\\T'), _ => Expr.Truthy(null)) const falsey = mapTo(symbol('\\F'), _ => Expr.Falsey(null)) -const wrapQuantifiers: (e: ParserResult<Expr>) => ParserResult<Expr> = - chain(([expr, input]) => +const wrapQuantifiers: (e: ParserResult<Expr>) => ParserResult<Expr> = chain( + ([expr, input]) => pipe( input, or([ @@ -41,7 +41,7 @@ const wrapQuantifiers: (e: ParserResult<Expr>) => ParserResult<Expr> = ]), orElse(_ => right([expr, input])), ), - ) +) const wrapAlt: (e: ParserResult<Expr>) => ParserResult<Expr> = chain( ([expr, input]) => @@ -63,12 +63,18 @@ export const propertyName: Parser<string> = pipe( p => suffixed(p, whitespaces0), ) -const objectProperty = (input: string) => pipe( - input, - mapTo(delimited(symbol('['), pair(propertyName, many0(expressionP)), symbol(']')), ([name, exprs]) => - Expr.PropertyMatch({ name, exprs }), - ), -) +const objectProperty = (input: string) => + pipe( + input, + mapTo( + delimited( + symbol('['), + pair(propertyName, many0(expressionP)), + symbol(']'), + ), + ([name, exprs]) => Expr.PropertyMatch({ name, exprs }), + ), + ) const expressionP: Parser<Expr> = (input: string) => pipe( @@ -90,7 +96,11 @@ const expressionP: Parser<Expr> = (input: string) => wrapAlt, ) -export const parser: Parser<ListExpr> = tuple3(optional(start), many1(expressionP), optional(end)) +export const parser: Parser<ListExpr> = tuple3( + optional(start), + many1(expressionP), + optional(end), +) /* diff --git a/src/parser/utils.ts b/src/parser/utils.ts index 9e05286..841d77c 100644 --- a/src/parser/utils.ts +++ b/src/parser/utils.ts @@ -40,14 +40,16 @@ export const many0 = <T>(parser: Parser<T>): Parser<Array<T>> => ) export const many1 = <T>(parser: Parser<T>): Parser<Array<T>> => - recoverInput(flow( - many0(parser), - chain(([res, inp]) => - res.length > 0 - ? right([res, inp]) - : left([`many1 failed to parse at ${inp}`, inp]), + recoverInput( + flow( + many0(parser), + chain(([res, inp]) => + res.length > 0 + ? right([res, inp]) + : left([`many1 failed to parse at ${inp}`, inp]), + ), ), - )) + ) const recoverInput = <T>(p: Parser<T>): Parser<T> => |
