@@ -2,9 +2,10 @@ Nonterminals
2
2
grammar expr_list
3
3
expr paren_expr block_expr fn_expr bracket_expr call_expr bracket_at_expr max_expr
4
4
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
6
6
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
8
9
open_paren close_paren empty_paren
9
10
open_bracket close_bracket
10
11
open_curly close_curly
@@ -26,13 +27,14 @@ Terminals
26
27
bracket_identifier paren_identifier do_identifier block_identifier
27
28
fn 'end' aliases
28
29
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
30
32
'not' 'and' 'or' 'xor' 'when' 'in' 'inlist' 'inbits' 'do'
31
33
'true' 'false' 'nil'
32
- '=' '+' '-' ' *' '/' '++' '--' '**' '//'
34
+ '=' '*' '/' '++' '--' '**' '//'
33
35
'(' ')' '[' ']' '{' '}' '<<' '>>' '::'
34
- eol ',' '&' '|' '.' '^' '@' ' <-' '<>' '->' '|>' '=~'
35
- '&&' '||' '!' ' ...' '..'
36
+ eol ',' '&' '|' '.' '<-' '<>' '->' '|>' '=~'
37
+ '&&' '||' '...' '..'
36
38
'<<<' '>>>' '&&&' '|||' '^^^' '~~~'
37
39
.
38
40
@@ -52,20 +54,20 @@ Left 120 oror_op.
52
54
Left 130 andand_op .
53
55
Left 140 or_op .
54
56
Left 150 and_op .
55
- Left 160 comp_expr_op .
57
+ Left 160 comp_op_eol .
56
58
Left 170 in_op .
57
59
Right 180 regex_op .
58
60
Right 190 right_op .
59
61
Left 200 range_op .
60
62
Left 210 three_op .
61
- Left 220 add_op .
63
+ Left 220 dual_op_eol . % % +, -
62
64
Left 230 mult_op .
63
65
Right 240 bin_concat_op .
64
66
Right 250 two_op .
65
- Nonassoc 300 unary_op .
67
+ Nonassoc 300 unary_op_eol . % % +, -, !, ^
66
68
Left 310 dot_call_op .
67
69
Left 310 dot_op .
68
- Nonassoc 320 at_op .
70
+ Nonassoc 320 at_op_eol . % % @<op>
69
71
Nonassoc 330 var .
70
72
71
73
% %% MAIN FLOW OF EXPRESSIONS
@@ -89,19 +91,19 @@ expr -> matched_expr : '$1'.
89
91
expr -> unmatched_expr : '$1' .
90
92
91
93
matched_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' ).
94
96
matched_expr -> bracket_at_expr : '$1' .
95
97
matched_expr -> fn_expr : '$1' .
96
98
97
99
unmatched_expr -> matched_expr op_expr : build_op (element (1 , '$2' ), '$1' , element (2 , '$2' )).
98
100
unmatched_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' ).
101
103
unmatched_expr -> block_expr : '$1' .
102
104
103
105
op_expr -> match_op expr : { '$1' , '$2' }.
104
- op_expr -> add_op expr : { '$1' , '$2' }.
106
+ op_expr -> dual_op_eol expr : { '$1' , '$2' }.
105
107
op_expr -> mult_op expr : { '$1' , '$2' }.
106
108
op_expr -> two_op expr : { '$1' , '$2' }.
107
109
op_expr -> regex_op expr : { '$1' , '$2' }.
@@ -120,10 +122,10 @@ op_expr -> send_op expr : { '$1', '$2' }.
120
122
op_expr -> range_op expr : { '$1' , '$2' }.
121
123
op_expr -> default_op expr : { '$1' , '$2' }.
122
124
op_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' }.
124
126
125
127
matched_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' }.
127
129
matched_op_expr -> mult_op matched_expr : { '$1' , '$2' }.
128
130
matched_op_expr -> two_op matched_expr : { '$1' , '$2' }.
129
131
matched_op_expr -> regex_op matched_expr : { '$1' , '$2' }.
@@ -142,7 +144,7 @@ matched_op_expr -> send_op matched_expr : { '$1', '$2' }.
142
144
matched_op_expr -> range_op matched_expr : { '$1' , '$2' }.
143
145
matched_op_expr -> default_op matched_expr : { '$1' , '$2' }.
144
146
matched_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' }.
146
148
147
149
block_expr -> parens_call call_args_parens do_block : build_identifier ('$1' , '$2' ++ '$3' ).
148
150
block_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')).
171
173
bracket_expr -> dot_bracket_identifier bracket_access : build_access (build_identifier ('$1' , nil ), '$2' ).
172
174
bracket_expr -> max_expr bracket_access : build_access ('$1' , '$2' ).
173
175
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' ).
177
182
178
183
base_expr -> number : ? exprs ('$1' ).
179
184
base_expr -> signed_number : { element (4 , '$1' ), [{line ,? line ('$1' )}], ? exprs ('$1' ) }.
@@ -262,10 +267,8 @@ close_curly -> eol '}' : '$2'.
262
267
263
268
% Operators
264
269
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' .
269
272
270
273
mult_op -> '*' : '$1' .
271
274
mult_op -> '/' : '$1' .
@@ -302,21 +305,14 @@ default_op -> '//' eol : '$1'.
302
305
colon_colon_op -> '::' : '$1' .
303
306
colon_colon_op -> '::' eol : '$1' .
304
307
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' .
320
316
321
317
match_op -> '=' : '$1' .
322
318
match_op -> '=' eol : '$1' .
@@ -361,8 +357,11 @@ send_op -> '<-' eol : '$1'.
361
357
range_op -> '..' : '$1' .
362
358
range_op -> '..' eol : '$1' .
363
359
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' .
366
365
367
366
% Dot operator
368
367
@@ -483,15 +482,18 @@ Erlang code.
483
482
484
483
% % Operators
485
484
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 ) ;
488
487
489
488
build_op ({ BOp , Line }, { UOp , _ , [Left ] }, Right ) when ? rearrange_bop (BOp ), ? rearrange_uop (UOp ) ->
490
489
{ UOp , [{line ,Line }], [{ BOp , [{line ,Line }], [Left , Right ] }] };
491
490
492
491
build_op (Op , Left , Right ) ->
493
492
{ ? op (Op ), [{line ,? line (Op )}], [Left , Right ] }.
494
493
494
+ build_unary_op ({ _Kind , Line , Op }, Expr ) ->
495
+ { Op , [{line ,Line }], [Expr ] };
496
+
495
497
build_unary_op (Op , Expr ) ->
496
498
{ ? op (Op ), [{line ,? line (Op )}], [Expr ] }.
497
499
0 commit comments