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

module Parcom
  # `Alt` is a `Parser` that accepts two other parsers and tries
  # to parse with one of them.
  # If the first (left) parser succeeds, its result is returned.
  # If the first parser fails, it will try the second (right) parser.
  class Alt(T, V) < Parser(T, V)
    # Accepts the two parsers to try to parse with.
    def initialize(@p1 : Parser(T, V), @p2 : Parser(T, V))
    end

    # Tries to parse using both parsers.
    #
    # It will initially try to parse with the first parser.
    # If it fails, it will try to parse with the second parser.
    def parse(tokens : Tokens(T)) : Result(T, V)
      @p1.parse(tokens)
    rescue ex1 : ParserFail
      begin
        @p2.parse(tokens)
      rescue ex2 : ParserFail
        raise ParserFail.new("Alt (#{ex1.message}), (#{ex2.message})")
      end
    end
  end
end