From db497bb9950648c056c079c591b239ad4932b5c9 Mon Sep 17 00:00:00 2001 From: Akshay Nair Date: Mon, 24 Jan 2022 19:19:15 +0530 Subject: feat(parser): implements min-max quantifier parser --- src/parser/index.ts | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) (limited to 'src/parser/index.ts') diff --git a/src/parser/index.ts b/src/parser/index.ts index 2db91a4..a336b83 100644 --- a/src/parser/index.ts +++ b/src/parser/index.ts @@ -23,7 +23,7 @@ import { tuple3, whitespaces0, } from './utils' -import { Expr, ListExpr, Literal } from '../types' +import { Expr, index, ListExpr, Literal } from '../types' import * as Option from 'fp-ts/Option' import { snd } from 'fp-ts/Tuple' @@ -36,6 +36,13 @@ const anyBool = mapTo(symbol('\\b'), _ => Expr.AnyBool()) const truthy = mapTo(symbol('\\T'), _ => Expr.Truthy()) const falsey = mapTo(symbol('\\F'), _ => Expr.Falsey()) +const parseQuantifier = (s: Option.Option, def: index): index => + pipe( + s, + Option.map(s => parseInt(s, 10)), + Option.getOrElse(() => def), + ) + const wrapQuantifiers: (e: ParserResult) => ParserResult = Either.chain(([expr, input]) => pipe( @@ -44,6 +51,18 @@ const wrapQuantifiers: (e: ParserResult) => ParserResult = mapTo(symbol('*'), _ => Expr.ZeroOrMore({ expr })), mapTo(symbol('+'), _ => Expr.OneOrMore({ expr })), mapTo(symbol('?'), _ => Expr.Optional({ expr })), + mapTo( + pair( + prefixed(symbol('{'), optional(digits)), + delimited(symbol(','), optional(digits), symbol('}')), + ), + ([min, max]) => + Expr.MinMax({ + expr, + min: parseQuantifier(min, 0), + max: parseQuantifier(max, Infinity), + }), + ), ]), Either.orElse(_ => Either.right([expr, input])), ), -- cgit v1.3.1