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.} =
|
return proc(parserFn: parserFnT): parserFnT {.closure.} =
|
||||||
ignore(startParserFn) + parserFn + ignore(stopParserFn)
|
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.} =
|
proc anyBetween*(startParserFn: parserFnT, stopParserFn: parserFnT): parserFnT {.inline.} =
|
||||||
## Creates parser function with that matches anything between `startParserFn` and `stopParserFn`.
|
## Creates parser function with that matches anything between `startParserFn` and `stopParserFn`.
|
||||||
## Ignores the delimiters in the tokens.
|
## Ignores the delimiters in the tokens.
|
||||||
@@ -325,9 +333,11 @@ when isMainModule:
|
|||||||
let testQuoteParser = initParserResult("\"123\"")
|
let testQuoteParser = initParserResult("\"123\"")
|
||||||
let testQuote = ch('"')
|
let testQuote = ch('"')
|
||||||
let testBetweenParen = between(ch('('), ch(')'))
|
let testBetweenParen = between(ch('('), ch(')'))
|
||||||
|
let testBetweenQuotes = betweenPair(ch('"'))
|
||||||
|
|
||||||
# between
|
# between
|
||||||
assert testParenParser.flatMap(testBetweenParen(str("123"))).tokensToString() == "123"
|
assert testParenParser.flatMap(testBetweenParen(str("123"))).tokensToString() == "123"
|
||||||
|
assert testQuoteParser.flatMap(testBetweenQuotes(str("123"))).tokensToString() == "123"
|
||||||
|
|
||||||
# anyBetween
|
# anyBetween
|
||||||
assert testParenParser.flatMap(anyBetween(ch('('), ch(')'))).tokensToString() == "123"
|
assert testParenParser.flatMap(anyBetween(ch('('), ch(')'))).tokensToString() == "123"
|
||||||
|
|||||||
Reference in New Issue
Block a user