anchor.diff:  
   -export([string/1]).
   -include("reia_nodes.hrl").
  +-define(line(Node), element(2, Node)).
  +-define(identifier_name(Id), Id#identifier.name).
   
   %% Easy interface for parsing a given string with nicely formatted errors
   string(String) ->
  
positive.code:       {error, {Line, lists:flatten(io_lib:format("~p ~p", [Message, Token]))}}
    end.
  
  %% Keep track of line info in tokens
  line(Tup) -> element(2, Tup).
  
  %% Extract operators from op tokens
  op({Op, _Line}) ->
    Op.
negative.code: 
  expr -> match_expr : '$1'.
  
  match_expr -> add_expr '=' match_expr :   #match{line=?line('$2'), left='$1', right='$3'}.
  match_expr -> add_expr : '$1'.
  
  add_expr -> mult_expr add_op add_expr :   #binary_op{line=?line('$1'), type=op('$2'), val1='$1', val2='$3'}.
  add_expr -> mult_expr : '$1'.
  
  mult_expr -> pow_expr mult_op mult_expr : #binary_op{line=?line('$1'), type=op('$2'), val1='$1', val2='$3'}.
  mult_expr -> pow_expr : '$1'.
  
  pow_expr -> unary_expr pow_op pow_expr :  #binary_op{line=?line('$1'), type=op('$2'), val1='$1', val2='$3'}.
  pow_expr -> unary_expr : '$1'.
  
  unary_expr -> unary_op unary_expr :       #unary_op{line=?line('$1'), type=op('$1'), val='$2'}.
  unary_expr -> call_expr : '$1'.
  
  call_expr -> call : '$1'.
  