diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/parcom.cr | 19 |
1 files changed, 18 insertions, 1 deletions
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 |
