From c3389abb59f0b421fbf9798565d7240c3a4e39a5 Mon Sep 17 00:00:00 2001 From: Florian Schroedl Date: Fri, 26 Aug 2022 17:36:43 +0200 Subject: [PATCH] Add endOfStream overflow, move to parserFns, add test --- src_v2/parser/parser_internals.nim | 40 +++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/src_v2/parser/parser_internals.nim b/src_v2/parser/parser_internals.nim index 1e355ac..2b45f44 100644 --- a/src_v2/parser/parser_internals.nim +++ b/src_v2/parser/parser_internals.nim @@ -112,6 +112,31 @@ proc str*(expectedString: string): parserFnT {.inline.} = res = res.flatMap(ch(c)) return res +proc endOfStream*(parser: Parser): ParserResult = + ## Check if the following character is the end of the stream. + ## Errors when the end of stream was already reached. + let state = parser.state + let newIndex = state.position + 1 + + if newIndex == parser.state.stream.len: + ok(parser) + elif newIndex > parser.state.stream.len: + return err(ParserError( + kind: endOfStringErr, + expected: "endOfStream", + index: newIndex, + parser: parser, + )) + else: + let foundChar = state.stream[newIndex] + err(ParserError( + kind: charMismatchErr, + unexpected: $foundChar, + expected: "endOfStream", + index: newIndex, + parser: parser, + )) + # -- Parsing API proc plus*(parserFnA: parserFnT, parserFnB: parserFnT): parserFnT {.inline.} = @@ -197,18 +222,6 @@ proc following*(parserFns: seq[parserFnT]): parserFnT {.inline.} = # -- Parsing Aliases -proc endOfStream*(parser: Parser): ParserResult = - let index = parser.state.position + 1 - if index == parser.state.stream.len: - ok(parser) - else: - err(ParserError( - kind: endOfStringErr, - expected: &"EndOfString", - index: index, - parser: parser, - )) - let newlineParser = choice(@[ ch(NewLines), endOfStream, @@ -264,6 +277,9 @@ when isMainModule: assert initParserResult("").flatMap(ch1).isStreamCompleted() == false assert testParser123.flatMap(str("123")).isStreamCompleted() == true + # endOfStream + assert testParser123.flatMap(str("123") + endOfStream).tokensToString() == "123" + block testParsingApi: # plus, + assert testAbc1Parser.flatMap(str("abc") + ch('1')).tokensToString() == "abc1"