anchor.diff:  	;
   
   primary_expr
  -	: num
  +	: NUM^
   	| FLOATNUM^
   //	| TEMP
   	| REG_ID^
  
positive.code: 	
  // floating point arithmetic
  fp_expr
  	: unary_expr (farith_op unary_expr)*
  	;
  
  // arithmetic
  arith_expr
  	: fp_expr (arith_op fp_expr)*
  	;
  
  // bit arithmetic
  bit_expr
  	: arith_expr (bit_op arith_expr)*
  	;
  
  // conditionals
  cond_expr
  	: bit_expr (cond_op bit_expr)*
  	;
  	
  // logicals
  log_expr
  	: cond_expr (log_op cond_expr)*
  	;
  
  exp: log_expr;
  
  
  arith_op
  	: MOD
  	| MUL
  	| DIV
  	| SMUL
  	| SDIV
  	| SMOD
  	| PLUS
  	| MINUS
  	;
  	
  bit_op
  	: "rlc"
  	| "rrc"
  	| "rl"
  	| "rr"
  	| RSHIFT
  	| LSHIFT
  	| RSHIFTA
  	| OR
  	| ORNOT
  	| AND
  	| ANDNOT
  	| XOR
  	| XORNOT
  	;
  
  cond_op
  	: EQ
  	| NE
  	| LT
  	| GT
  	| LE
  	| GE
  	| LTU
  	| GTU
  	| LEU
  	| GEU
  	;
  
  farith_op
  	: MUL_F
  	| MUL_FD
  	| MUL_FQ
  	| MUL_FSD
  	| MUL_FDQ
  	| DIV_F
  	| DIV_FD
  	| DIV_FQ
  	| PLUS_F
  	| PLUS_FD
  	| PLUS_FQ
  	| MINUS_F
  	| MINUS_FD
  	| MINUS_FQ
  	| "pow"
  	;
  
  log_op
  	: "and"
  	| "or"
  	;
  
  variable
  	: 
  
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) } )* )
  	;
  
  