Implement newline parser
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user