@@ -3,7 +3,7 @@ Nonterminals
33 expr container_expr block_expr no_parens_expr no_parens_one_expr access_expr
44 bracket_expr bracket_at_expr bracket_arg matched_expr unmatched_expr max_expr
55 op_expr matched_op_expr no_parens_op_expr
6- comp_op_eol at_op_eol unary_op_eol and_op_eol or_op_eol
6+ comp_op_eol at_op_eol unary_op_eol and_op_eol or_op_eol capture_op_eol
77 add_op_eol mult_op_eol exp_op_eol two_op_eol pipe_op_eol stab_op_eol
88 arrow_op_eol match_op_eol when_op_eol in_op_eol in_match_op_eol type_op_eol
99 open_paren close_paren empty_paren
@@ -29,7 +29,7 @@ Terminals
2929 number signed_number atom atom_safe atom_unsafe bin_string list_string sigil
3030 dot_call_op op_identifier
3131 comp_op at_op unary_op and_op or_op arrow_op match_op in_op in_match_op type_op
32- dual_op add_op mult_op exp_op two_op pipe_op stab_op when_op assoc_op
32+ dual_op add_op mult_op exp_op two_op pipe_op stab_op when_op assoc_op capture_op
3333 'true' 'false' 'nil' 'do' eol ',' '.'
3434 '(' ')' '[' ']' '{' '}' '<<' '>>' '%{}' '%'
3535 .
@@ -45,6 +45,7 @@ Expect 2.
4545Left 5 do .
4646Right 10 stab_op_eol . % % ->
4747Left 20 ',' .
48+ Nonassoc 30 capture_op_eol . % % &
4849Left 40 in_match_op_eol . % % <-, \\ (allowed in matches along =)
4950Right 50 when_op_eol . % % when
5051Right 60 type_op_eol . % % ::
@@ -60,7 +61,7 @@ Right 200 two_op_eol. %% ++, --, .., <>
6061Left 210 add_op_eol . % % + (op), - (op)
6162Left 220 mult_op_eol . % % * (op), / (op)
6263Left 250 exp_op_eol . % % ^ (op) (e.g ^^^)
63- Nonassoc 300 unary_op_eol . % % +, -, !, ^, not, &, ~~~
64+ Nonassoc 300 unary_op_eol . % % +, -, !, ^, not, ~~~
6465Left 310 dot_call_op .
6566Left 310 dot_op . % % .
6667Nonassoc 320 at_op_eol . % % @
@@ -112,6 +113,8 @@ matched_expr -> unary_op_eol matched_expr : build_unary_op('$1', '$2').
112113matched_expr -> unary_op_eol no_parens_expr : build_unary_op ('$1' , '$2' ).
113114matched_expr -> at_op_eol matched_expr : build_unary_op ('$1' , '$2' ).
114115matched_expr -> at_op_eol no_parens_expr : build_unary_op ('$1' , '$2' ).
116+ matched_expr -> capture_op_eol matched_expr : build_unary_op ('$1' , '$2' ).
117+ matched_expr -> capture_op_eol no_parens_expr : build_unary_op ('$1' , '$2' ).
115118matched_expr -> no_parens_one_expr : '$1' .
116119matched_expr -> access_expr : '$1' .
117120
@@ -123,6 +126,7 @@ unmatched_expr -> matched_expr op_expr : build_op(element(1, '$2'), '$1', elemen
123126unmatched_expr -> unmatched_expr op_expr : build_op (element (1 , '$2' ), '$1' , element (2 , '$2' )).
124127unmatched_expr -> unary_op_eol expr : build_unary_op ('$1' , '$2' ).
125128unmatched_expr -> at_op_eol expr : build_unary_op ('$1' , '$2' ).
129+ unmatched_expr -> capture_op_eol expr : build_unary_op ('$1' , '$2' ).
126130unmatched_expr -> block_expr : '$1' .
127131
128132block_expr -> parens_call call_args_parens do_block : build_identifier ('$1' , '$2' ++ '$3' ).
@@ -189,7 +193,9 @@ no_parens_one_expr -> dot_identifier : build_identifier('$1', nil).
189193% % marks identifiers followed by brackets as bracket_identifier.
190194access_expr -> bracket_at_expr : '$1' .
191195access_expr -> bracket_expr : '$1' .
196+ access_expr -> at_op_eol number : build_unary_op ('$1' , ? exprs ('$2' )).
192197access_expr -> unary_op_eol number : build_unary_op ('$1' , ? exprs ('$2' )).
198+ access_expr -> capture_op_eol number : build_unary_op ('$1' , ? exprs ('$2' )).
193199access_expr -> fn_eol stab end_eol : build_fn ('$1' , build_stab (reverse ('$2' ))).
194200access_expr -> open_paren stab close_paren : build_stab (reverse ('$2' )).
195201access_expr -> number : ? exprs ('$1' ).
@@ -313,6 +319,9 @@ two_op_eol -> two_op eol : '$1'.
313319pipe_op_eol -> pipe_op : '$1' .
314320pipe_op_eol -> pipe_op eol : '$1' .
315321
322+ capture_op_eol -> capture_op : '$1' .
323+ capture_op_eol -> capture_op eol : '$1' .
324+
316325unary_op_eol -> unary_op : '$1' .
317326unary_op_eol -> unary_op eol : '$1' .
318327unary_op_eol -> dual_op : '$1' .
@@ -532,12 +541,6 @@ meta(Node) -> meta(?line(Node)).
532541
533542% % Operators
534543
535- build_op ({_Kind , Line , '/' }, {'&' , _ , [{Kind , _ , Atom } = Left ]}, Right ) when is_number (Right ), is_atom (Atom ), is_atom (Kind ) ->
536- {'&' , meta (Line ), [{'/' , meta (Line ), [Left , Right ]}]};
537-
538- build_op ({_Kind , Line , '/' }, {'&' , _ , [{{'.' , _ , [_ , _ ]}, _ , []} = Left ]}, Right ) when is_number (Right ) ->
539- {'&' , meta (Line ), [{'/' , meta (Line ), [Left , Right ]}]};
540-
541544build_op ({_Kind , Line , 'in' }, {UOp , _ , [Left ]}, Right ) when ? rearrange_uop (UOp ) ->
542545 {UOp , meta (Line ), [{'in' , meta (Line ), [Left , Right ]}]};
543546
0 commit comments