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 ()
|