structure Tokens = Tokens structure Interface = Interface open Interface type pos = Interface.pos type svalue = Tokens.svalue type ('a,'b) token = ('a,'b) Tokens.token type lexresult= (svalue,pos) token val eof = fn () => Tokens.EOF(!line,!line) fun makeInt (s : string) = s %% %header (functor FolLexFun(structure Tokens: Fol_TOKENS structure Interface: INTERFACE) : LEXER); lcstart=[a-z!&$+/<=>?@~|#*`]|\-; ucstart=[A-Z_]; idchars={lcstart}|{ucstart}|[0-9]; lcid={lcstart}{idchars}*; ucid={ucstart}{idchars}*; ws=[\t\ ]*; num=[0-9]+; %% {ws} => (lex()); \n => (next_line(); lex()); ":-" => (Tokens.BACKARROW(!line,!line)); "," => (Tokens.COMMA(!line,!line)); ";" => (Tokens.SEMICOLON(!line,!line)); "." => (Tokens.DOT(!line,!line)); "(" => (Tokens.LPAREN(!line,!line)); ")" => (Tokens.RPAREN(!line,!line)); "->" => (Tokens.ARROW(!line,!line)); "=>" => (Tokens.DOUBLEARROW(!line,!line)); "|" => (Tokens.BAR(!line,!line)); "true" => (Tokens.TRUE(!line,!line)); "forall" => (Tokens.FORALL(!line,!line)); "exists" => (Tokens.EXISTS(!line,!line)); {lcid} => (Tokens.LCID (yytext,!line,!line)); {ucid} => (Tokens.UCID (yytext,!line,!line)); {num} => (Tokens.INT (makeInt yytext,!line,!line)); . => (error ("ignoring illegal character" ^ yytext, !line,!line); lex());