diff --git a/src_v2/parser/builder_api.nim b/src_v2/parser/builder_api.nim index f97aaa6..b7546e4 100644 --- a/src_v2/parser/builder_api.nim +++ b/src_v2/parser/builder_api.nim @@ -14,6 +14,30 @@ import ./parser_api # -- Builder API +proc tryParser*[T]( + builder: Builder[T], + parser: Parser -> ParserResult, +): BuilderResult[T] = + ## Try out a `parser` on a `builder` + ## When succesful return the original builder, otherwise return an error + ParserResult.ok(Parser( + state: builder[0].state, + tokens: @[] + )) + .flatMap(parser) + .foldTokens( + (err: ParserError) => BuilderResult[T].err((builder, "Error")), + (newTokens: seq[ParserToken]) => BuilderResult[T].ok(builder), + ) + +proc tryParser*[T]( + builder: BuilderResult[T], + parser: Parser -> ParserResult, +): BuilderResult[T] = + ## Try out a `parser` on a `builder` result + ## When succesful return the ok builder, otherwise return an error + builder.flatMap((x: Builder[T]) => tryParser(x, parser)) + proc tryTokenize*[T]( builder: Builder[T], builderFns: seq[tuple[