lib/regexp_parser/expression/classes/conditional.rb



module Regexp::Expression

  module Conditional
    class TooManyBranches < StandardError
      def initialize
        super('The conditional expression has more than 2 branches')
      end
    end

    class Condition < Regexp::Expression::Base; end
    class Branch    < Regexp::Expression::Sequence; end

    class Expression < Regexp::Expression::Subexpression
      def initialize(token)
        super(token)

        @condition = nil
        @branches  = []
      end

      def condition(exp = nil)
        return @condition unless exp
        @condition = exp
        @expressions << exp
      end

      def <<(exp)
        @expressions.last << exp
      end

      def branch(exp = nil)
        raise TooManyBranches.new if @branches.length == 2

        sequence = Branch.new(level, set_level, conditional_level + 1)

        @expressions << sequence
        @branches << @expressions.last
      end

      def branches
        @branches
      end

      def quantify(token, text, min = nil, max = nil, mode = :greedy)
        branches.last.last.quantify(token, text, min, max, mode)
      end

      def to_s
        s = @text.dup
        s << @condition.text
        s << branches.map{|e| e.to_s}.join('|')
        s << ')'
      end
    end
  end

end