Implement newline parser

This commit is contained in:
Florian Schroedl
2022-01-20 17:00:00 +01:00
parent 6ca3f4a9ba
commit 64548cdec8

View File

@@ -204,11 +204,6 @@ proc endOfStream*(parser: Parser): ParserResult =
parser: parser, parser: parser,
)) ))
proc newline*(parser: Parser): ParserResult =
parser
.endOfStream()
.flatMap(ch(NewLines))
func ignore*(parserFn: Parser -> ParserResult): (Parser -> ParserResult) {.inline.} = func ignore*(parserFn: Parser -> ParserResult): (Parser -> ParserResult) {.inline.} =
## Parse characters but throw success tokens away ## Parse characters but throw success tokens away
return proc(parser: Parser): ParserResult = return proc(parser: Parser): ParserResult =
@@ -271,6 +266,13 @@ proc `+`*(parserFnA: Parser -> ParserResult, parserFnB: Parser -> ParserResult):
return proc(parser: Parser): ParserResult = return proc(parser: Parser): ParserResult =
parserFnA(parser).flatMap(parserFnB) parserFnA(parser).flatMap(parserFnB)
let newlineParser = choice(@[
endOfStream,
ch(NewLines)
])
proc newline*(parser: Parser): ParserResult = newlineParser(parser)
proc parseSeq*(parser: ParserResult, xs: seq[Parser -> ParserResult]): ParserResult = proc parseSeq*(parser: ParserResult, xs: seq[Parser -> ParserResult]): ParserResult =
xs.foldl(a.flatMap(b), parser) xs.foldl(a.flatMap(b), parser)
@@ -362,8 +364,8 @@ when isMainModule:
] ]
assert: "ABC".testParser(andParser) == @['A', 'B', 'C'] assert: "ABC".testParser(andParser) == @['A', 'B', 'C']
let newlineParser = @[ let newlineParserTest = @[
str("ABC"), str("ABC"),
newline newline
] ]
echo "ABC".testParser(newlineParser) echo "ABC\n".testParser(newlineParserTest)