Annotation of researchv10no/cmd/sml/src/lex/ml.lex, revision 1.1.1.1

1.1       root        1: (* Copyright 1989 by AT&T Bell Laboratories *)
                      2: type lexresult = Token.token
                      3: type lexarg = {comLevel : int ref, lineNum : int ref, complain : string->unit}
                      4: val eof = fn {comLevel,lineNum,complain} => 
                      5:            (if !comLevel>0 then complain "unclosed comment" else ();
                      6:             Token.EOF)
                      7: val charlist = ref (nil : string list)
                      8: fun addString (s:string) = charlist := s :: (!charlist)
                      9: fun makeInt s = revfold (fn (c,a) => a*10 + (ord c - Ascii.zero)) (explode s) 0
                     10: %% 
                     11: %s A S F;
                     12: %arg (arg as {comLevel,lineNum,complain});
                     13: idchars=[A-Za-z'_0-9];
                     14: id=[A-Za-z'_]{idchars}*;
                     15: qualid={id}".";
                     16: ws=[\t\ ]*;
                     17: sym=[!%&$+/:<=>?@~|#*`]|\\|\-|\^;
                     18: num=[0-9]+;
                     19: frac="."{num};
                     20: exp="E"(~?){num};
                     21: real=(~?)(({num}{frac}?{exp})|({num}{frac}{exp}?));
                     22: %%
                     23: <INITIAL>{ws}  => (continue());
                     24: <INITIAL>\n    => (inc lineNum; continue());
                     25: <INITIAL>"*"   => (Token.ASTERISK);
                     26: <INITIAL>"|"   => (Token.BAR);
                     27: <INITIAL>":"   => (Token.COLON);
                     28: <INITIAL>"="   => (Token.EQUAL);
                     29: <INITIAL>"_"   => (Token.WILD);
                     30: <INITIAL>"#"   => (Token.HASH);
                     31: <INITIAL>","   => (Token.COMMA);
                     32: <INITIAL>"{"   => (Token.LBRACE);
                     33: <INITIAL>"}"   => (Token.RBRACE);
                     34: <INITIAL>"["   => (Token.LBRACKET);
                     35: <INITIAL>"]"   => (Token.RBRACKET);
                     36: <INITIAL>";"   => (Token.SEMICOLON);
                     37: <INITIAL>"("   => (Token.LPAREN);
                     38: <INITIAL>")"   => (Token.RPAREN);
                     39: <INITIAL>"and" => (Token.AND);
                     40: <INITIAL>"abstraction" => (Token.ABSTRACTION);
                     41: <INITIAL>"abstype"     => (Token.ABSTYPE);
                     42: <INITIAL>"->"          => (Token.ARROW);
                     43: <INITIAL>"as"          => (Token.AS);
                     44: <INITIAL>"case"                => (Token.CASE);
                     45: <INITIAL>"datatype"    => (Token.DATATYPE);
                     46: <INITIAL>"..."         => (Token.DOTDOTDOT);
                     47: <INITIAL>"else"                => (Token.ELSE);
                     48: <INITIAL>"end"         => (Token.END);
                     49: <INITIAL>"eqtype"      => (Token.EQTYPE);
                     50: <INITIAL>"exception"   => (Token.EXCEPTION);
                     51: <INITIAL>"do"          => (Token.DO);
                     52: <INITIAL>"=>"          => (Token.DARROW);
                     53: <INITIAL>"fn"          => (Token.FN);
                     54: <INITIAL>"fun"         => (Token.FUN);
                     55: <INITIAL>"functor"     => (Token.FUNCTOR);
                     56: <INITIAL>"handle"      => (Token.HANDLE);
                     57: <INITIAL>"if"          => (Token.IF);
                     58: <INITIAL>"in"          => (Token.IN);
                     59: <INITIAL>"include"     => (Token.INCLUDE);
                     60: <INITIAL>"infix"       => (Token.INFIX);
                     61: <INITIAL>"infixr"      => (Token.INFIXR);
                     62: <INITIAL>"let"         => (Token.LET);
                     63: <INITIAL>"local"       => (Token.LOCAL);
                     64: <INITIAL>"nonfix"      => (Token.NONFIX);
                     65: <INITIAL>"of"          => (Token.OF);
                     66: <INITIAL>"op"          => (Token.OP);
                     67: <INITIAL>"open"                => (Token.OPEN);
                     68: <INITIAL>"overload"    => (Token.OVERLOAD);
                     69: <INITIAL>"raise"       => (Token.RAISE);
                     70: <INITIAL>"rec"         => (Token.REC);
                     71: <INITIAL>"sharing"     => (Token.SHARING);
                     72: <INITIAL>"sig"         => (Token.SIG);
                     73: <INITIAL>"signature"   => (Token.SIGNATURE);
                     74: <INITIAL>"struct"      => (Token.STRUCT);
                     75: <INITIAL>"structure"   => (Token.STRUCTURE);
                     76: <INITIAL>"then"                => (Token.THEN);
                     77: <INITIAL>"type"                => (Token.TYPE);
                     78: <INITIAL>"val"         => (Token.VAL);
                     79: <INITIAL>"while"       => (Token.WHILE);
                     80: <INITIAL>"with"                => (Token.WITH);
                     81: <INITIAL>"withtype"    => (Token.WITHTYPE);
                     82: <INITIAL>"orelse"      => (Token.ORELSE);
                     83: <INITIAL>"andalso"     => (Token.ANDALSO);
                     84: <INITIAL>"import"      => (Token.IMPORT);
                     85: <INITIAL>{qualid} =>
                     86:   (Token.IDDOT (Symbol.symbol(substring(yytext,0,size(yytext)-1))));
                     87: <INITIAL>"..." => (Token.DOTDOTDOT);
                     88: <INITIAL>"'"{idchars}+ => (Token.TYVAR(Symbol.symbol yytext));
                     89: <INITIAL>({sym}+|{id}) => (Token.ID(Symbol.symbol yytext));
                     90: <INITIAL>{real}        => (Token.REAL yytext);
                     91: <INITIAL>{num} => (Token.INT(makeInt yytext
                     92:                    handle Overflow => (complain "integer too large"; 0)));
                     93: <INITIAL>~{num}        => (Token.INT(~(makeInt(substring(yytext,1,size(yytext)-1)))
                     94:                    handle Overflow => (complain "integer too large"; 0)));
                     95: <INITIAL>\"    => (charlist := nil; YYBEGIN S; continue());
                     96: <INITIAL>"(*"  => (YYBEGIN A; comLevel := 1; continue());
                     97: <INITIAL>.     => (complain "illegal token"; continue());
                     98: <A>"(*"                => (inc comLevel; continue());
                     99: <A>\n          => (inc lineNum; continue());
                    100: <A>"*)" => (dec comLevel; if !comLevel=0 then YYBEGIN INITIAL else (); continue());
                    101: <A>.           => (continue());
                    102: <S>\"          => (YYBEGIN INITIAL; Token.STRING(implode(rev(!charlist))));
                    103: <S>\n          => (complain "unclosed string"; YYBEGIN INITIAL; Token.STRING "");
                    104: <S>[^"\\\n]*   => (addString yytext; continue());
                    105: <S>\\\n                => (inc lineNum; YYBEGIN F; continue());
                    106: <S>\\[\ \t]    => (YYBEGIN F; continue());
                    107: <F>\n          => (inc lineNum; continue());
                    108: <F>{ws}                => (continue());
                    109: <F>\\          => (YYBEGIN S; continue());
                    110: <F>.           => (complain "unclosed string"; YYBEGIN INITIAL; Token.STRING "");
                    111: <S>\\t         => (addString "\t"; continue());
                    112: <S>\\n         => (addString "\n"; continue());
                    113: <S>\\\\                => (addString "\\"; continue());
                    114: <S>\\\"                => (addString(chr(Ascii.dquote)); continue());
                    115: <S>\\\^[@-_]   => (addString(chr(ordof(yytext,2)-ord("@"))); continue());
                    116: <S>\\[0-9]{3}  =>
                    117:  (let val x = ordof(yytext,1)*100
                    118:             +ordof(yytext,2)*10
                    119:             +ordof(yytext,3)
                    120:             -(Ascii.zero*111)
                    121:   in (if x>255
                    122:       then complain ("illegal ascii escape '"^yytext^"'")
                    123:       else addString (chr x);
                    124:       continue())
                    125:   end);
                    126: <S>\\          => (complain "illegal string escape"; continue());

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.