cduce.ml 1008 Bytes
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
open Location

let input = Stream.of_channel stdin
let ppf = Format.std_formatter
let prog () = 
  try Parser.prog input
  with
    | Stdpp.Exc_located (loc, e) -> 
        raise (Location (loc, e))

let rec print_exn ppf = function
  | Location ((i,j), exn) ->
      Format.fprintf ppf "Error at chars %i-%i@\n" i j;
      print_exn ppf exn
  | Typer.Constraint (s,t,msg) ->
      Format.fprintf ppf "%s@\n" msg;
      Format.fprintf ppf "%a is not a subtype of %a@\n" 
	Types.Print.print_descr s 
	Types.Print.print_descr t;
      Format.fprintf ppf "as shown by %a@\n" 
	Types.Print.print_sample (Types.Sample.get (Types.diff s t))
  | exn ->
      Format.fprintf ppf "%s@\n" (Printexc.to_string exn)

let phrase ph =
  match ph.descr with
    | Ast.EvalStatement e ->
	let (fv,e) = Typer.expr e in
	let t = Typer.compute_type Typer.Env.empty e in
	Format.fprintf ppf "%a@\n" Types.Print.print_descr t;
    | _ -> assert false

let () = 
  try List.iter phrase (prog ())
  with exn -> print_exn ppf exn