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