From b61aba7186cb7c616d6c8f9a3b9e6442173cbbf6 Mon Sep 17 00:00:00 2001 From: Matthew Hall Date: Wed, 8 Mar 2023 20:53:17 +1300 Subject: Implement Optional (sort of) --- src/parcom.cr | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) (limited to 'src/parcom.cr') diff --git a/src/parcom.cr b/src/parcom.cr index f102728..87c73c5 100644 --- a/src/parcom.cr +++ b/src/parcom.cr @@ -201,7 +201,24 @@ module Parcom end end - class Optional + # TODO: find a way to make this use Recover on the back end + class Optional(T, V) < Parser(T, V?) + def initialize(@p : Parser(T, V)) + end + + def parse(tokens : TokenStream(T)) : Result(T, V?) + r = @p.parse?(tokens) + + if r.nil? + Result.new(tokens, nil) + else + Result.new(r.tokens, r.value || nil) + end + + new_tokens = r.nil? ? tokens : r.tokens + new_value = r.nil? ? nil : r.value + Result.new(new_tokens, new_value) + end end class Tokens -- cgit v1.2.1