anchor.diff:      })
     | ^(Post voc=variable_or_call incdec_op
       {
  -      $val = self.gen_temp()
  +      $val = self.get_temp()
         self.print_line('\%s = \%s[0]' \% ($val, $voc.tmp))
         self.print_line('\%s[0] = \%s[0] \%s 1' \% ($voc.tmp, 
                           $voc.tmp, $incdec_op.op))
  
positive.code:   ;
  
  variable_or_call returns [tmp]
    : ^(Call name=ID { self.print_custom($ID.text + '(') }
        actual_parameter_list
        { self.print_custom(')') }
        index*)
    | ^(Variable 
        variable_name { $tmp = $variable_name.tmp }
        index*)
    | ^(OBJ_ACCESS variable_or_call variable_or_call)
    ;
  
  actual_parameter_list
    : (^(Parameter expr))+
    ;
  
  index
    : ^(Index ArrayEnd
        {
          # TODO - hard
          self.print_custom('[-1]')
        })
    | ^(Index
        {
          self.print_custom('[')
        }
        expr
        {
          self.print_custom(']')
        })
    ;
  
  variable_name returns [tmp]
    : ^(DOLLAR ID 
      { 
        $tmp = self.get_temp()
        self.print_line('try: \%s = \%s' \% ($tmp, $ID.text))
        self.print_line('except NameError: \%s = \%s = [None]' \% ($tmp, $ID.text))
      })
    | ^(DOLLAR variable_name)
    | ^(DOLLAR expr)
  
negative.code: }
  
  @members {
    VAR_PREFIX = 'v_'
    TEMP_PREFIX = 't_'
    
    indentLevel = 0
    was_indent = False
    was_newline = False
  