80 lines
2.2 KiB
Erlang
80 lines
2.2 KiB
Erlang
%% Vendored from hex_core v0.7.1, do not edit manually
|
|
|
|
%%% Author : Robert Virding
|
|
%%% Purpose : Token definitions for Erlang.
|
|
|
|
Definitions.
|
|
|
|
D = [0-9]
|
|
U = [A-Z]
|
|
L = [a-z]
|
|
A = ({U}|{L}|{D}|_|@)
|
|
WS = ([\000-\s])
|
|
|
|
Rules.
|
|
|
|
{L}{A}* : tokenize_atom(TokenChars, TokenLine).
|
|
'(\\\^.|\\.|[^'])*' : tokenize_atom(escape(unquote(TokenChars, TokenLen)), TokenLine).
|
|
"(\\\^.|\\.|[^"])*" : {token, {string, TokenLine, escape(unquote(TokenChars, TokenLen))}}.
|
|
{D}+ : {token, {integer, TokenLine, list_to_integer(TokenChars)}}.
|
|
[\#\[\]}{,+-] : {token, {list_to_atom(TokenChars), TokenLine}}.
|
|
(<<|>>|=>) : {token, {list_to_atom(TokenChars), TokenLine}}.
|
|
\. : {token, {dot, TokenLine}}.
|
|
/ : {token, {'/', TokenLine}}.
|
|
{WS}+ : skip_token.
|
|
|
|
Erlang code.
|
|
|
|
-export([terms/1]).
|
|
|
|
terms(Tokens) ->
|
|
terms(Tokens, []).
|
|
|
|
terms([{dot, _} = H], Buffer) ->
|
|
[buffer_to_term([H|Buffer])];
|
|
terms([{dot, _} = H|T], Buffer) ->
|
|
[buffer_to_term([H|Buffer])|terms(T, [])];
|
|
terms([H|T], Buffer) ->
|
|
terms(T, [H|Buffer]).
|
|
|
|
buffer_to_term(Buffer) ->
|
|
{ok, Term} = erl_parse:parse_term(lists:reverse(Buffer)),
|
|
Term.
|
|
|
|
unquote(TokenChars, TokenLen) ->
|
|
lists:sublist(TokenChars, 2, TokenLen - 2).
|
|
|
|
tokenize_atom(TokenChars, TokenLine) ->
|
|
try list_to_existing_atom(TokenChars) of
|
|
Atom -> {token, {atom, TokenLine, Atom}}
|
|
catch
|
|
error:badarg -> {error, "illegal atom " ++ TokenChars}
|
|
end.
|
|
|
|
escape([$\\|Cs]) ->
|
|
do_escape(Cs);
|
|
escape([C|Cs]) ->
|
|
[C|escape(Cs)];
|
|
escape([]) -> [].
|
|
|
|
do_escape([O1,O2,O3|S]) when
|
|
O1 >= $0, O1 =< $7, O2 >= $0, O2 =< $7, O3 >= $0, O3 =< $7 ->
|
|
[(O1*8 + O2)*8 + O3 - 73*$0|escape(S)];
|
|
do_escape([$^,C|Cs]) ->
|
|
[C band 31|escape(Cs)];
|
|
do_escape([C|Cs]) when C >= $\000, C =< $\s ->
|
|
escape(Cs);
|
|
do_escape([C|Cs]) ->
|
|
[escape_char(C)|escape(Cs)].
|
|
|
|
escape_char($n) -> $\n; %\n = LF
|
|
escape_char($r) -> $\r; %\r = CR
|
|
escape_char($t) -> $\t; %\t = TAB
|
|
escape_char($v) -> $\v; %\v = VT
|
|
escape_char($b) -> $\b; %\b = BS
|
|
escape_char($f) -> $\f; %\f = FF
|
|
escape_char($e) -> $\e; %\e = ESC
|
|
escape_char($s) -> $\s; %\s = SPC
|
|
escape_char($d) -> $\d; %\d = DEL
|
|
escape_char(C) -> C.
|