equal
deleted
inserted
replaced
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; |