(* this is an -*- sml-lex -*- file *) 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 1 fun eof _ = Tokens.EOF(!pos,!pos) type arg = string list ref %% %header (functor HOLsexpLexFun(structure Tokens : HOLsexp_TOKENS)); %full %s string comment quotedsymbol; %arg (stringbuffer : string list ref); digit=[0-9]; integer={digit}+; space = [\ \t]; %% ";" => (YYBEGIN comment; continue()); "(" => (Tokens.LPAREN(!pos, !pos)); ")" => (Tokens.RPAREN(!pos, !pos)); {space}+ => (continue()); "\n" => (continue()); [-+]?{integer} => (Tokens.NUMBER(valOf (Int.fromString yytext), !pos, !pos)); "'" => (Tokens.QUOTE(!pos,!pos)); "." => (Tokens.DOT(!pos,!pos)); "|" => (YYBEGIN quotedsymbol; stringbuffer := []; continue()); [-%+*_A-Za-z0-9]+ => (Tokens.SYMBOL(yytext, !pos, !pos)); "\"" => (YYBEGIN string; stringbuffer := []; continue()); . => (raise Fail ("Unexpected: "^yytext)); "|" => (YYBEGIN INITIAL; Tokens.SYMBOL(String.concat (List.rev(!stringbuffer)), !pos, !pos)); "\\|" => (stringbuffer := "|" :: !stringbuffer; continue()); "\\n" => (stringbuffer := "\n" :: !stringbuffer; continue()); [^\\|]+ => (stringbuffer := yytext :: !stringbuffer; continue()); \n => (raise Fail "Newline inside |-quoted-symbol"); "\"" => (YYBEGIN INITIAL; Tokens.STRING(String.concat (List.rev(!stringbuffer)), !pos, !pos)); "\\\"" => (stringbuffer := "\"" :: !stringbuffer; continue()); "\\a" => (stringbuffer := "\a" :: !stringbuffer; continue()); "\\b" => (stringbuffer := "\b" :: !stringbuffer; continue()); "\\f" => (stringbuffer := "\f" :: !stringbuffer; continue()); "\\n" => (stringbuffer := "\n" :: !stringbuffer; continue()); "\\r" => (stringbuffer := "\r" :: !stringbuffer; continue()); "\\t" => (stringbuffer := "\t" :: !stringbuffer; continue()); [^\"\\]+ => (stringbuffer := yytext :: !stringbuffer; continue()); \n => (raise Fail "Newline inside string literal"); "\\"[0-9][0-9][0-9] => ( let val code = valOf (Int.fromString (String.substring(yytext, 1, 3))) in stringbuffer := str (Char.chr code) :: !stringbuffer; continue() end ); "\\^" [\064-\095] => ( let val code = Char.ord (String.sub(yytext, 2)) - 64 in stringbuffer := str (Char.chr code) :: !stringbuffer ; continue() end ); "\\\\" => (stringbuffer := "\\" :: !stringbuffer; continue()); "\\" . => (raise Fail ("Can't cope with escaping "^yytext^ " inside string literal")); . => (raise Fail ("Can't cope with character "^yytext^ " inside string literal")); \n => (YYBEGIN INITIAL; continue()); . => (continue());