Implement manyUntil
This commit is contained in:
27
src/test.nim
27
src/test.nim
@@ -133,6 +133,14 @@ func ignore(parserFn: Parser -> ParserResult): (Parser -> ParserResult) {.inline
|
|||||||
tokens: parser.tokens,
|
tokens: parser.tokens,
|
||||||
))
|
))
|
||||||
|
|
||||||
|
func manyUntil(acceptFn: Parser -> ParserResult, stopFn: Parser -> ParserResult): (Parser -> ParserResult) {.inline.} =
|
||||||
|
## Parse characters but throw success tokens away
|
||||||
|
return proc(parser: Parser): ParserResult =
|
||||||
|
var res: ParserResult = acceptFn(parser)
|
||||||
|
while res.isOk() and res.flatMap(stopFn).isErr():
|
||||||
|
res = res.flatMap(acceptFn)
|
||||||
|
return res
|
||||||
|
|
||||||
proc parseSeq(parser: ParserResult, xs: seq[Parser -> ParserResult]): ParserResult =
|
proc parseSeq(parser: ParserResult, xs: seq[Parser -> ParserResult]): ParserResult =
|
||||||
xs.foldl(a.flatMap(b), parser)
|
xs.foldl(a.flatMap(b), parser)
|
||||||
|
|
||||||
@@ -169,7 +177,7 @@ when isMainModule:
|
|||||||
.parseSeq(@[
|
.parseSeq(@[
|
||||||
str("FOO"),
|
str("FOO"),
|
||||||
ignore(str("___")),
|
ignore(str("___")),
|
||||||
ignore(str("_")),
|
ch('B'),
|
||||||
ch('B'),
|
ch('B'),
|
||||||
ch('A'),
|
ch('A'),
|
||||||
ch('R'),
|
ch('R'),
|
||||||
@@ -178,5 +186,20 @@ when isMainModule:
|
|||||||
err => $err,
|
err => $err,
|
||||||
xs => xs.foldl(a & b.value, "")
|
xs => xs.foldl(a & b.value, "")
|
||||||
)
|
)
|
||||||
|
# echo fooParser
|
||||||
|
|
||||||
echo fooParser
|
let manUntilTest = initParser("AAAB")
|
||||||
|
.flatMap(manyUntil(ch('B'), ch('B')))
|
||||||
|
|
||||||
|
echo initParser("**** Foo")
|
||||||
|
.parseSeq(@[
|
||||||
|
manyUntil(ch('*'), ch(' ')),
|
||||||
|
ignore(ch ' '),
|
||||||
|
str("Foo")
|
||||||
|
])
|
||||||
|
|
||||||
|
# echo initParser("AAAB").flatMap(ch 'b')
|
||||||
|
# # .flatMap(ch('A'))
|
||||||
|
# # .flatMap(ch('B'))
|
||||||
|
# .flatMap()
|
||||||
|
# echo manUntilTest
|
||||||
|
|||||||
Reference in New Issue
Block a user