From bc7525e3531e6a83eaa400e6af642f751ca9281f Mon Sep 17 00:00:00 2001 From: Florian Schroedl Date: Sun, 28 Aug 2022 18:19:42 +0200 Subject: [PATCH] Add starOfStream function --- src_v2/parser/parser_api.nim | 15 +++++++++++++++ src_v2/parser/parser_types.nim | 10 ++++++++++ 2 files changed, 25 insertions(+) diff --git a/src_v2/parser/parser_api.nim b/src_v2/parser/parser_api.nim index bb7e49e..cf9d384 100644 --- a/src_v2/parser/parser_api.nim +++ b/src_v2/parser/parser_api.nim @@ -112,6 +112,21 @@ proc str*(expectedString: string): parserFnT {.inline.} = res = res.flatMap(ch(c)) return res +proc startOfStream*(parser: Parser): ParserResult = + ## Check if the following character is the end of the stream. + ## Errors when the end of stream was already reached. + let position = parser.state.position + + if position == 0 or position == -1: + ok(parser) + else: + err(ParserError( + kind: startOfStringErr, + expected: "startOfStream", + index: position, + parser: parser, + )) + 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. diff --git a/src_v2/parser/parser_types.nim b/src_v2/parser/parser_types.nim index 4ff813c..0f968c9 100644 --- a/src_v2/parser/parser_types.nim +++ b/src_v2/parser/parser_types.nim @@ -36,6 +36,7 @@ type choiceMismatchErr charMismatchErr endOfStringErr + startOfStringErr ParserError* = ref object kind*: ParserErrorKind unexpected*: string @@ -287,6 +288,15 @@ func `$`*(x: ParserError): string = {original} {errSpace}^ Expected 'EndOfString' at {index} but got {original.len - 1}""" + of startOfStringErr(parser: @parser, index: @index): + let original = parser.state.stream + .deleteAfterNewline(parser.state.position) + let errSpace = " ".repeat(max(0, index)) + + &"""Parsing Error (StartOFString Expected): +{original} +{errSpace}^ Expected 'StartOfString' at index {index}""" + else: "ParseError" when isMainModule: