Sha256: 22a10b9a9712907ff652c91f78890a0221d43071bf1df880ab0f070733f6b299

Contents?: true

Size: 1.29 KB

Versions: 2

Compression:

Stored size: 1.29 KB

Contents

require_relative './operation'

module Dentaku
  module AST
    class Arithmetic < Operation
      def initialize(*)
        super
        fail "#{ self.class } requires numeric operands" unless valid_node?(left) && valid_node?(right)
      end

      def type
        :numeric
      end

      private

      def valid_node?(node)
        node.is_a?(Identifier) || node.type == :numeric
      end
    end

    class Addition < Arithmetic
      def value(context={})
        left.value(context) + right.value(context)
      end

      def self.precedence
        10
      end
    end

    class Subtraction < Arithmetic
      def value(context={})
        left.value(context) - right.value(context)
      end

      def self.precedence
        10
      end
    end

    class Multiplication < Arithmetic
      def value(context={})
        left.value(context) * right.value(context)
      end

      def self.precedence
        20
      end
    end

    class Division < Arithmetic
      def value(context={})
        left.value(context) / right.value(context)
      end

      def self.precedence
        20
      end
    end

    class Exponentiation < Arithmetic
      def value(context={})
        left.value(context) ** right.value(context)
      end

      def self.precedence
        30
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
dentaku-2.0.2 lib/dentaku/ast/arithmetic.rb
dentaku-2.0.1 lib/dentaku/ast/arithmetic.rb