src/Pure/Syntax/lexicon.ML
changeset 15531 08c8dad8e399
parent 15443 07f78cc82a73
child 15570 8d8c70b41bab
equal deleted inserted replaced
15530:6f43714517ee 15531:08c8dad8e399
   215   | valued_token EndToken = false;
   215   | valued_token EndToken = false;
   216 
   216 
   217 
   217 
   218 (* predef_term *)
   218 (* predef_term *)
   219 
   219 
   220 fun predef_term "id" = Some (IdentSy "id")
   220 fun predef_term "id" = SOME (IdentSy "id")
   221   | predef_term "longid" = Some (LongIdentSy "longid")
   221   | predef_term "longid" = SOME (LongIdentSy "longid")
   222   | predef_term "var" = Some (VarSy "var")
   222   | predef_term "var" = SOME (VarSy "var")
   223   | predef_term "tid" = Some (TFreeSy "tid")
   223   | predef_term "tid" = SOME (TFreeSy "tid")
   224   | predef_term "tvar" = Some (TVarSy "tvar")
   224   | predef_term "tvar" = SOME (TVarSy "tvar")
   225   | predef_term "num" = Some (NumSy "num")
   225   | predef_term "num" = SOME (NumSy "num")
   226   | predef_term "xnum" = Some (XNumSy "xnum")
   226   | predef_term "xnum" = SOME (XNumSy "xnum")
   227   | predef_term "xstr" = Some (StrSy "xstr")
   227   | predef_term "xstr" = SOME (StrSy "xstr")
   228   | predef_term _ = None;
   228   | predef_term _ = NONE;
   229 
   229 
   230 
   230 
   231 (* xstr tokens *)
   231 (* xstr tokens *)
   232 
   232 
   233 fun lex_err msg prfx (cs, _) =
   233 fun lex_err msg prfx (cs, _) =
   245 
   245 
   246 fun implode_xstr cs = enclose "''" "''" (implode (map (fn "'" => "\\'" | c => c) cs));
   246 fun implode_xstr cs = enclose "''" "''" (implode (map (fn "'" => "\\'" | c => c) cs));
   247 
   247 
   248 fun explode_xstr str =
   248 fun explode_xstr str =
   249   (case Scan.read Symbol.stopper scan_str (Symbol.explode str) of
   249   (case Scan.read Symbol.stopper scan_str (Symbol.explode str) of
   250     Some cs => cs
   250     SOME cs => cs
   251   | _ => error ("Inner lexical error: literal string expected at " ^ quote str));
   251   | _ => error ("Inner lexical error: literal string expected at " ^ quote str));
   252 
   252 
   253 
   253 
   254 (* nested comments *)
   254 (* nested comments *)
   255 
   255 
   284       scan_xid >> pair IdentSy;
   284       scan_xid >> pair IdentSy;
   285 
   285 
   286     val scan_lit = Scan.literal lex >> (pair Token o implode);
   286     val scan_lit = Scan.literal lex >> (pair Token o implode);
   287 
   287 
   288     val scan_token =
   288     val scan_token =
   289       scan_comment >> K None ||
   289       scan_comment >> K NONE ||
   290       Scan.max (op <= o pairself snd) scan_lit scan_val >> (fn (tk, s) => Some (tk s)) ||
   290       Scan.max (op <= o pairself snd) scan_lit scan_val >> (fn (tk, s) => SOME (tk s)) ||
   291       scan_str >> (Some o StrSy o implode_xstr) ||
   291       scan_str >> (SOME o StrSy o implode_xstr) ||
   292       Scan.one Symbol.is_blank >> K None;
   292       Scan.one Symbol.is_blank >> K NONE;
   293   in
   293   in
   294     (case Scan.error (Scan.finite Symbol.stopper (Scan.repeat scan_token)) chs of
   294     (case Scan.error (Scan.finite Symbol.stopper (Scan.repeat scan_token)) chs of
   295       (toks, []) => mapfilter I toks @ [EndToken]
   295       (toks, []) => mapfilter I toks @ [EndToken]
   296     | (_, cs) => error ("Inner lexical error at: " ^ quote (implode cs)))
   296     | (_, cs) => error ("Inner lexical error at: " ^ quote (implode cs)))
   297   end;
   297   end;
   328      $$ "'" |-- scan_vname >> (fn (x, i) => ("'" ^ x, i))
   328      $$ "'" |-- scan_vname >> (fn (x, i) => ("'" ^ x, i))
   329   || scan_vname;
   329   || scan_vname;
   330 
   330 
   331 fun indexname cs =
   331 fun indexname cs =
   332   (case Scan.read Symbol.stopper scan_indexname (Symbol.explode cs) of
   332   (case Scan.read Symbol.stopper scan_indexname (Symbol.explode cs) of
   333     Some xi => xi
   333     SOME xi => xi
   334   | _ => error ("Lexical error in variable name: " ^ quote cs));
   334   | _ => error ("Lexical error in variable name: " ^ quote cs));
   335 
   335 
   336 
   336 
   337 (* read_var *)
   337 (* read_var *)
   338 
   338 
   383     val blanks = Scan.any Symbol.is_blank;
   383     val blanks = Scan.any Symbol.is_blank;
   384     val junk = Scan.any Symbol.not_eof;
   384     val junk = Scan.any Symbol.not_eof;
   385     val idents = Scan.repeat1 (blanks |-- scan_id --| blanks) -- junk;
   385     val idents = Scan.repeat1 (blanks |-- scan_id --| blanks) -- junk;
   386   in
   386   in
   387     (case Scan.read Symbol.stopper idents (Symbol.explode str) of
   387     (case Scan.read Symbol.stopper idents (Symbol.explode str) of
   388       Some (ids, []) => ids
   388       SOME (ids, []) => ids
   389     | Some (_, bad) => error ("Bad identifier: " ^ quote (implode bad))
   389     | SOME (_, bad) => error ("Bad identifier: " ^ quote (implode bad))
   390     | None => error ("No identifier found in: " ^ quote str))
   390     | NONE => error ("No identifier found in: " ^ quote str))
   391   end;
   391   end;
   392 
   392 
   393 end;
   393 end;