|
@@ -2,14 +2,14 @@ open Lexing
|
|
|
open Printf
|
|
open Printf
|
|
|
open Ast
|
|
open Ast
|
|
|
|
|
|
|
|
-(* Compile infile to assembly code
|
|
|
|
|
|
|
+(* Compile CVC file to assembly code
|
|
|
* in_channel -> int -> repr *)
|
|
* in_channel -> int -> repr *)
|
|
|
-let compile infile verbose =
|
|
|
|
|
- let rec run_phases ir = function
|
|
|
|
|
- | [] -> ir
|
|
|
|
|
- | h::t -> run_phases (h ir) t
|
|
|
|
|
|
|
+let compile args =
|
|
|
|
|
+ let rec run_phases input = function
|
|
|
|
|
+ | [] -> input
|
|
|
|
|
+ | h::t -> run_phases (h input) t
|
|
|
in
|
|
in
|
|
|
- run_phases (Inputfile (infile, verbose)) [
|
|
|
|
|
|
|
+ run_phases (Args args) [
|
|
|
Parse.phase;
|
|
Parse.phase;
|
|
|
Print.phase;
|
|
Print.phase;
|
|
|
Desug.phase;
|
|
Desug.phase;
|
|
@@ -64,26 +64,33 @@ let print_fancy_error msg loc verbose =
|
|
|
(* Main function, returns exit status
|
|
(* Main function, returns exit status
|
|
|
* () -> int *)
|
|
* () -> int *)
|
|
|
let main () =
|
|
let main () =
|
|
|
- let filename = ref None in
|
|
|
|
|
- let verbose = ref 2 in
|
|
|
|
|
- let args = [
|
|
|
|
|
- ("-v", Arg.Int (fun i -> verbose := i), "Set verbosity")
|
|
|
|
|
|
|
+ let args = {
|
|
|
|
|
+ filename = None;
|
|
|
|
|
+ verbose = 2
|
|
|
|
|
+ } in
|
|
|
|
|
+ let args_spec = [
|
|
|
|
|
+ ("-v", Arg.Int (fun i -> args.verbose <- i), "Set verbosity")
|
|
|
] in
|
|
] in
|
|
|
let usage = "Usage: " ^ Sys.argv.(0) ^ " [ -v VERBOSITY ] FILE" in
|
|
let usage = "Usage: " ^ Sys.argv.(0) ^ " [ -v VERBOSITY ] FILE" in
|
|
|
|
|
|
|
|
try
|
|
try
|
|
|
- Arg.parse args (fun s -> filename := Some s) usage;
|
|
|
|
|
- let _ = compile !filename !verbose in
|
|
|
|
|
- 0
|
|
|
|
|
|
|
+ try
|
|
|
|
|
+ Arg.parse args_spec (fun s -> args.filename <- Some s) usage;
|
|
|
|
|
+ compile args;
|
|
|
|
|
+ 0
|
|
|
|
|
+ with
|
|
|
|
|
+ | InvalidNode ->
|
|
|
|
|
+ raise (CompileError "invalid node")
|
|
|
|
|
+ | InvalidInput name ->
|
|
|
|
|
+ raise (CompileError ("invalid input for phase \"" ^ name ^ "\""))
|
|
|
|
|
+ | NodeError (node, msg) ->
|
|
|
|
|
+ raise (LocError (Util.locof node, msg))
|
|
|
with
|
|
with
|
|
|
| CompileError msg ->
|
|
| CompileError msg ->
|
|
|
- prerr_endline ("Error: " ^ msg);
|
|
|
|
|
- 1
|
|
|
|
|
- | NodeError (node, msg) ->
|
|
|
|
|
- print_fancy_error msg (Util.locof node) !verbose;
|
|
|
|
|
|
|
+ eprintf "Error: %s\n" msg;
|
|
|
1
|
|
1
|
|
|
| LocError (loc, msg) ->
|
|
| LocError (loc, msg) ->
|
|
|
- print_fancy_error msg loc !verbose;
|
|
|
|
|
|
|
+ print_fancy_error msg loc args.verbose;
|
|
|
1
|
|
1
|
|
|
|
|
|
|
|
let _ = exit (main ())
|
|
let _ = exit (main ())
|