diff --git a/src_v2/parser/parser_internals.nim b/src_v2/parser/parser_internals.nim index 2b500cb..66a3698 100644 --- a/src_v2/parser/parser_internals.nim +++ b/src_v2/parser/parser_internals.nim @@ -149,12 +149,14 @@ proc anyUntil*(stopFn: parserFnT): parserFnT {.inline.} = ## Needs at least one character match. manyUntil(anyCh, stopFn) -proc choice*(parsers: seq[parserFnT]): parserFnT {.inline} = +proc choice*(parserFns: seq[parserFnT]): parserFnT {.inline} = + ## Creates parser function that checks any of the `parserFns`. + ## Needs one match for a `ParserResult.ok`. return proc(parser: Parser): ParserResult {.closure.} = var errors: seq[ParserResult] = newSeq[ParserResult]() var found = Nothing[ParserResult]() - for fn in parsers: + for fn in parserFns: let fnResult: ParserResult = fn(parser) if fnResult.isOk(): @@ -229,6 +231,7 @@ let parseBetweenPair* = proc(delimiterParser: parserFnT): parserFnT {.closure.} when isMainModule: let testParser123 = initParserResult("123") + let testAbc1Parser = initParserResult("abc1") block testParsingFunctions: let ch1 = ch('1') @@ -263,7 +266,11 @@ when isMainModule: assert testParser123.flatMap(ignore(ch('1'))).tokensToString() == "" # manyUntil - assert initParserResult("abc1").flatMap(manyUntil(anyCh, digit)).tokensToString() == "abc" + assert testAbc1Parser.flatMap(manyUntil(anyCh, digit)).tokensToString() == "abc" # anyUntil - assert initParserResult("abc1").flatMap(anyUntil(digit)).tokensToString() == "abc" + assert testAbc1Parser.flatMap(anyUntil(digit)).tokensToString() == "abc" + + # choice + assert testAbc1Parser.flatMap(choice(@[digit, ch('a')])).tokensToString() == "a" + assert testAbc1Parser.flatMap(choice(@[digit])).error().kind == choiceMismatchErr