anchor.diff:  
   dot_identifier -> identifier : '$1'.
   dot_identifier -> dot_call_op call_args_parens : build_identifier('$1', '$2'). % .(args)
  -dot_identifier -> expr dot_op identifier : { '.', ?line('$2'), ['$1', '$3'] }.
  +dot_identifier -> matched_expr dot_op identifier : { '.', ?line('$2'), ['$1', '$3'] }.
   
   dot_paren_identifier -> paren_identifier : '$1'.
  -dot_paren_identifier -> expr dot_op paren_identifier : { '.', ?line('$2'), ['$1', '$3'] }.
  +dot_paren_identifier -> matched_expr dot_op paren_identifier : { '.', ?line('$2'), ['$1', '$3'] }.
   
   dot_punctuated_identifier -> punctuated_identifier : '$1'.
  -dot_punctuated_identifier -> expr dot_op punctuated_identifier : { '.', ?line('$2'), ['$1', '$3'] }.
  -
  -dot_call_expr -> expr dot_call_op : { '.', ?line('$2'), ['$1'] }.
  +dot_punctuated_identifier -> matched_expr dot_op punctuated_identifier : { '.', ?line('$2'), ['$1', '$3'] }.
  +
  +dot_call_expr -> matched_expr dot_call_op : { '.', ?line('$2'), ['$1'] }.
   
   % Function calls
  +
  +matched_comma_expr -> matched_expr : ['$1'].
  +matched_comma_expr -> matched_comma_expr comma_separator matched_expr : ['$3'|'$1'].
  +
  +call_args_no_parens -> matched_comma_expr : lists:reverse('$1').
  +call_args_no_parens -> matched_base_orddict : ['$1'].
  +call_args_no_parens -> matched_comma_expr comma_separator matched_base_orddict : lists:reverse(['$3'|'$1']).
   
   comma_expr -> expr : ['$1'].
   comma_expr -> comma_expr comma_separator expr : ['$3'|'$1'].
   
  -call_args -> call_args_no_parens : build_args('$1').
  -
  -call_args_no_parens -> comma_expr : lists:reverse('$1').
  -call_args_no_parens -> base_orddict : ['$1'].
  -call_args_no_parens -> comma_expr comma_separator base_orddict : lists:reverse(['$3'|'$1']).
  +call_args_comma_expr -> comma_expr : lists:reverse('$1').
  +call_args_comma_expr -> base_orddict : ['$1'].
  +call_args_comma_expr -> comma_expr comma_separator base_orddict : lists:reverse(['$3'|'$1']).
   
   call_args_parens -> open_paren ')' : [].
  -call_args_parens -> open_paren call_args_no_parens close_paren : '$2'.
  +call_args_parens -> open_paren call_args_comma_expr close_paren : '$2'.
  +
  +call_args -> call_args_comma_expr : build_args('$1').
   
   % KV and orddict
   
  
positive.code: kv_comma -> kv_eol expr : [{?exprs('$1'),'$2'}].
  kv_comma -> kv_eol expr comma_separator kv_comma : [{?exprs('$1'), '$2'}|'$4'].
  
  base_orddict -> kv_comma : { '[:]', ?line(hd('$1')), '$1' }.
  
  % KV blocks
  
  
negative.code: 
  Nonterminals
    grammar expr_list
    expr unmatched_expr matched_expr op_expr curly_expr call_expr max_expr base_expr
    comma_separator kv_eol
    add_op mult_op unary_op match_op andand_op oror_op
    open_paren close_paren
    open_bracket close_bracket
    open_curly close_curly
    comma_expr call_args_comma_expr call_args call_args_parens
    matched_comma_expr call_args_no_parens
    kv_comma base_orddict
    matched_kv_comma matched_base_orddict
    do_eol end_eol kv_list do_block curly_block
    list list_args
    dot_op dot_identifier dot_paren_identifier dot_punctuated_identifier dot_call_expr
  