anchor.diff:        {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.
positive.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'.
  
negative.code: 
  call -> erl '.' identifier '.' identifier '(' exprs ')' :
  #native_call{
    line      = ?line('$2'),
    module    = '$3',
    function  = '$5',
    arguments = '$7'
  