class Keisan::AST::Operator

Constants

ARITIES
ARITY_PRIORITY_ASSOCIATIVITY

NOTE: operators with same priority must have same associativity

ASSOCIATIVITIES
ASSOCIATIVITY_OF_PRIORITY
PRIORITIES

Public Class Methods

arity() click to toggle source
# File lib/keisan/ast/operator.rb, line 66
def self.arity
  ARITIES[symbol]
end
associativity() click to toggle source
# File lib/keisan/ast/operator.rb, line 82
def self.associativity
  ASSOCIATIVITIES[symbol]
end
associativity_of_priority(priority) click to toggle source
# File lib/keisan/ast/operator.rb, line 58
def self.associativity_of_priority(priority)
  ASSOCIATIVITY_OF_PRIORITY[priority]
end
new(children = [], parsing_operators = []) click to toggle source
Calls superclass method
# File lib/keisan/ast/operator.rb, line 41
def initialize(children = [], parsing_operators = [])
  unless parsing_operators.empty? || children.count == parsing_operators.count + 1
    raise Exceptions::ASTError.new("Mismatch of children and operators")
  end

  children = Array(children)
  super(children)
end
priority() click to toggle source
# File lib/keisan/ast/operator.rb, line 74
def self.priority
  PRIORITIES[symbol]
end
symbol() click to toggle source
# File lib/keisan/ast/operator.rb, line 90
def self.symbol
  raise Exceptions::NotImplementedError.new
end

Public Instance Methods

arity() click to toggle source
# File lib/keisan/ast/operator.rb, line 62
def arity
  self.class.arity
end
associativity() click to toggle source
# File lib/keisan/ast/operator.rb, line 78
def associativity
  self.class.associativity
end
blank_value() click to toggle source
# File lib/keisan/ast/operator.rb, line 94
def blank_value
  raise Exceptions::NotImplementedError.new
end
evaluate_assignments(context = nil) click to toggle source
# File lib/keisan/ast/operator.rb, line 50
def evaluate_assignments(context = nil)
  context ||= Context.new
  @children = children.map do |child|
    child.evaluate_assignments(context)
  end
  self
end
priority() click to toggle source
# File lib/keisan/ast/operator.rb, line 70
def priority
  self.class.priority
end
symbol() click to toggle source
# File lib/keisan/ast/operator.rb, line 86
def symbol
  self.class.symbol
end
to_s() click to toggle source
# File lib/keisan/ast/operator.rb, line 111
def to_s
  children.map do |child|
    case child
    when Operator
      "(#{child.to_s})"
    else
      "#{child.to_s}"
    end
  end.join(symbol.to_s)
end
value(context = nil) click to toggle source
# File lib/keisan/ast/operator.rb, line 98
def value(context = nil)
  args = children
  args = args.reverse if associativity == :right

  args.inject(blank_value) do |result, child|
    if associativity == :left
      result.send(symbol, child.value(context))
    else
      child.value(context).send(symbol, result)
    end
  end
end