On Dec 2, 2007 12:02 PM, Adam Shelly <adam.shelly / gmail.com> wrote: > On Nov 30, 2007 5:28 AM, Ruby Quiz <james / grayproductions.net> wrote: > > This week's quiz is to write a script that translates postfix expressions into > > the equivalent infix expression. > > Here's mine. I should know better than to try to cleanup my code, and then submit it without running it first. This line: > tok = Token.new(phrase,term.precedence) should read term = Term.new(phrase, term.precedence) -Adam > > #postfix to infix > # ruby quix #148 > # Adam Shelly > # > # Converts postfix to infix notation > # uses ruby's operators & precedence rules > > $Operators = { > '&&'=>0, '||'=>0, > '=='=>1, '==='=>1, '<=>'=>1, > '<='=>2, '>='=>2, '<' =>2, '>'=>2, > '^' =>3, '|' =>3, > '&' =>4, > '<<'=>5, '>>'=>5, > '+' =>6, '-' =>6, > '*' =>7, '/' =>7, '%'=> 7, > '**'=>8, > :term=>10 > } > > class Term > attr_reader :precedence > def initialize str, groupPrec=nil > @s = str > @precedence = $Operators[str]||groupPrec||$Operators[:term] > end > def isOp > @precedence != $Operators[:term] > end > def parenthesize > @s="(#{@s})" > end > def to_s > @s > end > end > > class Infix > def initialize rpn > stack=[] > rpn.split.each do |t| > term = Term.new(t) > if term.isOp > lval = stack.pop > rval = stack.pop > raise "Empty Stack" unless lval && rval > lval.parenthesize if lval.precedence < term.precedence > rval.parenthesize if rval.precedence < term.precedence > phrase = "#{rval} #{term} #{lval}" > tok = Token.new(phrase,term.precedence) > # p term > end > stack.push term > end > @expr = stack.pop > raise "Extra terms" unless stack.size==0 > end > def to_s > @expr > end > end > > if __FILE__ == $0 > puts Infix.new(ARGV.join(' ')).to_s > end > > -Adam >