diff options
author | lukeg <lukeg> | 2003-02-21 19:01:14 +0000 |
---|---|---|
committer | lukeg <lukeg> | 2003-02-21 19:01:14 +0000 |
commit | e7d48fe500f6ed676ee1b212ebd61408bced1c5b (patch) | |
tree | 11a756c7bb4906f3e186c1cb8331cb7ed27bc69c /mods/src/em_erlang_scan.xrl | |
download | ermacs-fork-e7d48fe500f6ed676ee1b212ebd61408bced1c5b.tar.gz |
*** empty log message ***
Diffstat (limited to 'mods/src/em_erlang_scan.xrl')
-rw-r--r-- | mods/src/em_erlang_scan.xrl | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/mods/src/em_erlang_scan.xrl b/mods/src/em_erlang_scan.xrl new file mode 100644 index 0000000..572cb29 --- /dev/null +++ b/mods/src/em_erlang_scan.xrl @@ -0,0 +1,135 @@ +%% Token Definitions for Erlang. + +Definitions. +O = [0-7] +D = [0-9] +H = [0-9a-fA-F] +A = [a-z_A-Z@0-9] +WS = [\000-\s] + +Rules. +{D}+\.{D}+((E|e)(\+|\-)?{D}+)? : + {token,{float,YYline,list_to_float(YYtext)}}. +{D}+#{H}+ : base(YYline, YYtext). +{D}+ : {token,{integer,YYline,list_to_integer(YYtext)}}. +[a-z]{A}* : Atom = list_to_atom(YYtext), + {token,case reserved_word(Atom) of + true -> {Atom,YYline}; + false -> {atom,YYline,Atom} + end}. +[_A-Z]{A}* : {token,{var,YYline,list_to_atom(YYtext)}}. +"(\\\^.|\\.|[^"])*" : + %% Strip quotes. + S = lists:sublist(YYtext, 2, length(YYtext) - 2), + {token,{string,YYline,string_gen(S)}}. +'(\\\^.|\\.|[^'])*' : + %% Strip quotes. + S = lists:sublist(YYtext, 2, length(YYtext) - 2), + {token,{atom,YYline,list_to_atom(string_gen(S))}}. +\$(\\{O}{O}{O}|\\\^.|\\.|.) : + {token,{integer,YYline,cc_convert(YYtext)}}. +-> : {token,{'->',YYline}}. +:- : {token,{':-',YYline}}. +=/= : {token,{'=/=',YYline}}. +== : {token,{'==',YYline}}. +=:= : {token,{'=:=',YYline}}. +/= : {token,{'/=',YYline}}. +>= : {token,{'>=',YYline}}. +=< : {token,{'=<',YYline}}. +<= : {token,{'<=',YYline}}. +\+\+ : {token,{'++',YYline}}. +-- : {token,{'--',YYline}}. +[!?/;:,.*+#()[\]|<>={}-] : + {token,{list_to_atom(YYtext),YYline}}. +\.{WS} : {end_token,{dot,YYline}}. +\.%.* : {end_token,{dot,YYline}}. %Must special case this +{WS}+ : . %No token returned, eqivalent +\%.* : skip_token. % to 'skip_token' + +Erlang code. + +-author('rv@cslab.ericsson.se'). +-copyright('Copyright (c) 1996 Ericsson Telecommunications AB'). + +-export([reserved_word/1]). + +reserved_word('after') -> true; +reserved_word('begin') -> true; +reserved_word('case') -> true; +reserved_word('catch') -> true; +reserved_word('end') -> true; +reserved_word('fun') -> true; +reserved_word('if') -> true; +reserved_word('let') -> true; +reserved_word('of') -> true; +reserved_word('query') -> true; +reserved_word('receive') -> true; +reserved_word('when') -> true; +reserved_word('bnot') -> true; +reserved_word('not') -> true; +reserved_word('div') -> true; +reserved_word('rem') -> true; +reserved_word('band') -> true; +reserved_word('and') -> true; +reserved_word('bor') -> true; +reserved_word('bxor') -> true; +reserved_word('bsl') -> true; +reserved_word('bsr') -> true; +reserved_word('or') -> true; +reserved_word('xor') -> true; +reserved_word(_) -> false. + +base(L, Cs) -> + H = string:chr(Cs, $#), + case list_to_integer(string:substr(Cs, 1, H-1)) of + B when B > 16 -> {error,"illegal base"}; + B -> + case base(string:substr(Cs, H+1), B, 0) of + error -> {error,"illegal based number"}; + N -> {token,{integer,L,N}} + end + end. + +base([C|Cs], Base, SoFar) when C >= $0, C =< $9, C < Base + $0 -> + Next = SoFar * Base + (C - $0), + base(Cs, Base, Next); +base([C|Cs], Base, SoFar) when C >= $a, C =< $f, C < Base + $a - 10 -> + Next = SoFar * Base + (C - $a + 10), + base(Cs, Base, Next); +base([C|Cs], Base, SoFar) when C >= $A, C =< $F, C < Base + $A - 10 -> + Next = SoFar * Base + (C - $A + 10), + base(Cs, Base, Next); +base([C|Cs], Base, SoFar) -> error; +base([], Base, N) -> N. + +cc_convert([$$,$\\|Cs]) -> + hd(string_escape(Cs)); +cc_convert([$$,C]) -> C. + +string_gen([$\\|Cs]) -> + string_escape(Cs); +string_gen([C|Cs]) -> + [C|string_gen(Cs)]; +string_gen([]) -> []. + +string_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|string_gen(S)]; +string_escape([$^,C|Cs]) -> + [C band 31|string_gen(Cs)]; +string_escape([C|Cs]) when C >= 0, C =< $ -> + string_gen(Cs); +string_escape([C|Cs]) -> + [escape_char(C)|string_gen(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 = SPC +escape_char($d) -> $\d; %\d = DEL +escape_char(C) -> C. + |