diff --git a/src_v2/parser/parser_internals.nim b/src_v2/parser/parser_internals.nim index b45d35c..d064cd1 100644 --- a/src_v2/parser/parser_internals.nim +++ b/src_v2/parser/parser_internals.nim @@ -241,19 +241,20 @@ proc whitespace*(parser: Parser): ParserResult = # -- Parsing Helpers -# let between* = proc(startParserFn: parserFnT, stopParserFn: parserFnT, betweenParserFn: parserFnT): parserFnT {.closure.} = -# ## Creates parser function with that matches `betweenParserFn` between `startParserFn` and `stopParserFn`. -# ## Ignores the delimiters in the tokens. -# ## Example: -# ## between(ch('('), ch(')')) => Matches (abc) -# ignore(startParserFn) + anyUntil(stopParserFn) + ignore(stopParserFn) +proc between*(startParserFn: parserFnT, stopParserFn: parserFnT): parserFnT -> parserFnT {.inline.} = + ## Creates parser function with that matches a `parserFn` between `startParserFn` and `stopParserFn`. + ## Ignores the delimiters in the tokens. + ## Example: + ## between(ch('('), ch(')'))(str("abc")) => Matches (abc) + return proc(parserFn: parserFnT): parserFnT {.closure.} = + ignore(startParserFn) + parserFn + ignore(stopParserFn) -let anyBetween* = proc(startParserFn: parserFnT, stopParserFn: parserFnT): parserFnT {.closure.} = +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. ## Example: ## anyBetween(ch('('), ch(')')) => Matches (abc) - ignore(startParserFn) + anyUntil(stopParserFn) + ignore(stopParserFn) + between(startParserFn, stopParserFn)(anyUntil(stopParserFn)) let anyBetweenPair* = proc(parserFn: parserFnT): parserFnT {.closure.} = ## Creates parser function with that matches anything between matching `parserFns` @@ -321,6 +322,15 @@ when isMainModule: assert testAbc1Parser.flatMap(following(@[ch('a'), str("bc"), digit])).tokensToString() == "abc1" block parsingHelpers: + let testParenParser = initParserResult("(123)") + let testQuoteParser = initParserResult("\"123\"") + + let testQuote = ch('"') + let testBetweenParen = between(ch('('), ch(')')) + + # between + assert testParenParser.flatMap(testBetweenParen(str("123"))).tokensToString() == "123" + # anyBetween - assert initParserResult("(123)").flatMap(anyBetween(ch('('), ch(')'))).tokensToString() == "123" - assert initParserResult("\"123\"").flatMap(anyBetweenPair(ch('"'))).tokensToString() == "123" + assert testParenParser.flatMap(anyBetween(ch('('), ch(')'))).tokensToString() == "123" + assert testQuoteParser.flatMap(anyBetweenPair(testQuote)).tokensToString() == "123"