Curry + seq
This commit is contained in:
50
src/test.nim
50
src/test.nim
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user