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](), tokens: newSeq[Token](),
).ok() ).ok()
proc ch(parser: Parser, c: char): ParserResult = func ch(c1: char): (Parser -> ParserResult) {.inline.} =
return func(parser: Parser): ParserResult =
let state = parser.state let state = parser.state
let c2 = state.stream[state.position]
if state.stream[0] == c: if c1 == c2:
Parser( return Parser(
state: ParserState( state: ParserState(
stream: state.stream[1 .. ^1], stream: state.stream,
position: parser.state.position + 1, position: state.lastPosition + 1,
lastPosition: parser.state.position, lastPosition: parser.state.position,
), ),
tokens: parser.tokens & Token(value: c) tokens: parser.tokens & Token(value: c2)
).ok() ).ok()
else: else:
err((parser, &"Expected {c}")) 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] # type R = Result[int, string]
# echo R.ok 4 # echo R.ok 4
let fooParser = initParser("FOO").parseSeq(@[
ch('F'),
ch('O'),
ch('O'),
])
echo initParser("Foo") echo fooParser
.flatMap((x: Parser) => ch(x, c = 'F'))
.flatMap((x: Parser) => ch(x, c = 'o'))
.flatMap((x: Parser) => ch(x, c = 'o')) # 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 # proc parseStars