anchor.diff:  string_list -> string_base '~' eol string_list : ['$1'|'$4'].
   
   % Erlang calls
  -erlang_call_expr -> Erlang '.' base_identifier '.' base_identifier call_args_parens : build_erlang_call(true, '$1', ?chars('$3'), ?chars('$5'), '$6').
  -erlang_call_expr -> Erlang '.' base_identifier '.' base_identifier call_args_optional : build_erlang_call(false, '$1', ?chars('$3'), ?chars('$5'), '$6').
  -erlang_call_expr -> Erlang '.' base_identifier '.' base_identifier : build_erlang_call(true, '$1', ?chars('$3'), ?chars('$5'), []).
  -erlang_call_expr -> Erlang '.' base_identifier call_args_parens : build_erlang_call(true, '$1', erlang, ?chars('$3'), '$4').
  -erlang_call_expr -> Erlang '.' base_identifier call_args_optional : build_erlang_call(false, '$1', erlang, ?chars('$3'), '$4').
  -erlang_call_expr -> Erlang '.' base_identifier : build_erlang_call(true, '$1', erlang, ?chars('$3'), []).
  +erlang_call_expr -> Erlang '.' base_identifier '.' base_identifier call_args_parens : build_erlang_call('$1', ?chars('$3'), ?chars('$5'), '$6').
  +erlang_call_expr -> Erlang '.' base_identifier '.' base_identifier call_args_optional : build_erlang_call('$1', ?chars('$3'), ?chars('$5'), '$6').
  +erlang_call_expr -> Erlang '.' base_identifier '.' base_identifier : build_erlang_call('$1', ?chars('$3'), ?chars('$5'), []).
  +erlang_call_expr -> Erlang '.' base_identifier call_args_parens : build_erlang_call('$1', erlang, ?chars('$3'), '$4').
  +erlang_call_expr -> Erlang '.' base_identifier call_args_optional : build_erlang_call('$1', erlang, ?chars('$3'), '$4').
  +erlang_call_expr -> Erlang '.' base_identifier : build_erlang_call('$1', erlang, ?chars('$3'), []).
   
   % Stab syntax
   stabber -> '->' : '$1'.
  
positive.code: build_def_method(Name, Args, Clauses) ->
    { def_method, ?line(Name), ?chars(Name), length(Args), [Clauses] }.
  
  build_method_call(true, Expr, Name, Args) ->
    { method_call, ?line(Name), ?chars(Name), Args, Expr };
  
  build_method_call(false, Expr, Name, Args) ->
    case Args of
      [{unary_op, Line, Op, Right}|T] ->
        Left = { method_call, ?line(Name), ?chars(Name), T, Expr },
        { binary_op, Line, Op, Left, Right };
      _ -> build_method_call(true, Expr, Name, Args)
    end.
  
  build_local_call(Name, Args) ->
    case Args of
      [{unary_op, Line, Op, Right}|T] ->
        Left = { local_call, ?line(Name), ?chars(Name), T },
        { binary_op, Line, Op, Left, Right };
      _ -> { local_call, ?line(Name), ?chars(Name), Args }
    end.
  
  build_erlang_call(true, Op, Prefix, Suffix, Args) ->
    { erlang_call, ?line(Op), Prefix, Suffix, Args };
  
  build_erlang_call(false, Op, Prefix, Suffix, Args) ->
    case Args of
      [{unary_op, Line, Op, Expr}|T] ->
        Call = { erlang_call, ?line(Op), Prefix, Suffix, T },
        { binary_op, Line, Op, Call, Expr };
      _ -> build_erlang_call(true, Op, Prefix, Suffix, Args)
    end.
  
  % Build a string list. If we are concatenating a non interpolated
  % string with an interpolated string, we need to escape the interpolation
  
negative.code: _fun_call_expr -> base_expr call_args_parens : build_fun_call('$1', '$2').
  
  % Method call
  _method_call_expr -> _call_exprs dot_eol method_name call_args_parens : build_method_call('$1', '$3', '$4').
  _method_call_expr -> _call_exprs dot_eol method_name call_args_optional : build_method_call('$1', '$3', '$4').
  _method_call_expr -> _without_args_method_call_expr : '$1'.
  _method_call_expr -> implicit_method_name call_args_optional : build_local_call('$1', '$2').
  _method_call_expr -> punctuated_identifier call_args_parens : build_local_call('$1', '$2').
  
  _without_args_method_call_expr -> _call_exprs dot_eol method_name : build_method_call('$1', '$3', []).
  
  %%% BUILDING BLOCKS
  
  