Add betweenpair parser
This commit is contained in:
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user