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