Sha256: c1f920cf20732734696444972c33b3dfa4aa018117186db5678660225ec39a12

Contents?: true

Size: 1.06 KB

Versions: 2

Compression:

Stored size: 1.06 KB

Contents

module SimpleLogic
  module PrecedenceTable
    class Operator
      attr_accessor :precedence, :associativity, :symbol
      def initialize(precedence, associativity, symbol)
        @precedence = precedence
        @associativity = associativity
        @symbol = symbol
      end

      def left_associative?
        @associativity == :left
      end

      def apply(l, r)
        if @symbol == "&&"
          l && r
        elsif @symbol == "||"
          l || r
        else
          raise "Invalid operator: #{@symbol}"
        end
      end

    end

    def self.lookup(operator)
      @operators[operator]
    end

    def self.op(associativity, *operators)
      @precedence ||= 0
      @operators ||= {}
      operators.each do |operator|
        @operators[operator] = Operator.new(@precedence, associativity, operator)
      end
      @precedence += 1
    end

    # operator precedence, low to high
    op :left, '||'
    op :left, '&&'
    op :none, '==', '!='
    op :left, '<', '<=', '>', '>='
    op :left, '+', '-'
    op :left, '*', '/'
    op :right, '^'
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
simple_logic-0.0.2 lib/simple_logic/precedence_table.rb
simple_logic-0.0.1 lib/simple_logic/precedence_table.rb