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: %% Remote function calls
  call -> call_expr '.' identifier '(' ')' :
  #remote_call{
    line      = line('$2'),
    receiver  = '$1',
    name      = '$3',
    arguments = [],
    block     = #nil{line=line('$2')}
  }.
  
  call -> call_expr '.' identifier '(' exprs ')' :
  #remote_call{
    line      = line('$2'),
    receiver  = '$1',
    name      = '$3',
    arguments = '$5',
    block     = #nil{line=line('$2')}
  }.
  
  call -> erl '.' identifier '.' identifier '(' ')' :
  #native_call{
    line      = line('$2'),
    module    = '$3',
    function  = '$5',
    arguments = []
  
negative.code: number -> integer : '$1'.
  
  %% Lists
  list -> '[' ']' :       #empty{line=?line('$1')}.
  list -> '[' expr tail : #cons{line=?line('$1'), expr='$2', tail='$3'}.
  
  tail -> ']' : #empty{line=?line('$1')}.
  tail -> ',' '*' expr ']' : '$3'.
  tail -> ',' expr tail : #cons{line=?line('$1'), expr='$2', tail='$3'}.
  
  %% Tuples
  tuple -> '(' ')' :               #tuple{line=?line('$1'), elements=[]}.
  tuple -> '(' expr ',' ')' :      #tuple{line=?line('$1'), elements='$2'}.
  tuple -> '(' expr ',' exprs ')': #tuple{line=?line('$1'), elements=['$2'|'$4']}.
  
  %% Maps
  map -> '{' '}' :             #map{line=?line('$1'), elements=[]}.
  map -> '{' map_entries '}' : #map{line=?line('$1'), elements='$2'}.
  
  map_entries -> add_expr '=>' expr : [{'$1','$3'}]. % FIXME: change add_expr to 1 below match
  map_entries -> add_expr '=>' expr ',' map_entries : [{'$1','$3'}|'$5'].
  