From 67e5a44d49ff585173989dcbdbfa079e86284083 Mon Sep 17 00:00:00 2001 From: Florian Schroedl Date: Sat, 27 Aug 2022 15:45:14 +0200 Subject: [PATCH] Add betweenpair parser --- src_v2/parser/parser_api.nim | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src_v2/parser/parser_api.nim b/src_v2/parser/parser_api.nim index 3599f2b..bb7e49e 100644 --- a/src_v2/parser/parser_api.nim +++ b/src_v2/parser/parser_api.nim @@ -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"