You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

79 lines
2.2 KiB

  1. %% Vendored from hex_core v0.6.8, do not edit manually
  2. %%% Author : Robert Virding
  3. %%% Purpose : Token definitions for Erlang.
  4. Definitions.
  5. D = [0-9]
  6. U = [A-Z]
  7. L = [a-z]
  8. A = ({U}|{L}|{D}|_|@)
  9. WS = ([\000-\s])
  10. Rules.
  11. {L}{A}* : tokenize_atom(TokenChars, TokenLine).
  12. '(\\\^.|\\.|[^'])*' : tokenize_atom(escape(unquote(TokenChars, TokenLen)), TokenLine).
  13. "(\\\^.|\\.|[^"])*" : {token, {string, TokenLine, escape(unquote(TokenChars, TokenLen))}}.
  14. {D}+ : {token, {integer, TokenLine, list_to_integer(TokenChars)}}.
  15. [\#\[\]}{,+-] : {token, {list_to_atom(TokenChars), TokenLine}}.
  16. (<<|>>|=>) : {token, {list_to_atom(TokenChars), TokenLine}}.
  17. \. : {token, {dot, TokenLine}}.
  18. / : {token, {'/', TokenLine}}.
  19. {WS}+ : skip_token.
  20. Erlang code.
  21. -export([terms/1]).
  22. terms(Tokens) ->
  23. terms(Tokens, []).
  24. terms([{dot, _} = H], Buffer) ->
  25. [buffer_to_term([H|Buffer])];
  26. terms([{dot, _} = H|T], Buffer) ->
  27. [buffer_to_term([H|Buffer])|terms(T, [])];
  28. terms([H|T], Buffer) ->
  29. terms(T, [H|Buffer]).
  30. buffer_to_term(Buffer) ->
  31. {ok, Term} = erl_parse:parse_term(lists:reverse(Buffer)),
  32. Term.
  33. unquote(TokenChars, TokenLen) ->
  34. lists:sublist(TokenChars, 2, TokenLen - 2).
  35. tokenize_atom(TokenChars, TokenLine) ->
  36. try list_to_existing_atom(TokenChars) of
  37. Atom -> {token, {atom, TokenLine, Atom}}
  38. catch
  39. error:badarg -> {error, "illegal atom " ++ TokenChars}
  40. end.
  41. escape([$\\|Cs]) ->
  42. do_escape(Cs);
  43. escape([C|Cs]) ->
  44. [C|escape(Cs)];
  45. escape([]) -> [].
  46. do_escape([O1,O2,O3|S]) when
  47. O1 >= $0, O1 =< $7, O2 >= $0, O2 =< $7, O3 >= $0, O3 =< $7 ->
  48. [(O1*8 + O2)*8 + O3 - 73*$0|escape(S)];
  49. do_escape([$^,C|Cs]) ->
  50. [C band 31|escape(Cs)];
  51. do_escape([C|Cs]) when C >= $\000, C =< $\s ->
  52. escape(Cs);
  53. do_escape([C|Cs]) ->
  54. [escape_char(C)|escape(Cs)].
  55. escape_char($n) -> $\n; %\n = LF
  56. escape_char($r) -> $\r; %\r = CR
  57. escape_char($t) -> $\t; %\t = TAB
  58. escape_char($v) -> $\v; %\v = VT
  59. escape_char($b) -> $\b; %\b = BS
  60. escape_char($f) -> $\f; %\f = FF
  61. escape_char($e) -> $\e; %\e = ESC
  62. escape_char($s) -> $\s; %\s = SPC
  63. escape_char($d) -> $\d; %\d = DEL
  64. escape_char(C) -> C.