2022-08-03 13:04:42 +00:00
|
|
|
open Core
|
|
|
|
open Backend
|
|
|
|
|
|
|
|
let read_file file =
|
|
|
|
let not_empty str = not (String.is_empty str) in
|
|
|
|
List.filter (In_channel.read_lines file) ~f:not_empty
|
|
|
|
;;
|
|
|
|
|
2022-08-04 15:29:46 +00:00
|
|
|
let classname file = Filename.chop_extension (Filename.basename file)
|
2022-08-03 13:04:42 +00:00
|
|
|
let outfile file = String.concat [ Filename.chop_extension file; ".asm" ]
|
|
|
|
|
|
|
|
let gen_hack file =
|
|
|
|
let ircode = read_file file in
|
2022-08-04 15:29:46 +00:00
|
|
|
let assembly = Be_translate.translate (classname file) ircode in
|
2022-08-03 13:04:42 +00:00
|
|
|
let outchan = Out_channel.create (outfile file) in
|
|
|
|
Out_channel.output_lines outchan assembly;
|
|
|
|
Out_channel.close outchan
|
|
|
|
;;
|
|
|
|
|
|
|
|
let param =
|
|
|
|
let open Command.Param in
|
|
|
|
anon ("filename" %: string)
|
|
|
|
;;
|
|
|
|
|
|
|
|
let command =
|
|
|
|
Command.basic
|
|
|
|
~summary:"Translate <filename>.vm to <filename>.asm"
|
|
|
|
~readme:(fun () -> "Compiler (backend) for project 7 of Nand2Tetris")
|
|
|
|
(Command.Param.map param ~f:(fun filename () -> gen_hack filename))
|
|
|
|
;;
|
|
|
|
|
|
|
|
let () = Command_unix.run command
|