anchor.diff:  
   Rootsymbol form.
   
  +%% Expressions
  +
  +Unary 0 'catch'.
  +Right 100 '=' '!'.
  +Right 150 'orelse'.
  +Right 160 'andalso'.
  +Nonassoc 200 comp_op.
  +Right 300 list_op.
  +Left 400 add_op.
  +Left 500 mult_op.
  +Unary 600 prefix_op.
  +Nonassoc 700 '#'.
  +Nonassoc 800 ':'.
  +
  +%% Types
  +
  +Right 150 '::'.
  +Left 170 '|'.
  +Nonassoc 200 '..'.
  +Nonassoc 500 '*'. % for binary expressions
  +
   form -> attribute dot : '$1'.
   form -> function dot : '$1'.
   
  
positive.code: map_key -> expr : '$1'.
  
  
  %% N.B. This is called from expr_700.
  %% N.B. Field names are returned as the complete object, even if they are
  %% always atoms for the moment, this might change in the future.
  
  
negative.code: top_types -> top_type                     : ['$1'].
  top_types -> top_type ',' top_types       : ['$1'|'$3'].
  
  top_type -> var '::' top_type             : {ann_type, ?anno('$1'), ['$1','$3']}.
  top_type -> type '|' top_type             : lift_unions('$1','$3').
  top_type -> type                          : '$1'.
  
  type -> type '..' type                    : {type, ?anno('$1'), range, ['$1', '$3']}.
  type -> type add_op type                  : ?mkop2('$1', '$2', '$3').
  type -> type mult_op type                 : ?mkop2('$1', '$2', '$3').
  type -> prefix_op type                    : ?mkop1('$1', '$2').
  type -> '(' top_type ')'                  : '$2'.
  type -> var                               : '$1'.
  type -> atom                              : '$1'.
  