module C = import "./compile.ml" module A = import "./assemble.ml" module T = import "./tc.ml" open import "./parser.ml" open import "prelude.ml" open import "lua/io.ml" external val dofile : string -> () = "dofile" let printerror (e, { line, col }) = put_line @@ "line " ^ show line ^ ", col " ^ show col ^ ":" print e let go infile outfile = let infile = open_for_reading infile let outfile = open_file outfile Write_m match read_all infile with | Some str -> match lex prog str with | Right (ds, _) -> ds |> C.program |> A.assm_program |> write_bytes outfile | Left e -> printerror e | _ -> () close_file infile close_file outfile let go' infile outfile = go infile outfile dofile outfile let test str = match lex prog str with | Right (ds, _) -> let code = ds |> T.tc_program |> C.program let lua = code |> A.assm_program print code put_line lua | Left e -> printerror e let test_file infile = let infile = open_for_reading infile match read_all infile with | Some str -> test str | None -> () close_file infile external val args : string * string = "{ _1 = select(1, ...), _2 = select(2, ...) }" external val has_args : bool = "select('#', ...) ~= 0" let () = if has_args then let (from, into) = args go from into else ()