329 map (pair i) (map Token (String.tokens blank line) @ [Newline]) :: tss) |
329 map (pair i) (map Token (String.tokens blank line) @ [Newline]) :: tss) |
330 in apsnd (flat o rev) (fold_lines split input (1, [])) end |
330 in apsnd (flat o rev) (fold_lines split input (1, [])) end |
331 |
331 |
332 fun stopper i = Scan.stopper (K (i, EOF)) (fn (_, EOF) => true | _ => false) |
332 fun stopper i = Scan.stopper (K (i, EOF)) (fn (_, EOF) => true | _ => false) |
333 |
333 |
334 fun scan_err msg [] = "Boogie (at end of input): " ^ msg |
334 fun scan_err msg [] = (fn () => "Boogie (at end of input): " ^ msg ()) |
335 | scan_err msg ((i, _) :: _) = "Boogie (at line " ^ string_of_int i ^ "): " ^ |
335 | scan_err msg ((i, _) :: _) = |
336 msg |
336 (fn () => "Boogie (at line " ^ string_of_int i ^ "): " ^ msg ()) |
337 |
337 |
338 fun scan_fail msg = Scan.fail_with (scan_err msg) |
338 fun scan_fail' msg = Scan.fail_with (scan_err msg) |
|
339 fun scan_fail s = scan_fail' (fn () => s) |
339 |
340 |
340 fun finite scan fold_lines input = |
341 fun finite scan fold_lines input = |
341 let val (i, ts) = tokenize fold_lines input |
342 let val (i, ts) = tokenize fold_lines input |
342 in |
343 in |
343 (case Scan.error (Scan.finite (stopper i) scan) ts of |
344 (case Scan.error (Scan.finite (stopper i) scan) ts of |
344 (x, []) => x |
345 (x, []) => x |
345 | (_, ts') => error (scan_err "unparsed input" ts')) |
346 | (_, ts') => error ((scan_err (fn () => "unparsed input") ts') ())) |
346 end |
347 end |
347 |
348 |
348 fun read_int' s = (case read_int (raw_explode s) of (i, []) => SOME i | _ => NONE) |
349 fun read_int' s = (case read_int (raw_explode s) of (i, []) => SOME i | _ => NONE) |
349 |
350 |
350 fun $$$ s = Scan.one (fn (_, Token s') => s = s' | _ => false) |
351 fun $$$ s = Scan.one (fn (_, Token s') => s = s' | _ => false) |
359 if i > 0 then scan ::: scan_count scan (i - 1) else Scan.succeed [] |
360 if i > 0 then scan ::: scan_count scan (i - 1) else Scan.succeed [] |
360 |
361 |
361 fun scan_lookup kind tab key = |
362 fun scan_lookup kind tab key = |
362 (case Symtab.lookup tab key of |
363 (case Symtab.lookup tab key of |
363 SOME value => Scan.succeed value |
364 SOME value => Scan.succeed value |
364 | NONE => scan_fail ("undefined " ^ kind ^ ": " ^ quote key)) |
365 | NONE => scan_fail' (fn () => "undefined " ^ kind ^ ": " ^ quote key)) |
365 |
366 |
366 fun typ tds = |
367 fun typ tds = |
367 let |
368 let |
368 fun tp st = |
369 fun tp st = |
369 (scan_line' "bool" >> K @{typ bool} || |
370 (scan_line' "bool" >> K @{typ bool} || |