diff options
Diffstat (limited to 'lib/stdlib/src/erl_parse.yrl')
| -rw-r--r-- | lib/stdlib/src/erl_parse.yrl | 88 | 
1 files changed, 76 insertions, 12 deletions
diff --git a/lib/stdlib/src/erl_parse.yrl b/lib/stdlib/src/erl_parse.yrl index 6e72d64acc..9602f0bcd9 100644 --- a/lib/stdlib/src/erl_parse.yrl +++ b/lib/stdlib/src/erl_parse.yrl @@ -2,7 +2,7 @@  %%  %% %CopyrightBegin%  %% -%% Copyright Ericsson AB 1996-2017. All Rights Reserved. +%% Copyright Ericsson AB 1996-2018. All Rights Reserved.  %%  %% Licensed under the Apache License, Version 2.0 (the "License");  %% you may not use this file except in compliance with the License. @@ -29,6 +29,10 @@ clause_args clause_guard clause_body  expr expr_100 expr_150 expr_160 expr_200 expr_300 expr_400 expr_500  expr_600 expr_700 expr_800  expr_max +pat_expr pat_expr_200 pat_expr_300 pat_expr_400 pat_expr_500 +pat_expr_600 pat_expr_700 pat_expr_800 +pat_expr_max map_pat_expr record_pat_expr +pat_argument_list pat_exprs  list tail  list_comprehension lc_expr lc_exprs  binary_comprehension @@ -37,7 +41,7 @@ record_expr record_tuple record_field record_fields  map_expr map_tuple map_field map_field_assoc map_field_exact map_fields map_key  if_expr if_clause if_clauses case_expr cr_clause cr_clauses receive_expr  fun_expr fun_clause fun_clauses atom_or_var integer_or_var -try_expr try_catch try_clause try_clauses +try_expr try_catch try_clause try_clauses try_opt_stacktrace  function_call argument_list  exprs guard  atomic strings @@ -66,7 +70,7 @@ char integer float atom string var  'spec' 'callback' % helper  dot. -Expect 2. +Expect 0.  Rootsymbol form. @@ -210,7 +214,7 @@ function_clause -> atom clause_args clause_guard clause_body :  	{clause,?anno('$1'),element(3, '$1'),'$2','$3','$4'}. -clause_args -> argument_list : element(1, '$1'). +clause_args -> pat_argument_list : element(1, '$1').  clause_guard -> 'when' guard : '$2'.  clause_guard -> '$empty' : []. @@ -275,6 +279,53 @@ expr_max -> receive_expr : '$1'.  expr_max -> fun_expr : '$1'.  expr_max -> try_expr : '$1'. +pat_expr -> pat_expr_200 '=' pat_expr : {match,?anno('$2'),'$1','$3'}. +pat_expr -> pat_expr_200 : '$1'. + +pat_expr_200 -> pat_expr_300 comp_op pat_expr_300 : +	?mkop2('$1', '$2', '$3'). +pat_expr_200 -> pat_expr_300 : '$1'. + +pat_expr_300 -> pat_expr_400 list_op pat_expr_300 : +	?mkop2('$1', '$2', '$3'). +pat_expr_300 -> pat_expr_400 : '$1'. + +pat_expr_400 -> pat_expr_400 add_op pat_expr_500 : +	?mkop2('$1', '$2', '$3'). +pat_expr_400 -> pat_expr_500 : '$1'. + +pat_expr_500 -> pat_expr_500 mult_op pat_expr_600 : +	?mkop2('$1', '$2', '$3'). +pat_expr_500 -> pat_expr_600 : '$1'. + +pat_expr_600 -> prefix_op pat_expr_700 : +	?mkop1('$1', '$2'). +pat_expr_600 -> map_pat_expr : '$1'. +pat_expr_600 -> pat_expr_700 : '$1'. + +pat_expr_700 -> record_pat_expr : '$1'. +pat_expr_700 -> pat_expr_800 : '$1'. + +pat_expr_800 -> pat_expr_max : '$1'. + +pat_expr_max -> var : '$1'. +pat_expr_max -> atomic : '$1'. +pat_expr_max -> list : '$1'. +pat_expr_max -> binary : '$1'. +pat_expr_max -> tuple : '$1'. +pat_expr_max -> '(' pat_expr ')' : '$2'. + +map_pat_expr -> '#' map_tuple : +	{map, ?anno('$1'),'$2'}. +map_pat_expr -> pat_expr_max '#' map_tuple : +	{map, ?anno('$2'),'$1','$3'}. +map_pat_expr -> map_pat_expr '#' map_tuple : +	{map, ?anno('$2'),'$1','$3'}. + +record_pat_expr -> '#' atom '.' atom : +	{record_index,?anno('$1'),element(3, '$2'),'$4'}. +record_pat_expr -> '#' atom record_tuple : +	{record,?anno('$1'),element(3, '$2'),'$3'}.  list -> '[' ']' : {nil,?anno('$1')}.  list -> '[' expr tail : {cons,?anno('$1'),'$2','$3'}. @@ -397,6 +448,10 @@ case_expr -> 'case' expr 'of' cr_clauses 'end' :  cr_clauses -> cr_clause : ['$1'].  cr_clauses -> cr_clause ';' cr_clauses : ['$1' | '$3']. +%% FIXME: merl in syntax_tools depends on patterns in a 'case' being +%% full expressions. Therefore, we can't use pat_expr here. There +%% should be a better way. +  cr_clause -> expr clause_guard clause_body :  	{clause,?anno('$1'),['$1'],'$2','$3'}. @@ -424,11 +479,11 @@ integer_or_var -> var : '$1'.  fun_clauses -> fun_clause : ['$1'].  fun_clauses -> fun_clause ';' fun_clauses : ['$1' | '$3']. -fun_clause -> argument_list clause_guard clause_body : +fun_clause -> pat_argument_list clause_guard clause_body :  	{Args,Anno} = '$1',  	{clause,Anno,'fun',Args,'$2','$3'}. -fun_clause -> var argument_list clause_guard clause_body : +fun_clause -> var pat_argument_list clause_guard clause_body :  	{clause,element(2, '$1'),element(3, '$1'),element(1, '$2'),'$3','$4'}.  try_expr -> 'try' exprs 'of' cr_clauses try_catch : @@ -446,24 +501,31 @@ try_catch -> 'after' exprs 'end' :  try_clauses -> try_clause : ['$1'].  try_clauses -> try_clause ';' try_clauses : ['$1' | '$3']. -try_clause -> expr clause_guard clause_body : +try_clause -> pat_expr clause_guard clause_body :  	A = ?anno('$1'),  	{clause,A,[{tuple,A,[{atom,A,throw},'$1',{var,A,'_'}]}],'$2','$3'}. -try_clause -> atom ':' expr clause_guard clause_body : +try_clause -> atom ':' pat_expr try_opt_stacktrace clause_guard clause_body :  	A = ?anno('$1'), -	{clause,A,[{tuple,A,['$1','$3',{var,A,'_'}]}],'$4','$5'}. -try_clause -> var ':' expr clause_guard clause_body : +	{clause,A,[{tuple,A,['$1','$3',{var,A,'$4'}]}],'$5','$6'}. +try_clause -> var ':' pat_expr try_opt_stacktrace clause_guard clause_body :  	A = ?anno('$1'), -	{clause,A,[{tuple,A,['$1','$3',{var,A,'_'}]}],'$4','$5'}. +	{clause,A,[{tuple,A,['$1','$3',{var,A,'$4'}]}],'$5','$6'}. +try_opt_stacktrace -> ':' var : element(3, '$2'). +try_opt_stacktrace -> '$empty' : '_'.  argument_list -> '(' ')' : {[],?anno('$1')}.  argument_list -> '(' exprs ')' : {'$2',?anno('$1')}. +pat_argument_list -> '(' ')' : {[],?anno('$1')}. +pat_argument_list -> '(' pat_exprs ')' : {'$2',?anno('$1')}.  exprs -> expr : ['$1'].  exprs -> expr ',' exprs : ['$1' | '$3']. +pat_exprs -> pat_expr : ['$1']. +pat_exprs -> pat_expr ',' pat_exprs : ['$1' | '$3']. +  guard -> exprs : ['$1'].  guard -> exprs ';' guard : ['$1'|'$3']. @@ -918,7 +980,7 @@ Erlang code.  -type af_unary_op(T) :: {'op', anno(), unary_op(), T}. --type unary_op() :: '+' | '*' | 'bnot' | 'not'. +-type unary_op() :: '+' | '-' | 'bnot' | 'not'.  %% See also lib/stdlib/{src/erl_bits.erl,include/erl_bits.hrl}.  -type type_specifier_list() :: 'default' | [type_specifier(), ...]. @@ -1315,6 +1377,8 @@ normalise({map,_,Pairs}=M) ->  		({map_field_assoc,_,K,V}) -> {normalise(K),normalise(V)};  		(_) -> erlang:error({badarg,M})  	    end, Pairs)); +normalise({'fun',_,{function,{atom,_,M},{atom,_,F},{integer,_,A}}}) -> +    fun M:F/A;  %% Special case for unary +/-.  normalise({op,_,'+',{char,_,I}}) -> I;  normalise({op,_,'+',{integer,_,I}}) -> I;  | 
