Test choice
This commit is contained in:
@@ -149,12 +149,14 @@ proc anyUntil*(stopFn: parserFnT): parserFnT {.inline.} =
|
|||||||
## Needs at least one character match.
|
## Needs at least one character match.
|
||||||
manyUntil(anyCh, stopFn)
|
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.} =
|
return proc(parser: Parser): ParserResult {.closure.} =
|
||||||
var errors: seq[ParserResult] = newSeq[ParserResult]()
|
var errors: seq[ParserResult] = newSeq[ParserResult]()
|
||||||
var found = Nothing[ParserResult]()
|
var found = Nothing[ParserResult]()
|
||||||
|
|
||||||
for fn in parsers:
|
for fn in parserFns:
|
||||||
let fnResult: ParserResult = fn(parser)
|
let fnResult: ParserResult = fn(parser)
|
||||||
|
|
||||||
if fnResult.isOk():
|
if fnResult.isOk():
|
||||||
@@ -229,6 +231,7 @@ let parseBetweenPair* = proc(delimiterParser: parserFnT): parserFnT {.closure.}
|
|||||||
|
|
||||||
when isMainModule:
|
when isMainModule:
|
||||||
let testParser123 = initParserResult("123")
|
let testParser123 = initParserResult("123")
|
||||||
|
let testAbc1Parser = initParserResult("abc1")
|
||||||
|
|
||||||
block testParsingFunctions:
|
block testParsingFunctions:
|
||||||
let ch1 = ch('1')
|
let ch1 = ch('1')
|
||||||
@@ -263,7 +266,11 @@ when isMainModule:
|
|||||||
assert testParser123.flatMap(ignore(ch('1'))).tokensToString() == ""
|
assert testParser123.flatMap(ignore(ch('1'))).tokensToString() == ""
|
||||||
|
|
||||||
# manyUntil
|
# manyUntil
|
||||||
assert initParserResult("abc1").flatMap(manyUntil(anyCh, digit)).tokensToString() == "abc"
|
assert testAbc1Parser.flatMap(manyUntil(anyCh, digit)).tokensToString() == "abc"
|
||||||
|
|
||||||
# anyUntil
|
# 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
|
||||||
|
|||||||
Reference in New Issue
Block a user