src/HOL/Boogie/Tools/boogie_loader.ML
changeset 43947 9b00f09f7721
parent 43702 24fb44c1086a
child 44241 7943b69f0188
equal deleted inserted replaced
43946:ba88bb44c192 43947:9b00f09f7721
   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} ||