@@ -31,7 +31,7 @@ Terminals
3131 dot_call_op op_identifier
3232 comp_op at_op unary_op and_op or_op arrow_op match_op in_op in_match_op
3333 dual_op add_op mult_op exp_op two_op pipe_op stab_op when_op
34- 'true' 'false' 'nil' 'do' eol ',' '.' '&'
34+ 'true' 'false' 'nil' 'do' eol ',' '.'
3535 '(' ')' '[' ']' '{' '}' '<<' '>>'
3636 .
3737
@@ -105,6 +105,7 @@ expr -> unmatched_expr : '$1'.
105105% % segments and act accordingly.
106106matched_expr -> matched_expr matched_op_expr : build_op (element (1 , '$2' ), '$1' , element (2 , '$2' )).
107107matched_expr -> matched_expr no_parens_op_expr : build_op (element (1 , '$2' ), '$1' , element (2 , '$2' )).
108+ matched_expr -> unary_op_eol number : build_unary_op ('$1' , ? exprs ('$2' )).
108109matched_expr -> unary_op_eol matched_expr : build_unary_op ('$1' , '$2' ).
109110matched_expr -> unary_op_eol no_parens_expr : build_unary_op ('$1' , '$2' ).
110111matched_expr -> at_op_eol matched_expr : build_unary_op ('$1' , '$2' ).
@@ -210,7 +211,6 @@ base_expr -> list_string : build_list_string('$1').
210211base_expr -> atom_string : build_atom_string ('$1' ).
211212base_expr -> bit_string : '$1' .
212213base_expr -> sigil : build_sigil ('$1' ).
213- base_expr -> '&' number : { '&' , meta ('$1' ), [? exprs ('$2' )] }.
214214
215215% % Blocks
216216
@@ -244,7 +244,7 @@ stab_expr -> call_args_no_parens_all stab_op_eol stab_maybe_expr :
244244stab_expr -> stab_parens_many stab_op_eol stab_maybe_expr :
245245 build_op ('$2' , unwrap_splice ('$1' ), '$3' ).
246246stab_expr -> stab_parens_many when_op expr stab_op_eol stab_maybe_expr :
247- build_op ('$4' , [{ 'when' , meta ('$2' ), unwrap_splice ('$1' ) ++ ['$3' ] }], '$5' ).
247+ build_op ('$4' , [{ 'when' , meta ('$2' ), unwrap_splice ('$1' ) ++ ['$3' ] }], '$5' ).
248248
249249stab_maybe_expr -> 'expr' : '$1' .
250250stab_maybe_expr -> '$empty' : nil .
@@ -459,9 +459,7 @@ Erlang code.
459459-define (line (Node ), element (2 , Node )).
460460-define (exprs (Node ), element (3 , Node )).
461461-define (lexical (Kind ), Kind == import ; Kind == alias ; Kind == '__aliases__' ).
462-
463462-define (rearrange_uop (Op ), Op == 'not' orelse Op == '!' ).
464- -define (rearrange_bop (Op ), Op == 'in' orelse Op == 'inlist' orelse Op == 'inbits' ).
465463
466464% % The following directive is needed for (significantly) faster
467465% % compilation of the generated .erl file by the HiPE compiler
@@ -479,8 +477,8 @@ build_op({ _Kind, Line, '/' }, { '&', _, [{ Kind, _, Atom } = Left] }, Right) wh
479477build_op ({ _Kind , Line , '/' }, { '&' , _ , [{ { '.' , _ , [_ , _ ] }, _ , [] } = Left ] }, Right ) when is_number (Right ) ->
480478 { '&' , meta (Line ), [{ '/' , meta (Line ), [Left , Right ] }] };
481479
482- build_op ({ _Kind , Line , BOp }, { UOp , _ , [Left ] }, Right ) when ? rearrange_bop ( BOp ), ? rearrange_uop (UOp ) ->
483- { UOp , meta (Line ), [{ BOp , meta (Line ), [Left , Right ] }] };
480+ build_op ({ _Kind , Line , 'in' }, { UOp , _ , [Left ] }, Right ) when ? rearrange_uop (UOp ) ->
481+ { UOp , meta (Line ), [{ 'in' , meta (Line ), [Left , Right ] }] };
484482
485483build_op ({ _Kind , Line , Op }, Left , Right ) ->
486484 { Op , meta (Line ), [Left , Right ] }.
@@ -513,11 +511,17 @@ build_dot_alias(Dot, Other, { 'aliases', _, Right }) ->
513511build_dot (Dot , Left , Right ) ->
514512 { '.' , meta (Dot ), [Left , extract_identifier (Right )] }.
515513
514+ extract_identifier ({ Kind , _ , Identifier }) when
515+ Kind == identifier ; Kind == bracket_identifier ; Kind == paren_identifier ;
516+ Kind == do_identifier ; Kind == op_identifier ->
517+ Identifier .
518+
516519% % Identifiers
517520
518521build_nested_parens (Dot , Args1 , Args2 ) ->
519522 Identifier = build_identifier (Dot , Args1 ),
520- { Identifier , ? line (Identifier ), Args2 }.
523+ Meta = element (2 , Identifier ),
524+ { Identifier , Meta , Args2 }.
521525
522526build_identifier ({ '.' , Meta , _ } = Dot , Args ) ->
523527 FArgs = case Args of
@@ -538,13 +542,6 @@ build_identifier({ _, Line, Identifier }, Args) when ?lexical(Identifier) ->
538542build_identifier ({ _ , Line , Identifier }, Args ) ->
539543 { Identifier , meta (Line ), Args }.
540544
541- extract_identifier ({ Kind , _ , Identifier }) when
542- Kind == identifier ; Kind == bracket_identifier ; Kind == paren_identifier ;
543- Kind == do_identifier ; Kind == op_identifier ->
544- Identifier ;
545-
546- extract_identifier (Other ) -> Other .
547-
548545% % Fn
549546
550547build_fn (Op , Stab ) ->
0 commit comments