1 class RPNError < RuntimeError
 2 end
 3 
 4 def rpneval(s)
 5     a = Array.new
 6     while s.length != 0
 7         case s
 8             when /^([\d.]+[eE]?[\d.]*)(.*)/
 9                 a.push $1
10             when /^([-+*\/])(.*)/
11                 raise RPNError, "Not enough arguments" if a.length < 2
12                 args = [eval(a.pop), eval(a.pop)]
13                 a.push eval("#{args[1]} #{$1} #{args[0]}")
14             else
15                 raise RPNError, "Syntax error after `#{s}'"
16         end
17         s = $2.strip
18     end
19     raise RPNError, "Stack not empty" if a.length != 1
20     return a.pop
21 end
22 
23 puts rpneval(ARGV[0])