anchor.diff:  
   %% Extract operators from op tokens
   op({Op, _Line}) ->
  -  Op.
  -
  -%% Extract the atom name from an identifier
  -identifier_atom({identifier, _Line, Atom}) ->
  -  Atom.
  -
  -%% Generate proper forms for function identifiers
  -function_identifier({identifier, _Line, _Atom} = Identifier) ->
  -  Identifier;
  -function_identifier({punctuated_identifier, Line, Atom}) ->
  -  {identifier, Line, Atom};
  -function_identifier({class, Line}) ->
  -  {identifier, Line, class}.
  -    
  -%% Interpolate strings, parsing the contents of #{...} tags
  -interpolate_string({string, Line, String}) ->
  -  interpolate_string(String, Line, [], []).
  -  
  -interpolate_string([], Line, CharAcc, ExprAcc) ->
  -  Result = case CharAcc of
  -    [] -> lists:reverse(ExprAcc);
  -    _  -> lists:reverse([{string, Line, lists:reverse(CharAcc)}|ExprAcc])
  -  end,
  -  case Result of
  -    [{string, Line, _} = Res] -> Res;
  -    _ -> {dstring, Line, Result}
  -  end;
  -interpolate_string("#{" ++ String, Line, CharAcc, ExprAcc) ->
  -  {String2, Expr} = extract_fragment([], String, Line),
  -  ExprAcc2 = case CharAcc of
  -    [] -> ExprAcc;
  -    _  -> [{string, Line, lists:reverse(CharAcc)}|ExprAcc]
  -  end,
  -  interpolate_string(String2, Line, [], [Expr|ExprAcc2]);
  -interpolate_string([Char|Rest], Line, CharAcc, ExprAcc) ->
  -  interpolate_string(Rest, Line, [Char|CharAcc], ExprAcc).
  -  
  -extract_fragment(_Continuation, [], Line) ->
  -  throw({error, {Line, "unexpected end of interpolated string"}});
  -extract_fragment(_Continuation, [$"|_], Line) ->
  -  throw({error, {Line, "invalid quote within interpolated string"}});
  -extract_fragment(Continuation, [$}|String], Line) ->
  -  {more, Continuation2} = reia_scan:tokens(Continuation, [$}], Line),
  -  case Continuation2 of
  -    {tokens, _, _, _, _, [{'}', _}|Tokens], _, _} ->
  -      case reia_parse:parse(lists:reverse(Tokens)) of
  -        {ok, [Expr]} ->
  -          {String, Expr};
  -        %% Need more tokens
  -        {error, {999999, _}} ->
  -          extract_fragment(Continuation2, String, Line);
  -        Error ->
  -          throw(Error)
  -      end;
  -    {skip_tokens, _, _, _, _, {_, _, Error}, _, _} ->
  -      throw({error, {Line, Error}})
  -  end;
  -extract_fragment(Continuation, [Char|String], Line) ->
  -  {more, Continuation2} = reia_scan:tokens(Continuation, [Char], Line),
  -  extract_fragment(Continuation2, String, Line).
  +  Op.
positive.code: expr_list -> eol expr_list : '$2'.
  expr_list -> expr eol expr_list : ['$1'|'$3'].
  
  %% Expressions (comma delimited)
  exprs -> expr : ['$1'].
  exprs -> expr eol : ['$1'].
  exprs -> eol exprs : '$2'.
  exprs -> expr ',' exprs : ['$1'|'$3'].
  
  expr -> inline_if_expr : '$1'.
  
  inline_if_expr -> match_expr 'if' match_expr : {'if', line('$2'), [{clause, line('$2'), '$3', ['$1']}]}.
  inline_if_expr -> match_expr 'unless' match_expr : {'if', line('$2'), [{clause, line('$2'), {op, line('$2'), 'not', '$3'}, ['$1']}]}.
  inline_if_expr -> match_expr : '$1'.
  
  match_expr -> send_expr '=' match_expr : {match, line('$2'), '$1', '$3'}.
  match_expr -> send_expr : '$1'.
  
  send_expr -> bool_expr '!' send_expr : {send, line('$2'), '$1', '$3'}.
  send_expr -> bool_expr : '$1'.
  
  bool_expr -> comp_expr bool_op bool_expr : {op, line('$1'), op('$2'), '$1', '$3'}.
  bool_expr -> comp_expr : '$1'.
  
  comp_expr -> range_expr comp_op range_expr : {op, line('$1'), op('$2'), '$1', '$3'}.
  comp_expr -> range_expr : '$1'.
  
  range_expr -> add_expr '..' range_expr : {range, line('$2'), '$1', '$3'}.
  range_expr -> add_expr : '$1'.
  
  add_expr -> mult_expr add_op add_expr : {op, line('$1'), op('$2'), '$1', '$3'}.
  add_expr -> mult_expr : '$1'.
  
negative.code: mult_expr -> pow_expr mult_op mult_expr : {op, line('$1'), op('$2'), '$1', '$3'}.
  mult_expr -> pow_expr : '$1'.
  
  pow_expr -> unary_expr pow_op pow_expr : {op, line('$1'), op('$2'), '$1', '$3'}.
  pow_expr -> unary_expr : '$1'.
  
  unary_expr -> unary_op unary_expr : {op, line('$1'), op('$1'), '$2'}.
  unary_expr -> terminal_expr : '$1'.
  
  % Terminals
  terminal_expr -> number     : '$1'.
  terminal_expr -> '(' expr ')' : '$2'.
  
  %% Addition operators
  add_op -> '+' : '$1'.
  