aboutsummaryrefslogtreecommitdiff
path: root/src/__OLD_parcom/peek.cr
blob: 2b6f657d4b06e60032e84ac0f0d76c9d67c36bc7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
require "./parser.cr"

module Parcom
  # `Peek` is a `Parser` that runs another `Parser` while
  # leaving the input stream unmodified.
  class Peek(T, V) < Parser(T, V)
    # Accepts the parser to run.
    def initialize(@p : Parser(T, V)) 
    end 

    # Runs the parser it was initialized with, and returns
    # that parser's result along with the original input.
    #
    # Re-raises a `ParserFail` exception if the other parser fails.
    def parse(tokens : Tokens(T)) : Result(T, V)
      result = @p.parse(tokens)
      Result.new(tokens, result.value)
    rescue ex : ParserFail
      raise ParserFail.new("Peek: #{ex.message}")
    end 
  end
end