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: Nonterminals
    grammar
    expr_list
    exprs
    expr
    match_expr
    send_expr
    bool_expr
    bool_op
    comp_expr
    comp_op
    range_expr
    add_expr
    add_op
    mult_expr
    mult_op
    pow_expr
    pow_op
    declaration
    module_decl
    class_decl
    functions
    function
    funref_expr
    funref
    funcall_expr
    funcall
    function_identifier
    function_params
    block
    class_inst_expr
    class_inst
    erl_funcall_expr
    erl_funcall
    unary_expr
    unary_op  
    max_expr
    ivar
    clauses
    clause
    case_expr
    receive_expr
    after_clause
    if_expr
    inline_if_expr
    if_clause
    elseif_clauses
    elseif_clause
    else_clause
    for_expr
    try_expr
    catch_clauses
    catch_clause
    throw_expr
    number
    list
    tuple
    dict
    dict_entries
    binary
    lambda
    list_comprehension
    lc_exprs
    lc_expr
    .
    
  Terminals
    true false nil float integer string regexp atom
    identifier punctuated_identifier constant module class
    eol def fun do 'end' 'case' when 'if' elseif else unless 
    'and' 'or' 'not' 'try' 'catch' throw for in 'receive' 'after'
    '(' ')' '[' ']' '{' '}' '|' '<<' '>>'
    '+' '-' '*' '/' '%' '**' '!'
    '.' '..' ',' '::' '@' '&'
    '=' '==' '===' '!=' '>' '<' '=>' '<=' '>=' '<-'
    .
  
  Rootsymbol grammar.
  
negative.code: %% Unary operators
  unary_op -> '+'   : '$1'.
  unary_op -> '-'   : '$1'.
  
  %% Numbers
  number -> float : '$1'.
  number -> integer : '$1'.
  
  Erlang code.
  
  