   p = new LinePrinter
   isElse = false
 
+  maybeParens = (expr) ->
+    s = walk expr
+    if expr.type not in ['BinaryExpression', 'UnaryExpression', 'LogicalExpression']
+      s
+    else
+      "(#{s})"
+
   walk = (c) ->
     return if c is null
     switch c.type

          when '!==' then '!='
          when '==', '!=' then throw new Error('Unsupported')
          else c.operator
        "(#{walk c.left}) #{op} (#{walk c.right})"
      when 'UnaryExpression'
        if c.operator is '!'
          "not (#{walk c.argument})"
        else if c.operator is 'delete'
          "del (#{walk c.argument})"
        else if c.operator is '-'
          "-(#{walk c.argument})"
        else if c.operator is 'typeof'
          v = walk c.argument
          if c.argument.type is 'Identifier'

      when 'WhileStatement'
        if c.prelude
          c.prelude.map(walk)
        p.addLine "while #{walk c.test}:"
        walk c.body
      when 'VariableDeclaration'
        for d in c.declarations
