anchor.diff:  
   is_ref
     :
  -  | AND -> REFERENCE
  +  | AND -> Reference
     ;
   
   method_body
  -  : SEMICOLON -> ABSTRACT_METHOD
  +  : SEMICOLON -> AbstractMethod
     | LBRACE statement* RBRACE -> statement*
     ;
   
   statement
  -  : expr SEMICOLON            -> ^(EVAL_EXPR expr)
  -  | LBRACE statement+ RBRACE  -> ^(BLOCK statement+)
  +  : expr SEMICOLON            -> ^(EvalExpr expr)
  +  | LBRACE statement+ RBRACE  -> ^(Block statement+)
     | if_statement
     | while_statement
     ;
  
positive.code:   | L_STRING
    | KW_TRUE
    | KW_FALSE
    | (ID LPAREN) => call_tail -> ^(SimpleCall call_tail)
    | indexed_variable
    ;
  
  call_tail
    : ID LPAREN (expr (COMMA expr)*)? RPAREN ->
      ^(Name ID) ^(LPAREN (expr+)?) ;
  
  indexed_variable
    : variable_name variable_index* -> ^(VARIABLE variable_name variable_index*)
    ;
  
  variable_index
    : LBRACKET expr RBRACKET -> expr
    | LBRACKET RBRACKET -> ARRAY_END
    | LBRACE expr RBRACE -> expr
    ;
  
  variable_name
  
negative.code:   ;
  
  expr_incdec
    : op=(INCR | DECR) atom -> ^(Pre atom $op)
    | (atom (INCR | DECR)) =>
        atom op=(INCR | DECR) -> ^(Post atom $op)
    | atom
    ;
  
  atom
  