diff options
| author | Akshay Nair <phenax5@gmail.com> | 2022-01-07 18:13:40 +0530 |
|---|---|---|
| committer | Akshay Nair <phenax5@gmail.com> | 2022-01-07 18:14:06 +0530 |
| commit | 6639605b395ceb1355c95e06ff0e1470adc54101 (patch) | |
| tree | 01e300c50086f8db47300388ab3d7a5e5f83072d /src/index.ts | |
| parent | b3fc08cae05f997e71d846109d400e630b8a4c35 (diff) | |
| download | elxr-6639605b395ceb1355c95e06ff0e1470adc54101.tar.gz elxr-6639605b395ceb1355c95e06ff0e1470adc54101.zip | |
refactor: simplifies quantifier logic + moves stuff around
Diffstat (limited to 'src/index.ts')
| -rw-r--r-- | src/index.ts | 106 |
1 files changed, 1 insertions, 105 deletions
diff --git a/src/index.ts b/src/index.ts index 2ea40eb..82eefe8 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,106 +1,2 @@ -import { constant, pipe } from 'fp-ts/function' -import { chain, fold, right } from 'fp-ts/lib/Either' -import { match } from './utils' -import { - delimited, - many1, - mapTo, - optional, - or, - Parser, - ParserResult, - symbol, - tuple3, -} from './parser' -export const start = mapTo(symbol('^'), constant({ tag: 'Start' } as Expr)) -export const end = mapTo(symbol('$'), constant({ tag: 'End' } as Expr)) -export const anyItem = mapTo(symbol('.'), constant({ tag: 'AnyItem' } as Expr)) -export const nextItem = mapTo( - symbol(','), - constant({ tag: 'NextItem' } as Expr) -) -export const anyString = mapTo( - symbol('\\s'), - constant({ tag: 'AnyString' } as Expr) -) -export const anyNumber = mapTo( - symbol('\\n'), - constant({ tag: 'AnyNumber' } as Expr) -) -export const anyBool = mapTo( - symbol('\\b'), - constant({ tag: 'AnyBool' } as Expr) -) -export const truthy = mapTo(symbol('\\T'), constant({ tag: 'Truthy' } as Expr)) -export const falsey = mapTo(symbol('\\F'), constant({ tag: 'Falsey' } as Expr)) - -type Expr = - | { tag: 'Start' } - | { tag: 'End' } - | { tag: 'Optional'; expr: Expr } - | { tag: 'OneOrMore'; expr: Expr } - | { tag: 'ZeroOrMore'; expr: Expr } - | { tag: 'NextItem' } - | { tag: 'AnyItem' } - | { tag: 'Or' } - | { tag: 'AnyString' } - | { tag: 'AnyNumber' } - | { tag: 'AnyBool' } - | { tag: 'Truthy' } - | { tag: 'Falsey' } - | { tag: 'Group'; exprs: Expr[] } - -export const wrapQuantifiers: (e: ParserResult<Expr>) => ParserResult<Expr> = - chain(([expr, input]) => - pipe( - input, - or([symbol('*'), symbol('+'), symbol('?')]), - fold( - () => right([expr, input]), - ([c, inp]) => - pipe( - c, - match<Expr, string>({ - '*': () => ({ tag: 'ZeroOrMore', expr }), - '+': () => ({ tag: 'OneOrMore', expr }), - '?': () => ({ tag: 'Optional', expr }), - _: () => expr, - }), - (ex) => right([ex, inp]) - ) - ) - ) - ) - -export const expressionP: Parser<Expr> = (input: string) => - pipe( - input, - or([ - mapTo( - delimited(symbol('('), many1(expressionP), symbol(')')), - (exprs) => ({ tag: 'Group', exprs } as Expr) - ), - nextItem, - anyItem, - anyString, - anyNumber, - anyBool, - truthy, - falsey, - ]), - wrapQuantifiers - ) - -export const parser = tuple3(optional(start), many1(expressionP), optional(end)) - -/* - -{3,6} => 3 to 6 instances -(> 5) => number greater than -(< 5) => number less than -[name x] => apply x on property `name` -| => or -/x/ => match regular expression (string values in list) - -*/ +export * from './parser'; |
