typer_parse.erl
来自「OTP是开放电信平台的简称」· ERL 代码 · 共 777 行 · 第 1/3 页
ERL
777 行
-module(typer_parse).-export([parse/1, parse_and_scan/1, format_error/1]).-file("typer_parse.yrl", 43).build_type({atom,_,any}, []) -> {type, any, []};build_type({atom,_,atom}, []) -> {type, atom, []};build_type({atom,_,binary}, []) -> {type, binary, []};build_type({atom,_,bool}, []) -> {type, bool, []};build_type({atom,_,byte}, []) -> {type, byte, []};build_type({atom,_,char}, []) -> {type, char, []};build_type({atom,_,float}, []) -> {type, float, []};build_type({atom,_,function}, []) -> {type, 'fun', []};build_type({atom,_,identifier}, []) -> {type, identifier, []};build_type({atom,_,integer}, []) -> {type, integer, []};build_type({atom,_,list}, []) -> {type, list, []};build_type({atom,_,mfa}, []) -> {type, mfa, []};build_type({atom,_,neg_integer}, []) -> {type, neg_integer, []};build_type({atom,_,non_neg_integer}, []) -> {type, non_neg_integer, []};build_type({atom,_,none}, []) -> {type, none, []};build_type({atom,_,nonempty_list}, [C,T]) -> {type, cons, [C,T]};build_type({atom,_,nonempty_possibly_improper_list}, []) -> {type, cons, []};build_type({atom,_,nonempty_posssibly_improper_list}, [C,T]) -> {type, cons, [C, T]};build_type({atom,_,number}, []) -> {type, number, []};build_type({atom,_,pid}, []) -> {type, pid, []};build_type({atom,_,port}, []) -> {type, port, []};build_type({atom,_,pos_integer}, []) -> {type, pos_integer, []};build_type({atom,_,possibly_improper_list}, [C,T]) -> {type, pos_improper_list, [C,T]};build_type({atom,_,possibly_improper_list}, []) -> {type, pos_improper_list, []};build_type({atom,_,ref}, []) -> {type, ref, []};build_type({atom,_,string}, []) -> {type, string, []};build_type({atom,_,tuple}, []) -> {type, tuple, []};build_type({atom,La,_}, _) -> error_bad_decl(La,type).lift_unions(T1, {type, union, List}) -> {type, union, [T1|List]};lift_unions(T1, T2 = {type, _, _}) -> {type, union, [T1, T2]}.get_atom({atom, _, Atom}) -> Atom.get_int({integer, _, Integer}) -> Integer.error_bad_decl(L, S) -> return_error(L, io_lib:format("bad ~w declaration", [S])).-file("/ldisk/daily_build/otp_prebuild_r11b.2007-06-11_19/otp_src_R11B-5/bootstrap/lib/parsetools/include/yeccpre.hrl", 0).%% ``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 $%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% The parser generator will insert appropriate declarations before this line.%parse(Tokens) -> yeccpars0(Tokens, false).parse_and_scan({F, A}) -> % Fun or {M, F} yeccpars0([], {F, A});parse_and_scan({M, F, A}) -> yeccpars0([], {{M, F}, A}).format_error(Message) -> case io_lib:deep_char_list(Message) of true -> Message; _ -> io_lib:write(Message) end.% To be used in grammar files to throw an error message to the parser% toplevel. Doesn't have to be exported!-compile({nowarn_unused_function,{return_error,2}}).return_error(Line, Message) -> throw({error, {Line, ?MODULE, Message}}).yeccpars0(Tokens, MFA) -> try yeccpars1(Tokens, MFA, 0, [], []) catch throw: {error, {_Line, ?MODULE, _M}} = Error -> Error % probably from return_error/1 end.% Don't change yeccpars1/6 too much, it is called recursively by yeccpars2/8!yeccpars1([Token | Tokens], Tokenizer, State, States, Vstack) -> yeccpars2(State, element(1, Token), States, Vstack, Token, Tokens, Tokenizer);yeccpars1([], {F, A}, State, States, Vstack) -> case apply(F, A) of {ok, Tokens, _Endline} -> yeccpars1(Tokens, {F, A}, State, States, Vstack); {eof, _Endline} -> yeccpars1([], false, State, States, Vstack); {error, Descriptor, _Endline} -> {error, Descriptor} end;yeccpars1([], false, State, States, Vstack) -> yeccpars2(State, '$end', States, Vstack, {'$end', 999999}, [], false).% For internal use only.yeccerror(Token) -> {error, {element(2, Token), ?MODULE, ["syntax error before: ", yecctoken2string(Token)]}}.yecctoken2string({atom, _, A}) -> io_lib:write(A);yecctoken2string({integer,_,N}) -> io_lib:write(N);yecctoken2string({float,_,F}) -> io_lib:write(F);yecctoken2string({char,_,C}) -> io_lib:write_char(C);yecctoken2string({var,_,V}) -> io_lib:format('~s', [V]);yecctoken2string({string,_,S}) -> io_lib:write_string(S);yecctoken2string({reserved_symbol, _, A}) -> io_lib:format('~w', [A]);yecctoken2string({_Cat, _, Val}) -> io_lib:format('~w', [Val]);yecctoken2string({'dot', _}) -> io_lib:format('~w', ['.']);yecctoken2string({'$end', _}) -> [];yecctoken2string({Other, _}) when is_atom(Other) -> io_lib:format('~w', [Other]);yecctoken2string(Other) -> io_lib:write(Other).%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%-file("./typer_parse.erl", 143).yeccpars2(0, '#', __Ss, __Stack, __T, __Ts, __Tzr) -> yeccpars1(__Ts, __Tzr, 3, [0 | __Ss], [__T | __Stack]);yeccpars2(0, '(', __Ss, __Stack, __T, __Ts, __Tzr) -> yeccpars1(__Ts, __Tzr, 4, [0 | __Ss], [__T | __Stack]);yeccpars2(0, '<', __Ss, __Stack, __T, __Ts, __Tzr) -> yeccpars1(__Ts, __Tzr, 5, [0 | __Ss], [__T | __Stack]);yeccpars2(0, '[', __Ss, __Stack, __T, __Ts, __Tzr) -> yeccpars1(__Ts, __Tzr, 6, [0 | __Ss], [__T | __Stack]);yeccpars2(0, atom, __Ss, __Stack, __T, __Ts, __Tzr) -> yeccpars1(__Ts, __Tzr, 7, [0 | __Ss], [__T | __Stack]);yeccpars2(0, integer, __Ss, __Stack, __T, __Ts, __Tzr) -> yeccpars1(__Ts, __Tzr, 8, [0 | __Ss], [__T | __Stack]);yeccpars2(0, '{', __Ss, __Stack, __T, __Ts, __Tzr) -> yeccpars1(__Ts, __Tzr, 9, [0 | __Ss], [__T | __Stack]);yeccpars2(0, _, _, _, __T, _, _) -> yeccerror(__T);yeccpars2(1, '|', __Ss, __Stack, __T, __Ts, __Tzr) -> yeccpars1(__Ts, __Tzr, 59, [1 | __Ss], [__T | __Stack]);yeccpars2(1, __Cat, __Ss, __Stack, __T, __Ts, __Tzr) -> yeccpars2(yeccgoto(top_type, hd(__Ss)), __Cat, __Ss, __Stack, __T, __Ts, __Tzr);yeccpars2(2, dot, _, __Stack, _, _, _) -> {ok, hd(__Stack)};yeccpars2(2, _, _, _, __T, _, _) -> yeccerror(__T);yeccpars2(3, atom, __Ss, __Stack, __T, __Ts, __Tzr) -> yeccpars1(__Ts, __Tzr, 48, [3 | __Ss], [__T | __Stack]);yeccpars2(3, _, _, _, __T, _, _) -> yeccerror(__T);yeccpars2(4, '(', __Ss, __Stack, __T, __Ts, __Tzr) -> yeccpars1(__Ts, __Tzr, 33, [4 | __Ss], [__T | __Stack]);yeccpars2(4, integer, __Ss, __Stack, __T, __Ts, __Tzr) -> yeccpars1(__Ts, __Tzr, 34, [4 | __Ss], [__T | __Stack]);yeccpars2(4, _, _, _, __T, _, _) -> yeccerror(__T);yeccpars2(5, '#', __Ss, __Stack, __T, __Ts, __Tzr) -> yeccpars1(__Ts, __Tzr, 3, [5 | __Ss], [__T | __Stack]);yeccpars2(5, '(', __Ss, __Stack, __T, __Ts, __Tzr) -> yeccpars1(__Ts, __Tzr, 4, [5 | __Ss], [__T | __Stack]);yeccpars2(5, '<', __Ss, __Stack, __T, __Ts, __Tzr) -> yeccpars1(__Ts, __Tzr, 5, [5 | __Ss], [__T | __Stack]);yeccpars2(5, '[', __Ss, __Stack, __T, __Ts, __Tzr) -> yeccpars1(__Ts, __Tzr, 6, [5 | __Ss], [__T | __Stack]);yeccpars2(5, atom, __Ss, __Stack, __T, __Ts, __Tzr) -> yeccpars1(__Ts, __Tzr, 7, [5 | __Ss], [__T | __Stack]);yeccpars2(5, integer, __Ss, __Stack, __T, __Ts, __Tzr) -> yeccpars1(__Ts, __Tzr, 8, [5 | __Ss], [__T | __Stack]);yeccpars2(5, '{', __Ss, __Stack, __T, __Ts, __Tzr) -> yeccpars1(__Ts, __Tzr, 9, [5 | __Ss], [__T | __Stack]);yeccpars2(5, _, _, _, __T, _, _) -> yeccerror(__T);yeccpars2(6, '#', __Ss, __Stack, __T, __Ts, __Tzr) -> yeccpars1(__Ts, __Tzr, 3, [6 | __Ss], [__T | __Stack]);yeccpars2(6, '(', __Ss, __Stack, __T, __Ts, __Tzr) -> yeccpars1(__Ts, __Tzr, 4, [6 | __Ss], [__T | __Stack]);yeccpars2(6, '<', __Ss, __Stack, __T, __Ts, __Tzr) -> yeccpars1(__Ts, __Tzr, 5, [6 | __Ss], [__T | __Stack]);yeccpars2(6, '[', __Ss, __Stack, __T, __Ts, __Tzr) -> yeccpars1(__Ts, __Tzr, 6, [6 | __Ss], [__T | __Stack]);yeccpars2(6, ']', __Ss, __Stack, __T, __Ts, __Tzr) -> yeccpars1(__Ts, __Tzr, 24, [6 | __Ss], [__T | __Stack]);yeccpars2(6, atom, __Ss, __Stack, __T, __Ts, __Tzr) -> yeccpars1(__Ts, __Tzr, 7, [6 | __Ss], [__T | __Stack]);yeccpars2(6, integer, __Ss, __Stack, __T, __Ts, __Tzr) -> yeccpars1(__Ts, __Tzr, 8, [6 | __Ss], [__T | __Stack]);yeccpars2(6, '{', __Ss, __Stack, __T, __Ts, __Tzr) -> yeccpars1(__Ts, __Tzr, 9, [6 | __Ss], [__T | __Stack]);yeccpars2(6, _, _, _, __T, _, _) -> yeccerror(__T);yeccpars2(7, '(', __Ss, __Stack, __T, __Ts, __Tzr) -> yeccpars1(__Ts, __Tzr, 16, [7 | __Ss], [__T | __Stack]);yeccpars2(7, __Cat, __Ss, __Stack, __T, __Ts, __Tzr) -> __NewStack = yeccpars2_7_(__Stack), yeccpars2(yeccgoto(type, hd(__Ss)), __Cat, __Ss, __NewStack, __T, __Ts, __Tzr);yeccpars2(8, __Cat, __Ss, __Stack, __T, __Ts, __Tzr) -> __NewStack = yeccpars2_8_(__Stack), yeccpars2(yeccgoto(type, hd(__Ss)), __Cat, __Ss, __NewStack, __T, __Ts, __Tzr);yeccpars2(9, '#', __Ss, __Stack, __T, __Ts, __Tzr) -> yeccpars1(__Ts, __Tzr, 3, [9 | __Ss], [__T | __Stack]);yeccpars2(9, '(', __Ss, __Stack, __T, __Ts, __Tzr) -> yeccpars1(__Ts, __Tzr, 4, [9 | __Ss], [__T | __Stack]);yeccpars2(9, '<', __Ss, __Stack, __T, __Ts, __Tzr) -> yeccpars1(__Ts, __Tzr, 5, [9 | __Ss], [__T | __Stack]);yeccpars2(9, '[', __Ss, __Stack, __T, __Ts, __Tzr) -> yeccpars1(__Ts, __Tzr, 6, [9 | __Ss], [__T | __Stack]);yeccpars2(9, atom, __Ss, __Stack, __T, __Ts, __Tzr) -> yeccpars1(__Ts, __Tzr, 7, [9 | __Ss], [__T | __Stack]);yeccpars2(9, integer, __Ss, __Stack, __T, __Ts, __Tzr) -> yeccpars1(__Ts, __Tzr, 8, [9 | __Ss], [__T | __Stack]);yeccpars2(9, '{', __Ss, __Stack, __T, __Ts, __Tzr) -> yeccpars1(__Ts, __Tzr, 9, [9 | __Ss], [__T | __Stack]);yeccpars2(9, '}', __Ss, __Stack, __T, __Ts, __Tzr) -> yeccpars1(__Ts, __Tzr, 12, [9 | __Ss], [__T | __Stack]);yeccpars2(9, _, _, _, __T, _, _) -> yeccerror(__T);yeccpars2(10, '}', __Ss, __Stack, __T, __Ts, __Tzr) -> yeccpars1(__Ts, __Tzr, 15, [10 | __Ss], [__T | __Stack]);yeccpars2(10, _, _, _, __T, _, _) -> yeccerror(__T);yeccpars2(11, ',', __Ss, __Stack, __T, __Ts, __Tzr) -> yeccpars1(__Ts, __Tzr, 13, [11 | __Ss], [__T | __Stack]);yeccpars2(11, __Cat, __Ss, __Stack, __T, __Ts, __Tzr) -> __NewStack = yeccpars2_11_(__Stack), yeccpars2(yeccgoto(top_types, hd(__Ss)), __Cat, __Ss, __NewStack, __T, __Ts, __Tzr);yeccpars2(12, __Cat, __Ss, __Stack, __T, __Ts, __Tzr) -> __NewStack = yeccpars2_12_(__Stack), __Nss = lists:nthtail(1, __Ss), yeccpars2(yeccgoto(type, hd(__Nss)), __Cat, __Nss, __NewStack, __T, __Ts, __Tzr);yeccpars2(13, '#', __Ss, __Stack, __T, __Ts, __Tzr) -> yeccpars1(__Ts, __Tzr, 3, [13 | __Ss], [__T | __Stack]);yeccpars2(13, '(', __Ss, __Stack, __T, __Ts, __Tzr) -> yeccpars1(__Ts, __Tzr, 4, [13 | __Ss], [__T | __Stack]);yeccpars2(13, '<', __Ss, __Stack, __T, __Ts, __Tzr) -> yeccpars1(__Ts, __Tzr, 5, [13 | __Ss], [__T | __Stack]);yeccpars2(13, '[', __Ss, __Stack, __T, __Ts, __Tzr) -> yeccpars1(__Ts, __Tzr, 6, [13 | __Ss], [__T | __Stack]);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?