anchor.diff:      catch _:_R -> ret_err(?line(Expr), "bad attribute")
       end.
   
  -package_segments(Name) ->
  -    package_segments(Name, [], []).
  -
  -package_segments({record_field, _, F1, F2}, Fs, As) ->
  -    package_segments(F1, [F2 | Fs], As);
  -package_segments({atom, _, A}, [F | Fs], As) ->
  -    package_segments(F, Fs, [A | As]);
  -package_segments({atom, _, A}, [], As) ->
  -    lists:reverse([A | As]);
  -package_segments(_, _, _) ->
  -    error.
  -
   %% build_function([Clause]) -> {function,Line,Name,Arity,[Clause]}
   
   build_function(Cs) ->
  
positive.code:     [normalise(Head)|normalise(Tail)];
  normalise({tuple,_,Args}) ->
      list_to_tuple(normalise_list(Args));
  %% Atom dot-notation, as in 'foo.bar.baz'
  normalise({record_field,_,_,_}=A) ->
      case package_segments(A) of
  	error -> erlang:error({badarg, A});
  	As -> list_to_atom(packages:concat(As))
      end;
  %% Special case for unary +/-.
  normalise({op,_,'+',{char,_,I}}) -> I;
  normalise({op,_,'+',{integer,_,I}}) -> I;
  
negative.code: 
  func_prec() -> {800,700}.
  
  -spec max_prec() -> 900.
  
  max_prec() -> 900.
  
  %%% [Experimental]. The parser just copies the attributes of the
  %%% scanner tokens to the abstract format. This design decision has
  