Curry + seq

This commit is contained in:
Florian Schroedl
2022-01-20 17:00:00 +01:00
parent 7cfa4ae31d
commit b7d4951549

View File

@@ -67,30 +67,46 @@ proc initParser(str: string): ParserResult =
tokens: newSeq[Token](),
).ok()
proc ch(parser: Parser, c: char): ParserResult =
let state = parser.state
func ch(c1: char): (Parser -> ParserResult) {.inline.} =
return func(parser: Parser): ParserResult =
let state = parser.state
let c2 = state.stream[state.position]
if state.stream[0] == c:
Parser(
state: ParserState(
stream: state.stream[1 .. ^1],
position: parser.state.position + 1,
lastPosition: parser.state.position,
),
tokens: parser.tokens & Token(value: c)
).ok()
else:
err((parser, &"Expected {c}"))
if c1 == c2:
return Parser(
state: ParserState(
stream: state.stream,
position: state.lastPosition + 1,
lastPosition: parser.state.position,
),
tokens: parser.tokens & Token(value: c2)
).ok()
else:
return err((parser, &"Expected {c2} at {state.lastPosition}, got {c1}"))
proc parseSeq(parser: ParserResult, xs: seq[Parser -> ParserResult]): ParserResult =
xs.foldl(a.flatMap(b), parser)
# type R = Result[int, string]
# echo R.ok 4
let fooParser = initParser("FOO").parseSeq(@[
ch('F'),
ch('O'),
ch('O'),
])
echo initParser("Foo")
.flatMap((x: Parser) => ch(x, c = 'F'))
.flatMap((x: Parser) => ch(x, c = 'o'))
.flatMap((x: Parser) => ch(x, c = 'o'))
echo fooParser
# echo initParser("FUo")
# .flatMap(ch('F'))
# .flatMap(ch('o'))
# .flatMap(ch('o'))
# .flatMap((x: Parser) => ch(x, c = 'o'))
# .flatMap((x: Parser) => ch(x, c = 'o'))
# proc parseStars