structure Tokens = Tokens structure Interface = Interface structure Lexer = Lexer open Interface type pos = Interface.pos type svalue = Tokens.svalue type ('a, 'b) token = ('a, 'b) Tokens.token type lexresult = (svalue, pos) token val pos = ref 0 fun inc z = z := !z + 1 val eof = fn () => Tokens.EOF(!line, !line) %% %s COMMENT; %header (functor DelphinLexFun(structure Tokens : Delphin_TOKENS structure Interface : INTERFACE structure Lexer : LEXER)); ws = [\ \t ]; uiden = (([#][A-Z][_])|[_A-Za-z])[-A-Za-z0-9!@#$/\^&*+|\\;'_]*([-A-Za-z0-9!@#/\^&*+|\\;'_]+)*; catchall = .; %% {ws}+ => (lex()); \n => (next_line(); lex()); "(*" => (YYBEGIN COMMENT; lex()); "*)" => (YYBEGIN INITIAL; lex()); {catchall} => (lex()); "@" => (Tokens.AT(!line,!line)); "*" => (Tokens.TIMES(!line,!line)); "+" => (Tokens.PLUS(!line,!line)); "::" => (Tokens.DBLCOLON(!line,!line)); ":" => (Tokens.COLON(!line,!line)); "." => (Tokens.DOT(!line,!line)); "->" => (Tokens.RTARROW(!line,!line)); "<-" => (Tokens.LTARROW(!line,!line)); "=>" => (Tokens.DBLARROW(!line,!line)); "=" => (Tokens.EQUAL(!line,!line)); "<>" => (Tokens.UNIT(!line,!line)); "<" => (Tokens.LTANGLE(!line,!line)); ">" => (Tokens.RTANGLE(!line,!line)); "(" => (Tokens.LTPAREN(!line,!line)); ")" => (Tokens.RTPAREN(!line,!line)); "[[" => (Tokens.LLAM(!line,!line)); "]]" => (Tokens.RLAM(!line,!line)); "[" => (Tokens.LTBRACKET(!line,!line)); "]" => (Tokens.RTBRACKET(!line,!line)); "{" => (Tokens.LTBRACE(!line,!line)); "}" => (Tokens.RTBRACE(!line,!line)); "," => (Tokens.COMMA(!line,!line)); "||" => (Tokens.PAR(!line,!line)); "|" => (Tokens.BAR(!line,!line)); "type" => (Tokens.TYPE(!line,!line)); "world" => (Tokens.WORLD(!line,!line)); "val" => (Tokens.VAL(!line,!line)); "fun" => (Tokens.FUN(!line,!line)); "case" => (Tokens.CASE(!line,!line)); "of" => (Tokens.OF(!line,!line)); "let" => (Tokens.LET(!line,!line)); "in" => (Tokens.IN(!line,!line)); "end" => (Tokens.END(!line,!line)); "new" => (Tokens.NEW(!line,!line)); "choose" => (Tokens.CHOOSE(!line,!line)); "%block" => (Tokens.BLOCKDEC(!line,!line)); "some" => (Tokens.SOME(yytext,!line,!line)); "block" => (Tokens.BLOCK(yytext,!line,!line)); "create" => (Tokens.CREATE(!line,!line)); "all" => (Tokens.ALL(!line,!line)); "all^" => (Tokens.ALLOMITTED(!line,!line)); "exists" => (Tokens.EXISTS(!line,!line)); "exists^" => (Tokens.EXISTSOMITTED(!line,!line)); "true" => (Tokens.TRUE(!line,!line)); "and" => (Tokens.AND(!line,!line)); "_" => (Tokens.UNDERSCORE(!line,!line)); {uiden}{ws}+"::" => (Tokens.FORMID(yytext,!line,!line)); {uiden} => (Tokens.ID(yytext,!line,!line)); . => (error ("ignoring bad character " ^ yytext,!line, !line); lex());