erl_parse.yrl
来自「OTP是开放电信平台的简称」· YRL 代码 · 共 912 行 · 第 1/2 页
YRL
912 行
%% ``The contents of this file are subject to the Erlang Public License,%% Version 1.1, (the "License"); you may not use this file except in%% compliance with the License. You should have received a copy of the%% Erlang Public License along with this software. If not, it can be%% retrieved via the world wide web at http://www.erlang.org/.%% %% Software distributed under the License is distributed on an "AS IS"%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See%% the License for the specific language governing rights and limitations%% under the License.%% %% The Initial Developer of the Original Code is Ericsson Utvecklings AB.%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings%% AB. All Rights Reserved.''%% %% $Id$%%%% Definition of the Erlang grammar.Nonterminalsformattribute attr_valfunction function_clauses function_clauseclause_args clause_guard clause_bodyexpr expr_100 expr_150 expr_160 expr_200 expr_300 expr_400 expr_500expr_600 expr_700 expr_800 expr_900expr_maxlist taillist_comprehension lc_expr lc_exprsbinary_comprehension tuple%structrecord_expr record_tuple record_field record_fieldsif_expr if_clause if_clauses case_expr cr_clause cr_clauses receive_exprfun_expr fun_clause fun_clauses%% cond_expr cond_clause cond_clausestry_expr try_catch try_clause try_clauses query_exprfunction_call argument_listexprs guardatomic stringsprefix_op mult_op add_op list_op comp_oprule rule_clauses rule_clause rule_bodybinary bin_elements bin_element bit_expropt_bit_size_expr bit_size_expr opt_bit_type_list bit_type_list bit_typetop_type top_types type typed_expr typed_attr_val arg_types arg_typetyped_exprs typed_record_fields.Terminalschar integer float atom string var'(' ')' ',' '->' ':-' '{' '}' '[' ']' '|' '||' '<-' ';' ':' '#' '.''after' 'begin' 'case' 'try' 'catch' 'end' 'fun' 'if' 'of' 'receive' 'when''andalso' 'orelse' 'query'%% 'cond''bnot' 'not''*' '/' 'div' 'rem' 'band' 'and''+' '-' 'bor' 'bxor' 'bsl' 'bsr' 'or' 'xor''++' '--''==' '/=' '=<' '<' '>=' '>' '=:=' '=/=' '<=''<<' '>>''!' '=' '::'dot.Expect 2.Rootsymbol form.form -> attribute dot : '$1'.form -> function dot : '$1'.form -> rule dot : '$1'.attribute -> '-' atom '(' attr_val ')' : build_attribute('$2', '$4').attribute -> '-' atom '(' typed_attr_val ')' : build_typed_attribute('$2','$4').typed_attr_val -> expr ',' typed_record_fields : ['$1' , '$3'].typed_attr_val -> expr '::' top_types : ['$1' , '$3'].typed_record_fields -> '{' typed_exprs '}' : {tuple,line('$1'),'$2'}.typed_exprs -> typed_expr : ['$1'].typed_exprs -> typed_expr ',' typed_exprs : ['$1'|'$3'].typed_exprs -> expr ',' typed_exprs : ['$1'|'$3'].typed_exprs -> typed_expr ',' exprs : ['$1'|'$3'].typed_expr -> expr '::' top_type : {typed,'$1','$3'}.top_types -> top_type : ['$1'].top_types -> top_type ',' top_types : ['$1'|'$3'].top_type -> type : '$1'.top_type -> type '|' top_type : lift_unions('$1','$3').type -> atom : {type, atom, [normalise('$1')]}.type -> atom '(' ')' : build_type('$1', []).type -> atom '(' top_type ')' : build_type('$1', ['$3']).type -> atom '(' top_type ',' top_type ')': build_type('$1', ['$3', '$5']).type -> '[' ']' : {type, nil, []}.type -> '[' top_type ']' : {type, list, ['$2']}.type -> '[' top_type ',' '.' '.' '.' ']' : {type, nonempty_list, ['$2']}.type -> '(' '(' ')' '->' top_type ')' : {type, 'fun', [[], '$5']}.type -> '(' '(' arg_types ')' '->' top_type ')' : {type, 'fun', ['$3', '$6']}.type -> '{' '}' : {type, tuple, []}.type -> '{' top_types '}' : {type, tuple, '$2'}.type -> '#' atom '{' '}' : {type, record, [normalise('$2')]}.type -> integer : {type, integer, [normalise('$1')]}.type -> '(' integer '.' '.' integer ')' : {type, range, [normalise('$2'), normalise('$5')]}.arg_types -> arg_type : ['$1'].arg_types -> arg_type ',' arg_types : ['$1'|'$3'].arg_type -> var '::' top_type : '$3'.arg_type -> top_type : '$1'.attr_val -> exprs : '$1'.function -> function_clauses : build_function('$1').function_clauses -> function_clause : ['$1'].function_clauses -> function_clause ';' function_clauses : ['$1'|'$3'].function_clause -> atom clause_args clause_guard clause_body : {clause,line('$1'),element(3, '$1'),'$2','$3','$4'}.clause_args -> argument_list : element(1, '$1').clause_guard -> 'when' guard : '$2'.clause_guard -> '$empty' : [].clause_body -> '->' exprs: '$2'.expr -> 'catch' expr : {'catch',line('$1'),'$2'}.expr -> expr_100 : '$1'.expr_100 -> expr_150 '=' expr_100 : {match,line('$2'),'$1','$3'}.expr_100 -> expr_150 '!' expr_100 : mkop('$1', '$2', '$3').expr_100 -> expr_150 : '$1'.expr_150 -> expr_160 'orelse' expr_150 : mkop('$1', '$2', '$3').expr_150 -> expr_160 : '$1'.expr_160 -> expr_200 'andalso' expr_160 : mkop('$1', '$2', '$3').expr_160 -> expr_200 : '$1'.expr_200 -> expr_300 comp_op expr_300 : mkop('$1', '$2', '$3').expr_200 -> expr_300 : '$1'.expr_300 -> expr_400 list_op expr_300 : mkop('$1', '$2', '$3').expr_300 -> expr_400 : '$1'.expr_400 -> expr_400 add_op expr_500 : mkop('$1', '$2', '$3').expr_400 -> expr_500 : '$1'.expr_500 -> expr_500 mult_op expr_600 : mkop('$1', '$2', '$3').expr_500 -> expr_600 : '$1'.expr_600 -> prefix_op expr_700 : mkop('$1', '$2').expr_600 -> expr_700 : '$1'.expr_700 -> function_call : '$1'.expr_700 -> record_expr : '$1'.expr_700 -> expr_800 : '$1'.expr_800 -> expr_900 ':' expr_max : {remote,line('$2'),'$1','$3'}.expr_800 -> expr_900 : '$1'.expr_900 -> '.' atom : {record_field,line('$1'),{atom,line('$1'),''},'$2'}.expr_900 -> expr_900 '.' atom : {record_field,line('$2'),'$1','$3'}.expr_900 -> expr_max : '$1'.expr_max -> var : '$1'.expr_max -> atomic : '$1'.expr_max -> list : '$1'.expr_max -> binary : '$1'.expr_max -> list_comprehension : '$1'.expr_max -> binary_comprehension : '$1'.expr_max -> tuple : '$1'.%%expr_max -> struct : '$1'.expr_max -> '(' expr ')' : '$2'.expr_max -> 'begin' exprs 'end' : {block,line('$1'),'$2'}.expr_max -> if_expr : '$1'.expr_max -> case_expr : '$1'.expr_max -> receive_expr : '$1'.expr_max -> fun_expr : '$1'.%%expr_max -> cond_expr : '$1'.expr_max -> try_expr : '$1'.expr_max -> query_expr : '$1'.list -> '[' ']' : {nil,line('$1')}.list -> '[' expr tail : {cons,line('$1'),'$2','$3'}.tail -> ']' : {nil,line('$1')}.tail -> '|' expr ']' : '$2'.tail -> ',' expr tail : {cons,line('$2'),'$2','$3'}.binary -> '<<' '>>' : {bin,line('$1'),[]}.binary -> '<<' bin_elements '>>' : {bin,line('$1'),'$2'}.bin_elements -> bin_element : ['$1'].bin_elements -> bin_element ',' bin_elements : ['$1'|'$3'].bin_element -> bit_expr opt_bit_size_expr opt_bit_type_list : {bin_element,line('$1'),'$1','$2','$3'}.bit_expr -> prefix_op expr_max : mkop('$1', '$2').bit_expr -> expr_max : '$1'.opt_bit_size_expr -> ':' bit_size_expr : '$2'.opt_bit_size_expr -> '$empty' : default.opt_bit_type_list -> '/' bit_type_list : '$2'.opt_bit_type_list -> '$empty' : default.bit_type_list -> bit_type '-' bit_type_list : ['$1' | '$3'].bit_type_list -> bit_type : ['$1'].bit_type -> atom : element(3,'$1').bit_type -> atom ':' integer : { element(3,'$1'), element(3,'$3') }.bit_size_expr -> expr_max : '$1'.list_comprehension -> '[' expr '||' lc_exprs ']' : {lc,line('$1'),'$2','$4'}.binary_comprehension -> '<<' binary '||' lc_exprs '>>' : {bc,line('$1'),'$2','$4'}.lc_exprs -> lc_expr : ['$1'].lc_exprs -> lc_expr ',' lc_exprs : ['$1'|'$3'].lc_expr -> expr : '$1'.lc_expr -> expr '<-' expr : {generate,line('$2'),'$1','$3'}.lc_expr -> binary '<=' expr_max : {b_generate,line('$2'),'$1','$3'}.tuple -> '{' '}' : {tuple,line('$1'),[]}.tuple -> '{' exprs '}' : {tuple,line('$1'),'$2'}.%%struct -> atom tuple :%% {struct,line('$1'),element(3, '$1'),element(3, '$2')}.%% N.B. This is called from expr_700.%% N.B. Field names are returned as the complete object, even if they are%% always atoms for the moment, this might change in the future.record_expr -> '#' atom '.' atom : {record_index,line('$1'),element(3, '$2'),'$4'}.record_expr -> '#' atom record_tuple : {record,line('$1'),element(3, '$2'),'$3'}.record_expr -> expr_max '#' atom '.' atom : {record_field,line('$2'),'$1',element(3, '$3'),'$5'}.record_expr -> expr_max '#' atom record_tuple : {record,line('$2'),'$1',element(3, '$3'),'$4'}.record_tuple -> '{' '}' : [].record_tuple -> '{' record_fields '}' : '$2'.record_fields -> record_field : ['$1'].record_fields -> record_field ',' record_fields : ['$1' | '$3'].record_field -> var '=' expr : {record_field,line('$1'),'$1','$3'}.record_field -> atom '=' expr : {record_field,line('$1'),'$1','$3'}.%% N.B. This is called from expr_700.function_call -> expr_800 argument_list : {call,line('$1'),'$1',element(1, '$2')}.if_expr -> 'if' if_clauses 'end' : {'if',line('$1'),'$2'}.if_clauses -> if_clause : ['$1'].if_clauses -> if_clause ';' if_clauses : ['$1' | '$3'].if_clause -> guard clause_body : {clause,line(hd(hd('$1'))),[],'$1','$2'}.case_expr -> 'case' expr 'of' cr_clauses 'end' : {'case',line('$1'),'$2','$4'}.cr_clauses -> cr_clause : ['$1'].cr_clauses -> cr_clause ';' cr_clauses : ['$1' | '$3'].cr_clause -> expr clause_guard clause_body : {clause,line('$1'),['$1'],'$2','$3'}.receive_expr -> 'receive' cr_clauses 'end' : {'receive',line('$1'),'$2'}.receive_expr -> 'receive' 'after' expr clause_body 'end' : {'receive',line('$1'),[],'$3','$4'}.receive_expr -> 'receive' cr_clauses 'after' expr clause_body 'end' : {'receive',line('$1'),'$2','$4','$5'}.fun_expr -> 'fun' atom '/' integer : {'fun',line('$1'),{function,element(3, '$2'),element(3, '$4')}}.fun_expr -> 'fun' atom ':' atom '/' integer : {'fun',line('$1'),{function,element(3, '$2'),element(3, '$4'),element(3,'$6')}}.fun_expr -> 'fun' fun_clauses 'end' : build_fun(line('$1'), '$2').fun_clauses -> fun_clause : ['$1'].fun_clauses -> fun_clause ';' fun_clauses : ['$1' | '$3'].fun_clause -> argument_list clause_guard clause_body : {Args,Pos} = '$1', {clause,Pos,'fun',Args,'$2','$3'}.try_expr -> 'try' exprs 'of' cr_clauses try_catch : build_try(line('$1'),'$2','$4','$5').try_expr -> 'try' exprs try_catch : build_try(line('$1'),'$2',[],'$3').try_catch -> 'catch' try_clauses 'end' : {'$2',[]}.try_catch -> 'catch' try_clauses 'after' exprs 'end' : {'$2','$4'}.try_catch -> 'after' exprs 'end' : {[],'$2'}.try_clauses -> try_clause : ['$1'].try_clauses -> try_clause ';' try_clauses : ['$1' | '$3'].try_clause -> expr clause_guard clause_body : L = line('$1'), {clause,L,[{tuple,L,[{atom,L,throw},'$1',{var,L,'_'}]}],'$2','$3'}.try_clause -> atom ':' expr clause_guard clause_body : L = line('$1'), {clause,L,[{tuple,L,['$1','$3',{var,L,'_'}]}],'$4','$5'}.try_clause -> var ':' expr clause_guard clause_body : L = line('$1'), {clause,L,[{tuple,L,['$1','$3',{var,L,'_'}]}],'$4','$5'}.%%cond_expr -> 'cond' cond_clauses 'end' : {'cond',line('$1'),'$2'}.%%cond_clauses -> cond_clause : ['$1'].%%cond_clauses -> cond_clause ';' cond_clauses : ['$1' | '$3'].%%cond_clause -> expr clause_body :%% {clause,line('$1'),[],[['$1']],'$2'}.query_expr -> 'query' list_comprehension 'end' : {'query',line('$1'),'$2'}.argument_list -> '(' ')' : {[],line('$1')}.argument_list -> '(' exprs ')' : {'$2',line('$1')}.exprs -> expr : ['$1'].exprs -> expr ',' exprs : ['$1' | '$3'].guard -> exprs : ['$1'].guard -> exprs ';' guard : ['$1'|'$3'].atomic -> char : '$1'.atomic -> integer : '$1'.atomic -> float : '$1'.atomic -> atom : '$1'.atomic -> strings : '$1'.strings -> string : '$1'.strings -> string strings : {string,line('$1'),element(3, '$1') ++ element(3, '$2')}.prefix_op -> '+' : '$1'.prefix_op -> '-' : '$1'.prefix_op -> 'bnot' : '$1'.prefix_op -> 'not' : '$1'.mult_op -> '/' : '$1'.mult_op -> '*' : '$1'.mult_op -> 'div' : '$1'.mult_op -> 'rem' : '$1'.mult_op -> 'band' : '$1'.mult_op -> 'and' : '$1'.add_op -> '+' : '$1'.add_op -> '-' : '$1'.add_op -> 'bor' : '$1'.add_op -> 'bxor' : '$1'.add_op -> 'bsl' : '$1'.add_op -> 'bsr' : '$1'.add_op -> 'or' : '$1'.add_op -> 'xor' : '$1'.list_op -> '++' : '$1'.list_op -> '--' : '$1'.comp_op -> '==' : '$1'.comp_op -> '/=' : '$1'.comp_op -> '=<' : '$1'.comp_op -> '<' : '$1'.comp_op -> '>=' : '$1'.comp_op -> '>' : '$1'.comp_op -> '=:=' : '$1'.comp_op -> '=/=' : '$1'.rule -> rule_clauses : build_rule('$1').rule_clauses -> rule_clause : ['$1'].rule_clauses -> rule_clause ';' rule_clauses : ['$1'|'$3'].rule_clause -> atom clause_args clause_guard rule_body : {clause,line('$1'),element(3, '$1'),'$2','$3','$4'}.rule_body -> ':-' lc_exprs: '$2'.Erlang code.%% ``The contents of this file are subject to the Erlang Public License,%% Version 1.1, (the "License"); you may not use this file except in%% compliance with the License. You should have received a copy of the%% Erlang Public License along with this software. If not, it can be%% retrieved via the world wide web at http://www.erlang.org/.%% %% Software distributed under the License is distributed on an "AS IS"%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See%% the License for the specific language governing rights and limitations%% under the License.%% %% The Initial Developer of the Original Code is Ericsson Utvecklings AB.%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings%% AB. All Rights Reserved.''%% %% $Id$%%-export([parse_form/1,parse_exprs/1,parse_term/1]).-export([normalise/1,abstract/1,tokens/1,tokens/2]).-export([abstract/2, package_segments/1]).-export([inop_prec/1,preop_prec/1,func_prec/0,max_prec/0]).%% The following directive is needed for (significantly) faster compilation%% of the generated .erl file by the HiPE compiler. Please do not remove.-compile([inline,{hipe,[{regalloc,linear_scan}]}]).%% mkop(Op, Arg) -> {op,Line,Op,Arg}.%% mkop(Left, Op, Right) -> {op,Line,Op,Left,Right}.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?