Add betweenpair parser

This commit is contained in:
Florian Schroedl
2022-08-27 15:45:14 +02:00
parent c5eaf29b09
commit 67e5a44d49

View File

@@ -228,6 +228,14 @@ proc between*(startParserFn: parserFnT, stopParserFn: parserFnT): parserFnT -> p
return proc(parserFn: parserFnT): parserFnT {.closure.} =
ignore(startParserFn) + parserFn + ignore(stopParserFn)
let betweenPair* = proc(delimiterParserFn: parserFnT): parserFnT -> parserFnT {.inline.} =
## Creates parser function with that matches anything between matching `delimiterParserFn`
## Ignores the delimiters in the tokens.
## Example:
## betweenPair(ch('"')(str("abc"))) => Matches "abc"
return proc(parserFn: parserFnT): parserFnT {.closure.} =
ignore(delimiterParserFn) + parserFn + ignore(delimiterParserFn)
proc anyBetween*(startParserFn: parserFnT, stopParserFn: parserFnT): parserFnT {.inline.} =
## Creates parser function with that matches anything between `startParserFn` and `stopParserFn`.
## Ignores the delimiters in the tokens.
@@ -325,9 +333,11 @@ when isMainModule:
let testQuoteParser = initParserResult("\"123\"")
let testQuote = ch('"')
let testBetweenParen = between(ch('('), ch(')'))
let testBetweenQuotes = betweenPair(ch('"'))
# between
assert testParenParser.flatMap(testBetweenParen(str("123"))).tokensToString() == "123"
assert testQuoteParser.flatMap(testBetweenQuotes(str("123"))).tokensToString() == "123"
# anyBetween
assert testParenParser.flatMap(anyBetween(ch('('), ch(')'))).tokensToString() == "123"