diff options
| author | Akshay Nair <phenax5@gmail.com> | 2022-01-13 23:05:10 +0530 |
|---|---|---|
| committer | Akshay Nair <phenax5@gmail.com> | 2022-01-13 23:05:10 +0530 |
| commit | 11bb9b17ad84e0c07aaa50ce65411a8adf692685 (patch) | |
| tree | bba6dcdbbec45e75d6451081be0171c5f5ce3619 /src/parser | |
| parent | ba94e799aa352c2fd472b694c745388e3e9feee8 (diff) | |
| download | elxr-11bb9b17ad84e0c07aaa50ce65411a8adf692685.tar.gz elxr-11bb9b17ad84e0c07aaa50ce65411a8adf692685.zip | |
feat(parser): adds sequence parser
Diffstat (limited to '')
| -rw-r--r-- | src/parser/index.ts | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/src/parser/index.ts b/src/parser/index.ts index 1f9da13..50f2786 100644 --- a/src/parser/index.ts +++ b/src/parser/index.ts @@ -28,7 +28,6 @@ import {mapFst, snd} from 'fp-ts/lib/Tuple' const start = mapTo(symbol('^'), _ => Expr.Start()) const end = mapTo(symbol('$'), _ => Expr.End()) const anyItem = mapTo(symbol('.'), _ => Expr.AnyItem()) -const nextItem = mapTo(symbol(','), _ => Expr.NextItem()) const anyString = mapTo(symbol('\\s'), _ => Expr.AnyString()) const anyNumber = mapTo(symbol('\\n'), _ => Expr.AnyNumber()) const anyBool = mapTo(symbol('\\b'), _ => Expr.AnyBool()) @@ -101,19 +100,26 @@ const literalP: Parser<Literal> = delimited( whitespaces0, ) -const expressionP: Parser<Expr> = (input: string) => pipe( +const infixOp = (op: Parser<any>): Parser<Expr[]> => (input: string) => pipe( input, - sepBy1(symbol('|'), groupP), - mapE(mapFst(exprs => exprs.length === 1 ? exprs[0] : Expr.Or({ exprs }))), + sepBy1(op, groupP), + chain(([exprs, nextInput]) => exprs.length === 1 + ? left(['Infix operator parsing error', input]) + : right([exprs, nextInput])), ) +const altP: Parser<Expr> = mapTo(infixOp(symbol('|')), exprs => Expr.Or({ exprs })) + +const sequenceP: Parser<Expr> = mapTo(infixOp(symbol(',')), exprs => Expr.Sequence({ exprs })) + +const expressionP: Parser<Expr> = (input: string) => or([ altP, sequenceP, groupP ])(input) + const atomP: Parser<Expr> = (input: string) => pipe( input, or([ mapTo(delimited(symbol('('), many1(expressionP), symbol(')')), exprsToGroup), objectProperty, - nextItem, anyItem, anyString, anyNumber, @@ -123,7 +129,6 @@ const atomP: Parser<Expr> = (input: string) => mapTo(literalP, Expr.Literal), ]), wrapQuantifiers, - //wrapAlt, ) const exprsToGroup = (exprs: Expr[]) => exprs.length === 1 ? exprs[0] : Expr.Group({ exprs }) |
