class PostInFix::Infix

Public Class Methods

new(str) click to toggle source
# File lib/post_in_fix/infix.rb, line 6
def initialize(str)
  @str = str
end

Public Instance Methods

to_postfix() click to toggle source
# File lib/post_in_fix/infix.rb, line 68
def to_postfix
  Postfix.new(to_stack)
end
to_stack() click to toggle source
# File lib/post_in_fix/infix.rb, line 10
def to_stack
  pflist = []
  pfstack = []
  last_chr = false
  sign_next_value = nil

  @str.split("").each do |chr|
    if chr[/[a-z0-9_.]/]
      if !last_chr
        pflist << ""
      end
      if sign_next_value == "-"
        pflist.last << "-"
      end
      pflist.last << chr
      last_chr = true
      sign_next_value = nil
    elsif chr[/[+-]/]
      if !value_near_top?(pflist)
        sign_next_value = chr
      else
        while pfstack.last && pfstack.last[/[*\/+-]/]
          pflist << pfstack.pop
        end
        pfstack.push(Operator.new(chr))
      end
      last_chr = false
    elsif chr[/[*\/]/]
      pfstack.push(Operator.new(chr))
      last_chr = false
    elsif chr[/[(]/]
      pfstack.push(Operator.new(chr))
      last_chr = false
    elsif chr[/[)]/]
      while pfstack.last && !pfstack.last[/[(]/]
        pflist << pfstack.pop
      end
      if pfstack.last && pfstack.last[/[(]/]
        pfstack.pop
      end
      last_chr = false
    end
  end
  while pfstack.last
    pflist << pfstack.pop
  end
  pflist.map do |entry|
    if entry.is_a?(String)
      if entry[/^[-+]?[0-9]+$/]
        entry = entry.to_i
      elsif entry[/^[-+]?[0-9]*\.?[0-9]+$/]
        entry = entry.to_f
      end
    end
    entry
  end
end
value_near_top?(stack) click to toggle source
# File lib/post_in_fix/infix.rb, line 72
def value_near_top?(stack)
  stack_value = stack.reverse.first
  return false if stack_value.is_a?(Operator)
  return false if stack_value.nil?
  true
end