Sha256: c770f110bed337a720bf948445a02a987391934ab7e05afcd1fc529e823c3e39

Contents?: true

Size: 1.67 KB

Versions: 1

Compression:

Stored size: 1.67 KB

Contents

module OrigenSTIL
  module Processor
    # Evaluates an expression to a final answer
    class Expression < Base
      # Given node should be a top-level expression node, like a :time_expr
      def run(node, options = {})
        process(node).value
      end

      def on_number_with_unit(node)
        val = node.find(:value).value
        if p = node.find(:prefix)
          case p.value
          when 'E'
            val = val * 1_000_000_000_000_000_000
          when 'P'
            val = val * 1_000_000_000_000_000
          when 'T'
            val = val * 1_000_000_000_000
          when 'G'
            val = val * 1_000_000_000
          when 'M'
            val = val * 1_000_000
          when 'k'
            val = val * 1000
          when 'm'
            val = val / 1000.0
          when 'u'
            val = val / 1_000_000.0
          when 'n'
            val = val / 1_000_000_000.0
          when 'p'
            val = val / 1_000_000_000_000.0
          when 'f'
            val = val / 1_000_000_000_000_000.0
          when 'a'
            val = val / 1_000_000_000_000_000_000.0
          else
            fail "Unknown number prefix #{p.value}"
          end
        end
        val
      end

      def on_parens(node)
        process_all(node.children).first
      end

      def on_multiply(node)
        a, b = *process_all(node.children)
        a * b
      end

      def on_divide(node)
        a, b = *process_all(node.children)
        a / (b * 1.0)
      end

      def on_add(node)
        a, b = *process_all(node.children)
        a + b
      end

      def on_subtract(node)
        a, b = *process_all(node.children)
        a - b
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
origen_stil-0.3.0 lib/origen_stil/processor/expression.rb