From 11bb9b17ad84e0c07aaa50ce65411a8adf692685 Mon Sep 17 00:00:00 2001 From: Akshay Nair Date: Thu, 13 Jan 2022 23:05:10 +0530 Subject: feat(parser): adds sequence parser --- src/parser/index.ts | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) (limited to 'src/parser') 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 = delimited( whitespaces0, ) -const expressionP: Parser = (input: string) => pipe( +const infixOp = (op: Parser): Parser => (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 = mapTo(infixOp(symbol('|')), exprs => Expr.Or({ exprs })) + +const sequenceP: Parser = mapTo(infixOp(symbol(',')), exprs => Expr.Sequence({ exprs })) + +const expressionP: Parser = (input: string) => or([ altP, sequenceP, groupP ])(input) + const atomP: Parser = (input: string) => pipe( input, or([ mapTo(delimited(symbol('('), many1(expressionP), symbol(')')), exprsToGroup), objectProperty, - nextItem, anyItem, anyString, anyNumber, @@ -123,7 +129,6 @@ const atomP: Parser = (input: string) => mapTo(literalP, Expr.Literal), ]), wrapQuantifiers, - //wrapAlt, ) const exprsToGroup = (exprs: Expr[]) => exprs.length === 1 ? exprs[0] : Expr.Group({ exprs }) -- cgit v1.3.1