structure Tokens = Tokens type pos = int type svalue = Tokens.svalue type ('a,'b) token = ('a,'b) Tokens.token type lexresult= (svalue,pos) token val pos = ref 0 val eof = fn () => Tokens.EOF(!pos,!pos) val error = fn (e,l : int,_) => TextIO.print("line " ^ (Int.toString l) ^ ": " ^ e ^ "\n") %% %header (functor LingayLexFun(structure Tokens: Lingay_TOKENS)); alpha=[A-Za-z]; ident=[A-Za-z0-9_']; digit=[0-9]; ws = [\ \t]; slash = [/]; %% \n => (pos := (!pos) + 1; lex()); {ws}+ => (lex()); "'@"{alpha}{ident}* => (Tokens.ROWVAR(yytext,!pos,!pos)); "/*"([^\*]*(\*[^/])?)*"*/" => (lex()); "//".*\n => (pos := (!pos) + 1; lex()); "," => (Tokens.COMMA(!pos,!pos)); "|" => (Tokens.BAR(!pos,!pos)); "[|" => (Tokens.LSUM(!pos,!pos)); "|]" => (Tokens.RSUM(!pos,!pos)); "{" => (Tokens.LPROD(!pos,!pos)); "}" => (Tokens.RPROD(!pos,!pos)); "(" => (Tokens.LPAREN(!pos,!pos)); ")" => (Tokens.RPAREN(!pos,!pos)); "**" => (Tokens.PRODEXT(!pos,!pos)); "->" => (Tokens.ARROW(!pos,!pos)); "=>" => (Tokens.WARROW(!pos,!pos)); "-o" => (Tokens.LOLLY(!pos,!pos)); ":" => (Tokens.COLON(!pos,!pos)); "::" => (Tokens.DCOLON(!pos,!pos)); ":<" => (Tokens.CAST(!pos,!pos)); "!" => (Tokens.BANG(!pos,!pos)); "+>" => (Tokens.MERGE(!pos,!pos)); "+" => (Tokens.PLUS(!pos,!pos)); "-" => (Tokens.MINUS(!pos,!pos)); "<" => (Tokens.LT(!pos,!pos)); "%" => (Tokens.INJECT(!pos,!pos)); "=" => (Tokens.EQUALS(!pos,!pos)); "\." => (Tokens.DOT(!pos,!pos)); "\\" => (Tokens.BACKSLASH(!pos,!pos)); "$" => (Tokens.DOLLAR(!pos,!pos)); ";" => (Tokens.SEMI(!pos,!pos)); "?" => (Tokens.QUERY(!pos,!pos)); ":=" => (Tokens.ASSIGN(!pos,!pos)); "_" => (Tokens.WILDCARD(!pos,!pos)); ":=:" => (Tokens.ISO(!pos,!pos)); "VS" => (Tokens.VS(!pos,!pos)); "bool" => (Tokens.BOOLTY(!pos,!pos)); "int" => (Tokens.INTTY(!pos,!pos)); "unit" => (Tokens.UNITTY(!pos,!pos)); "rectype" => (Tokens.RECTYPE(!pos,!pos)); "classimpl" => (Tokens.CLASSIMPL(!pos,!pos)); "linear" => (Tokens.LINEAR(!pos,!pos)) ; "prom" => (Tokens.PROM(!pos,!pos)); "der" => (Tokens.DER(!pos,!pos)); "fold" => (Tokens.FOLD(!pos,!pos)); "unfold" => (Tokens.UNFOLD(!pos,!pos)); "new" => (Tokens.NEW(!pos,!pos)); "split" => (Tokens.SPLIT(!pos,!pos)); "as" => (Tokens.AS(!pos,!pos)); "in" => (Tokens.IN(!pos,!pos)); "tag" => (Tokens.TAG(!pos,!pos)); "tok" => (Tokens.TOK(!pos,!pos)); "case" => (Tokens.CASE(!pos,!pos)); "of" => (Tokens.OF(!pos,!pos)); "end" => (Tokens.END(!pos,!pos)); "root" => (Tokens.ROOT(!pos,!pos)); "extend" => (Tokens.EXTEND(!pos,!pos)); "with" => (Tokens.WITH(!pos,!pos)); "fn" => (Tokens.FN(!pos,!pos)); "oncefn" => (Tokens.ONCEFN(!pos,!pos)); "casefn" => (Tokens.CASEFN(!pos,!pos)); "caseoncefn" => (Tokens.CASEONCEFN(!pos,!pos)); "rec" => (Tokens.REC(!pos,!pos)); "catchcont" => (Tokens.CATCHCONT(!pos,!pos)); "force" => (Tokens.FORCE(!pos,!pos)); "if" => (Tokens.IF(!pos,!pos)); "then" => (Tokens.THEN(!pos,!pos)); "else" => (Tokens.ELSE(!pos,!pos)); "local" => (Tokens.LOCAL(!pos,!pos)); "val" => (Tokens.VAL(!pos,!pos)); "recval" => (Tokens.RECVAL(!pos,!pos)); "fun" => (Tokens.FUN(!pos,!pos)); "recfun" => (Tokens.RECFUN(!pos,!pos)); "type" => (Tokens.TYPE(!pos,!pos)); "datatype" => (Tokens.DATATYPE(!pos,!pos)); "safe" => (Tokens.SAFE(!pos,!pos)); "metasafe" => (Tokens.METASAFE(!pos,!pos)); "metasafe_lin" => (Tokens.METASAFELIN(!pos,!pos)); "writesafe" => (Tokens.WRITESAFE(!pos,!pos)); "argsafe" => (Tokens.ARGSAFE(!pos,!pos)); "let" => (Tokens.LET(!pos,!pos)); "true" => (Tokens.BOOL(true,!pos,!pos)); "false" => (Tokens.BOOL(false,!pos,!pos)); "fields" => (Tokens.FIELDS(!pos,!pos)); "methods" => (Tokens.METHODS(!pos,!pos)); "constr" => (Tokens.CONSTR(!pos,!pos)); "make" => (Tokens.MAKE(!pos,!pos)) ; "ref" => (Tokens.REF(!pos,!pos)) ; "deref" => (Tokens.DEREF(!pos,!pos)) ; "class" => (Tokens.CLASS(!pos,!pos)) ; "funclass" => (Tokens.FUNCLASS(!pos,!pos)) ; "linclass" => (Tokens.LINCLASS(!pos,!pos)) ; "extending" => (Tokens.EXTENDING(!pos,!pos)) ; "~"?{digit}+ => (Tokens.INT(yytext,!pos,!pos)); {alpha}{ident}* => (Tokens.ID(yytext,!pos,!pos)); . => (error ("ignoring bad character "^yytext,!pos,!pos); lex());