class FormulaDSL::Transformer

Public Instance Methods

apply( ast ) click to toggle source
# File lib/formula_dsl/transformer.rb, line 5
def apply( ast )
  expression = parse(ast)

  expression
end

Private Instance Methods

extract_operation_side( side ) click to toggle source
# File lib/formula_dsl/transformer.rb, line 50
def extract_operation_side( side )
  if side.respond_to?(:keys)
    parse( side )
  else
    if (/"(?<value>.)"/ =~ side.to_str)
      "'#{value}'"
    elsif (/(?<value>\d+)/ =~ side.str)
      value.to_i
    else
      side.to_str
    end
  end
end
is_function?(key) click to toggle source
# File lib/formula_dsl/transformer.rb, line 35
def is_function?(key)
  :function == key
end
is_operator?( key ) click to toggle source
# File lib/formula_dsl/transformer.rb, line 31
def is_operator?( key )
  [:+, :-, :*, :/].include?(key)
end
parse( hash ) click to toggle source
# File lib/formula_dsl/transformer.rb, line 12
def parse( hash )
  if hash.keys.size == 1
    parse_single_key_hash( hash )
  else
    puts "como faz o parse de um hash com mais de 1 chave???"
  end
end
parse_function( hash = {name:'', args:''} ) click to toggle source
# File lib/formula_dsl/transformer.rb, line 46
def parse_function( hash = {name:'', args:''} )
  FunctionExpression.new(hash[:name].to_str, hash[:args].to_str)
end
parse_operation(operator, values={left: '', right: ''}) click to toggle source
# File lib/formula_dsl/transformer.rb, line 39
def parse_operation(operator, values={left: '', right: ''})
  left_side  = extract_operation_side(values[:left])
  right_side = extract_operation_side(values[:right])

  BinaryExpression.new(operator, left_side, right_side)
end
parse_single_key_hash( hash ) click to toggle source
# File lib/formula_dsl/transformer.rb, line 20
def parse_single_key_hash( hash )
  key = hash.keys.first
  if is_operator? key
    parse_operation key, hash[key]
  elsif is_function? key
    parse_function hash[key]
  else
    puts "como faz o parse de um hash com chave = #{key}???"
  end
end