@@ -2,9 +2,10 @@ Nonterminals
22 grammar expr_list
33 expr paren_expr block_expr fn_expr bracket_expr call_expr bracket_at_expr max_expr
44 base_expr matched_expr matched_op_expr unmatched_expr op_expr
5- add_op mult_op unary_op two_op regex_op right_op bin_concat_op
5+ mult_op two_op regex_op right_op bin_concat_op
66 match_op send_op default_op when_op pipe_op in_op inc_op range_op
7- andand_op oror_op and_op or_op comp_expr_op colon_colon_op three_op at_op
7+ andand_op oror_op and_op or_op colon_colon_op three_op
8+ comp_op_eol at_op_eol unary_op_eol dual_op_eol
89 open_paren close_paren empty_paren
910 open_bracket close_bracket
1011 open_curly close_curly
@@ -26,13 +27,14 @@ Terminals
2627 bracket_identifier paren_identifier do_identifier block_identifier
2728 fn 'end' aliases
2829 number signed_number atom bin_string list_string sigil
29- dot_call_op comp_op op_identifier
30+ dot_call_op op_identifier
31+ comp_op at_op unary_op dual_op
3032 'not' 'and' 'or' 'xor' 'when' 'in' 'inlist' 'inbits' 'do'
3133 'true' 'false' 'nil'
32- '=' '+' '-' ' *' '/' '++' '--' '**' '//'
34+ '=' '*' '/' '++' '--' '**' '//'
3335 '(' ')' '[' ']' '{' '}' '<<' '>>' '::'
34- eol ',' '&' '|' '.' '^' '@' ' <-' '<>' '->' '|>' '=~'
35- '&&' '||' '!' ' ...' '..'
36+ eol ',' '&' '|' '.' '<-' '<>' '->' '|>' '=~'
37+ '&&' '||' '...' '..'
3638 '<<<' '>>>' '&&&' '|||' '^^^' '~~~'
3739 .
3840
@@ -52,20 +54,20 @@ Left 120 oror_op.
5254Left 130 andand_op .
5355Left 140 or_op .
5456Left 150 and_op .
55- Left 160 comp_expr_op .
57+ Left 160 comp_op_eol .
5658Left 170 in_op .
5759Right 180 regex_op .
5860Right 190 right_op .
5961Left 200 range_op .
6062Left 210 three_op .
61- Left 220 add_op .
63+ Left 220 dual_op_eol . % % +, -
6264Left 230 mult_op .
6365Right 240 bin_concat_op .
6466Right 250 two_op .
65- Nonassoc 300 unary_op .
67+ Nonassoc 300 unary_op_eol . % % +, -, !, ^
6668Left 310 dot_call_op .
6769Left 310 dot_op .
68- Nonassoc 320 at_op .
70+ Nonassoc 320 at_op_eol . % % @<op>
6971Nonassoc 330 var .
7072
7173% %% MAIN FLOW OF EXPRESSIONS
@@ -89,19 +91,19 @@ expr -> matched_expr : '$1'.
8991expr -> unmatched_expr : '$1' .
9092
9193matched_expr -> matched_expr matched_op_expr : build_op (element (1 , '$2' ), '$1' , element (2 , '$2' )).
92- matched_expr -> unary_op matched_expr : build_unary_op ('$1' , '$2' ).
93- matched_expr -> at_op matched_expr : build_unary_op ('$1' , '$2' ).
94+ matched_expr -> unary_op_eol matched_expr : build_unary_op ('$1' , '$2' ).
95+ matched_expr -> at_op_eol matched_expr : build_unary_op ('$1' , '$2' ).
9496matched_expr -> bracket_at_expr : '$1' .
9597matched_expr -> fn_expr : '$1' .
9698
9799unmatched_expr -> matched_expr op_expr : build_op (element (1 , '$2' ), '$1' , element (2 , '$2' )).
98100unmatched_expr -> unmatched_expr op_expr : build_op (element (1 , '$2' ), '$1' , element (2 , '$2' )).
99- unmatched_expr -> unary_op expr : build_unary_op ('$1' , '$2' ).
100- unmatched_expr -> at_op expr : build_unary_op ('$1' , '$2' ).
101+ unmatched_expr -> unary_op_eol expr : build_unary_op ('$1' , '$2' ).
102+ unmatched_expr -> at_op_eol expr : build_unary_op ('$1' , '$2' ).
101103unmatched_expr -> block_expr : '$1' .
102104
103105op_expr -> match_op expr : { '$1' , '$2' }.
104- op_expr -> add_op expr : { '$1' , '$2' }.
106+ op_expr -> dual_op_eol expr : { '$1' , '$2' }.
105107op_expr -> mult_op expr : { '$1' , '$2' }.
106108op_expr -> two_op expr : { '$1' , '$2' }.
107109op_expr -> regex_op expr : { '$1' , '$2' }.
@@ -120,10 +122,10 @@ op_expr -> send_op expr : { '$1', '$2' }.
120122op_expr -> range_op expr : { '$1' , '$2' }.
121123op_expr -> default_op expr : { '$1' , '$2' }.
122124op_expr -> colon_colon_op expr : { '$1' , '$2' }.
123- op_expr -> comp_expr_op expr : { '$1' , '$2' }.
125+ op_expr -> comp_op_eol expr : { '$1' , '$2' }.
124126
125127matched_op_expr -> match_op matched_expr : { '$1' , '$2' }.
126- matched_op_expr -> add_op matched_expr : { '$1' , '$2' }.
128+ matched_op_expr -> dual_op_eol matched_expr : { '$1' , '$2' }.
127129matched_op_expr -> mult_op matched_expr : { '$1' , '$2' }.
128130matched_op_expr -> two_op matched_expr : { '$1' , '$2' }.
129131matched_op_expr -> regex_op matched_expr : { '$1' , '$2' }.
@@ -142,7 +144,7 @@ matched_op_expr -> send_op matched_expr : { '$1', '$2' }.
142144matched_op_expr -> range_op matched_expr : { '$1' , '$2' }.
143145matched_op_expr -> default_op matched_expr : { '$1' , '$2' }.
144146matched_op_expr -> colon_colon_op matched_expr : { '$1' , '$2' }.
145- matched_op_expr -> comp_expr_op matched_expr : { '$1' , '$2' }.
147+ matched_op_expr -> comp_op_eol matched_expr : { '$1' , '$2' }.
146148
147149block_expr -> parens_call call_args_parens do_block : build_identifier ('$1' , '$2' ++ '$3' ).
148150block_expr -> parens_call call_args_parens call_args_parens do_block : build_nested_parens ('$1' , '$2' , '$3' ++ '$4' ).
@@ -171,9 +173,12 @@ max_expr -> open_paren stab close_paren : build_stab(lists:reverse('$2')).
171173bracket_expr -> dot_bracket_identifier bracket_access : build_access (build_identifier ('$1' , nil ), '$2' ).
172174bracket_expr -> max_expr bracket_access : build_access ('$1' , '$2' ).
173175
174- bracket_at_expr -> at_op dot_bracket_identifier bracket_access : build_access (build_unary_op ('$1' , build_identifier ('$2' , nil )), '$3' ).
175- bracket_at_expr -> at_op max_expr bracket_access : build_access (build_unary_op ('$1' , '$2' ), '$3' ).
176- bracket_at_expr -> bracket_at_expr bracket_access : build_access ('$1' , '$2' ).
176+ bracket_at_expr -> at_op_eol dot_bracket_identifier bracket_access :
177+ build_access (build_unary_op ('$1' , build_identifier ('$2' , nil )), '$3' ).
178+ bracket_at_expr -> at_op_eol max_expr bracket_access :
179+ build_access (build_unary_op ('$1' , '$2' ), '$3' ).
180+ bracket_at_expr -> bracket_at_expr bracket_access :
181+ build_access ('$1' , '$2' ).
177182
178183base_expr -> number : ? exprs ('$1' ).
179184base_expr -> signed_number : { element (4 , '$1' ), [{line ,? line ('$1' )}], ? exprs ('$1' ) }.
@@ -262,10 +267,8 @@ close_curly -> eol '}' : '$2'.
262267
263268% Operators
264269
265- add_op -> '+' : '$1' .
266- add_op -> '-' : '$1' .
267- add_op -> '+' eol : '$1' .
268- add_op -> '-' eol : '$1' .
270+ dual_op_eol -> dual_op : '$1' .
271+ dual_op_eol -> dual_op eol : '$1' .
269272
270273mult_op -> '*' : '$1' .
271274mult_op -> '/' : '$1' .
@@ -302,21 +305,14 @@ default_op -> '//' eol : '$1'.
302305colon_colon_op -> '::' : '$1' .
303306colon_colon_op -> '::' eol : '$1' .
304307
305- unary_op -> '+' : '$1' .
306- unary_op -> '+' eol : '$1' .
307- unary_op -> '-' : '$1' .
308- unary_op -> '-' eol : '$1' .
309- unary_op -> '!' : '$1' .
310- unary_op -> '!' eol : '$1' .
311- unary_op -> '^' : '$1' .
312- unary_op -> '^' eol : '$1' .
313- unary_op -> 'not' : '$1' .
314- unary_op -> 'not' eol : '$1' .
315- unary_op -> '~~~' : '$1' .
316- unary_op -> '~~~' eol : '$1' .
317-
318- at_op -> '@' : '$1' .
319- at_op -> '@' eol : '$1' .
308+ unary_op_eol -> unary_op : '$1' .
309+ unary_op_eol -> unary_op eol : '$1' .
310+ unary_op_eol -> dual_op : '$1' .
311+ unary_op_eol -> dual_op eol : '$1' .
312+ unary_op_eol -> 'not' : '$1' .
313+ unary_op_eol -> 'not' eol : '$1' .
314+ unary_op_eol -> '~~~' : '$1' .
315+ unary_op_eol -> '~~~' eol : '$1' .
320316
321317match_op -> '=' : '$1' .
322318match_op -> '=' eol : '$1' .
@@ -361,8 +357,11 @@ send_op -> '<-' eol : '$1'.
361357range_op -> '..' : '$1' .
362358range_op -> '..' eol : '$1' .
363359
364- comp_expr_op -> comp_op : '$1' .
365- comp_expr_op -> comp_op eol : '$1' .
360+ at_op_eol -> at_op : '$1' .
361+ at_op_eol -> at_op eol : '$1' .
362+
363+ comp_op_eol -> comp_op : '$1' .
364+ comp_op_eol -> comp_op eol : '$1' .
366365
367366% Dot operator
368367
@@ -483,15 +482,18 @@ Erlang code.
483482
484483% % Operators
485484
486- build_op ({ _ , _ , _ } = Op , Left , Right ) ->
487- { ? exprs ( Op ), [{ line , ? line ( Op )}], [ Left , Right ] } ;
485+ build_op ({ _ , Line , Op } , Left , Right ) ->
486+ build_op ({ Op , Line }, Left , Right ) ;
488487
489488build_op ({ BOp , Line }, { UOp , _ , [Left ] }, Right ) when ? rearrange_bop (BOp ), ? rearrange_uop (UOp ) ->
490489 { UOp , [{line ,Line }], [{ BOp , [{line ,Line }], [Left , Right ] }] };
491490
492491build_op (Op , Left , Right ) ->
493492 { ? op (Op ), [{line ,? line (Op )}], [Left , Right ] }.
494493
494+ build_unary_op ({ _Kind , Line , Op }, Expr ) ->
495+ { Op , [{line ,Line }], [Expr ] };
496+
495497build_unary_op (Op , Expr ) ->
496498 { ? op (Op ), [{line ,? line (Op )}], [Expr ] }.
497499
0 commit comments