anchor.diff:  KW_WHILE: 'while' ;
   KW_CONST: 'const';
   KW_INSTANCEOF: 'instanceof';
  +KW_NEW: 'new';
   
   ID:
     ('a'..'z'|'A'..'Z'|'_'|'\u007f'..'\u00ff') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'\u007f'..'\u00ff')*
  
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: 
  is_ref
    :
    | AND -> Reference
    ;
  
  method_body
    : SEMICOLON -> AbstractMethod
    | LBRACE statement* RBRACE -> statement*
    ;
  
  statement
    : expr SEMICOLON            -> ^(EvalExpr expr)
    | LBRACE statement+ RBRACE  -> ^(Block statement+)
    | if_statement
    | while_statement
    ;
  