anchor.diff:  %%   "a:b->stack", "a:b(X)whenX==2->return"
   %% returns
   %%   {atom(M),atom(F),list(Arg)|integer(Arity),list(Guard),list(Action)}
  -parse(Str) -> 
  -  {Body,Guard,Action} = assert(split_fun(Str),no_module),
  -  {M,F,A} = assert(body_fun(Body),parse_error),
  -  Guards = assert(guards_fun(Guard),parse_error),
  -  Actions = assert(actions_fun(Action),parse_error),
  +parse(Str) ->
  +  {Body,Guard,Action} = assert(split_fun(Str),{split_string,Str}),
  +  {M,F,A}             = assert(body_fun(Body),{parse_body,Str}),
  +  Guards              = assert(guards_fun(Guard),{parse_guards,Str}),
  +  Actions             = assert(actions_fun(Action),{parse_actions,Str}),
     {M,F,A,Guards,Actions}.
   
  +%% split the input string in three parts; body, guards, actions
  +%% we parse them separately
   split_fun(Str) ->
     fun() ->
         % strip off the actions, if any
  
positive.code:   try MS=Method(Str),Str
    catch 
      _:{MS,_} -> Str;
      C:R      -> {C,R,Str,erlang:get_stacktrace()}
    end.
  
negative.code: 
  assert(Fun,Tag) ->
    try Fun()
    catch 
      _:{_,{error,{1,erl_parse,L}}} -> exit({Tag,lists:flatten(L)});
      _:R                           -> exit({Tag,R})
    end.
  
  
  