anchor.diff:  
   expr_assign
     : logical_or
  -  | variable op=(PLUS_EQ | MINUS_EQ | MUL_EQ | DIV_EQ | DOT_EQ | MOD_EQ |
  -                 AND_EQ | OR_EQ | XOR_EQ | SHL_EQ | SHR_EQ) expr_assign
  -      -> ^($op variable expr_assign)
  +  | (variable_name (PLUS_EQ | MINUS_EQ | MUL_EQ | DIV_EQ | DOT_EQ | MOD_EQ |
  +                    AND_EQ | OR_EQ | XOR_EQ | SHL_EQ | SHR_EQ)) =>
  +     variable_name op=(PLUS_EQ | MINUS_EQ | MUL_EQ | DIV_EQ | DOT_EQ | MOD_EQ |
  +                      AND_EQ | OR_EQ | XOR_EQ | SHL_EQ | SHR_EQ) expr_assign
  +      -> ^($op variable_name expr_assign)
     ;
   
   logical_or
  
positive.code:   | KW_TRUE
    | KW_FALSE
    | (ID LPAREN) => call_tail -> ^(SimpleCall call_tail)
    ;
  
  call_tail
    : ID LPAREN (expr (COMMA expr)*)? RPAREN ->
      ^(Name ID) ^(LPAREN (expr+)?) ;
  
  variable
    : DOLLAR^ ID
    | DOLLAR^ variable
    | DOLLAR^ LBRACE! expr RBRACE!
    ;
  
  
negative.code:   VAR_OR_ASSIGN;
    PRE;
    POST;
    VARIABLE;
    ARRAY_END;
  }
  
  program
  