anchor.diff:  type -> integer                           : '$1'.
   type -> char                              : '$1'.
   type -> 'fun' '(' ')'                     : {type, ?anno('$1'), 'fun', []}.
  -type -> 'fun' '(' fun_type_100 ')'        : '$3'.
  -
  -fun_type_100 -> '(' '...' ')' '->' top_type
  -                                          : {type, ?anno('$1'), 'fun',
  +type -> 'fun' '(' fun_type ')'            : '$3'.
  +
  +fun_type -> '(' '...' ')' '->' top_type   : {type, ?anno('$1'), 'fun',
                                                [{type, ?anno('$1'), any}, '$5']}.
  -fun_type_100 -> fun_type                  : '$1'.
  -
   fun_type -> '(' ')' '->' top_type  : {type, ?anno('$1'), 'fun',
                                         [{type, ?anno('$1'), product, []}, '$4']}.
   fun_type -> '(' top_types ')' '->' top_type
  
positive.code: 
  
  expr -> 'catch' expr : {'catch',?anno('$1'),'$2'}.
  expr -> expr_100 : '$1'.
  
  expr_100 -> expr_150 '=' expr_100 : {match,?anno('$2'),'$1','$3'}.
  expr_100 -> expr_150 '!' expr_100 : ?mkop2('$1', '$2', '$3').
  expr_100 -> expr_150 : '$1'.
  
  expr_150 -> expr_160 'orelse' expr_150 : ?mkop2('$1', '$2', '$3').
  expr_150 -> expr_160 : '$1'.
  
  expr_160 -> expr_200 'andalso' expr_160 : ?mkop2('$1', '$2', '$3').
  expr_160 -> expr_200 : '$1'.
  
  expr_200 -> expr_300 comp_op expr_300 :
  	?mkop2('$1', '$2', '$3').
  expr_200 -> expr_300 : '$1'.
  
  expr_300 -> expr_400 list_op expr_300 :
  	?mkop2('$1', '$2', '$3').
  expr_300 -> expr_400 : '$1'.
  
  expr_400 -> expr_400 add_op expr_500 :
  	?mkop2('$1', '$2', '$3').
  expr_400 -> expr_500 : '$1'.
  
  expr_500 -> expr_500 mult_op expr_600 :
  	?mkop2('$1', '$2', '$3').
  expr_500 -> expr_600 : '$1'.
  
  expr_600 -> prefix_op expr_600 :
  	?mkop1('$1', '$2').
  expr_600 -> expr_650 : '$1'.
  
  expr_650 -> map_expr : '$1'.
  expr_650 -> expr_700 : '$1'.
  
  expr_700 -> function_call : '$1'.
  expr_700 -> record_expr : '$1'.
  expr_700 -> expr_800 : '$1'.
  
  expr_800 -> expr_max ':' expr_max :
  	{remote,?anno('$2'),'$1','$3'}.
  expr_800 -> expr_max : '$1'.
  
  expr_max -> var : '$1'.
  expr_max -> atomic : '$1'.
  
negative.code: expr_max -> fun_expr : '$1'.
  expr_max -> try_expr : '$1'.
  
  pat_expr -> pat_expr '=' pat_expr : {match,?anno('$2'),'$1','$3'}.
  pat_expr -> pat_expr comp_op pat_expr : ?mkop2('$1', '$2', '$3').
  pat_expr -> pat_expr list_op pat_expr : ?mkop2('$1', '$2', '$3').
  pat_expr -> pat_expr add_op pat_expr : ?mkop2('$1', '$2', '$3').
  pat_expr -> pat_expr mult_op pat_expr : ?mkop2('$1', '$2', '$3').
  pat_expr -> prefix_op pat_expr : ?mkop1('$1', '$2').
  pat_expr -> map_pat_expr : '$1'.
  pat_expr -> record_pat_expr : '$1'.
  pat_expr -> pat_expr_max : '$1'.
  
  pat_expr_max -> var : '$1'.
  pat_expr_max -> atomic : '$1'.
  