anchor.diff:  Left     300 dot_call_op.
   Left     300 dot_op.
   Right    310 module_ref_op.
  -Nonassoc 320 ref_unary_op.
  +Nonassoc 320 unary_ref_op.
   Nonassoc 330 var.
  -
   
   %%% MAIN FLOW OF EXPRESSIONS
   
  
positive.code: expr -> matched_expr : '$1'.
  expr -> unmatched_expr : '$1'.
  
  matched_expr   -> matched_op_expr   : '$1'.
  unmatched_expr -> unmatched_op_expr : '$1'.
  
  unmatched_op_expr -> matched_expr match_op unmatched_expr : build_op('$2', '$1', '$3').
  unmatched_op_expr -> unary_op expr : build_unary_op('$1', '$2').
  unmatched_op_expr -> special_op expr : build_special_op('$1', '$2').
  unmatched_op_expr -> ref_unary_op expr : build_unary_op('$1', '$2').
  unmatched_op_expr -> block_expr : '$1'.
  
  matched_op_expr -> matched_expr match_op matched_expr : build_op('$2', '$1', '$3').
  matched_op_expr -> matched_expr add_op matched_expr : build_op('$2', '$1', '$3').
  matched_op_expr -> matched_expr mult_op matched_expr : build_op('$2', '$1', '$3').
  matched_op_expr -> matched_expr addadd_op matched_expr : build_op('$2', '$1', '$3').
  matched_op_expr -> matched_expr multmult_op matched_expr : build_op('$2', '$1', '$3').
  matched_op_expr -> matched_expr andand_op matched_expr : build_op('$2', '$1', '$3').
  matched_op_expr -> matched_expr oror_op matched_expr : build_op('$2', '$1', '$3').
  matched_op_expr -> matched_expr andalso_op matched_expr : build_op('$2', '$1', '$3').
  matched_op_expr -> matched_expr orelse_op matched_expr : build_op('$2', '$1', '$3').
  matched_op_expr -> matched_expr and_op matched_expr : build_op('$2', '$1', '$3').
  matched_op_expr -> matched_expr or_op matched_expr : build_op('$2', '$1', '$3').
  matched_op_expr -> matched_expr pipe_op matched_expr : build_op('$2', '$1', '$3').
  matched_op_expr -> matched_expr bin_concat_op matched_expr : build_op('$2', '$1', '$3').
  matched_op_expr -> matched_expr in_op matched_expr : build_op('$2', '$1', '$3').
  matched_op_expr -> matched_expr when_op matched_expr : build_op('$2', '$1', '$3').
  matched_op_expr -> matched_expr arrow_op matched_expr : build_op('$2', '$1', '$3').
  matched_op_expr -> matched_expr module_ref_op matched_expr : build_op('$2', '$1', '$3').
  matched_op_expr -> matched_expr default_op matched_expr : build_op('$2', '$1', '$3').
  matched_op_expr -> matched_expr comp_expr_op matched_expr : build_expr_op('$2', '$1', '$3').
  matched_op_expr -> unary_op matched_expr : build_unary_op('$1', '$2').
  matched_op_expr -> special_op matched_expr : build_special_op('$1', '$2').
  matched_op_expr -> ref_unary_op matched_expr : build_unary_op('$1', '$2').
  matched_op_expr -> stab_expr : '$1'.
  
  block_expr -> parens_call call_args_parens do_block : build_identifier('$1', '$2', '$3').
  block_expr -> dot_punctuated_identifier call_args_no_parens do_block : build_identifier('$1', '$2', '$3').
  
negative.code: 
  %% Operators
  
  build_op(Op, Left, Right) when size(Op) == 3 ->
    { ?exprs(Op), ?line(Op), [Left, Right] };
  
  build_op(Op, Left, Right) ->
    { ?op(Op), ?line(Op), [Left, Right] }.
  
  build_unary_op(Op, Expr) ->
    { ?op(Op), ?line(Op), [Expr] }.
  