anchor.diff:  
   rtl_subst
   	: #(RTL (rtl_subst)*)
  -	| n:NAME 
  +	|! n:NAME 
           {
               s = n.getText()
               if s in self.locals[-1]:
                   ## = self.astFactory.dupTree(self.locals[-1][s])
  -            if s in self.constants:
  +            elif s in self.constants:
                   ## = self.astFactory.dupTree(self.constants[s])
  +            else:
  +                ## = #(#n)
           }
  -    | #(LSQUARE t:NAME i:rtl_subst)
  +    |! #(RSQUARE lexpr:rtl_subst t:NAME i:rtl_subst rexpr:rtl_subst)
           {
               if #i.getType() == NUM:
  -                ## = self.astFactory.dup(self.tables[t.getText()][int(#i.getText())])
  +                op = self.astFactory.dup(self.tables[t.getText()][int(#i.getText())])
  +                ## = #(#op, #lexpr, #rexpr)
  +            else:
  +                ## = #(RSQUARE, #lexpr, #t, #i, #rexpr)
           }
  -    | #(LPAREN f:NAME { args = [] } (a:rtl_subst { args.append(a) } )* )
  +    |! #(LPAREN f:NAME { args = [] } (a:rtl_subst { args.append(a) } )* )
           {
               if f.getText() in self.functions:
                   params, rtl = self.functions[f.getText()]
  
positive.code: 	: QUOTE^ bin_oper QUOTE!
  	;
  
  bin_oper: bit_op | arith_op | farith_op;
  
  exprstr_table
  	: LCURLY^ exprstr_term (COMMA! t:exprstr_term)* RCURLY!
  
negative.code:                 self.rtl_subst(rtl)
                  ## = self.returnAST
                  self.locals.pop()
              else:
                  pass
          }
  	|! #(r:. {/*print "=>", #r; */## = self.astFactory.dup(#r)} (no:rtl_subst { ##.addChild(#no) } )* )
  	;
  
  