2024-07-05 13:23:20 +02:00
|
|
|
open Options
|
2020-10-03 11:49:43 +03:00
|
|
|
|
2023-09-04 21:43:28 +02:00
|
|
|
let[@ocaml.warning "-32"] main =
|
2020-10-03 11:49:43 +03:00
|
|
|
try
|
2019-11-24 02:30:32 +03:00
|
|
|
let cmd = new options Sys.argv in
|
2020-02-16 01:21:27 +03:00
|
|
|
cmd#greet;
|
2023-09-04 21:43:28 +02:00
|
|
|
match
|
|
|
|
|
try Language.run_parser cmd
|
|
|
|
|
with Language.Semantic_error msg -> `Fail msg
|
|
|
|
|
with
|
|
|
|
|
| `Ok prog -> (
|
|
|
|
|
cmd#dump_AST (snd prog);
|
|
|
|
|
cmd#dump_source (snd prog);
|
|
|
|
|
match cmd#get_mode with
|
2024-08-30 00:35:31 +03:00
|
|
|
| `Default | `Compile -> (
|
|
|
|
|
match cmd#march with
|
|
|
|
|
| `X86_32 -> ignore @@ X86_32.build cmd prog
|
2024-11-01 22:16:30 +03:00
|
|
|
| `AMD64 -> ignore @@ X86_64.build cmd prog)
|
2023-09-04 21:43:28 +02:00
|
|
|
| `BC -> SM.ByteCode.compile cmd (SM.compile cmd prog)
|
2020-10-03 11:49:43 +03:00
|
|
|
| _ ->
|
2023-09-04 21:43:28 +02:00
|
|
|
let rec read acc =
|
|
|
|
|
try
|
|
|
|
|
let r = read_int () in
|
2024-09-05 17:32:45 +03:00
|
|
|
Printf.printf " > ";
|
|
|
|
|
(* NOTE(Kakadu): This kind of ouput (leading >) will be in a conflict with dune's
|
|
|
|
|
integration tests machinery *)
|
2024-09-05 14:50:27 +03:00
|
|
|
read (r :: acc)
|
|
|
|
|
with End_of_file -> List.rev acc
|
2023-09-04 21:43:28 +02:00
|
|
|
in
|
|
|
|
|
let input = read [] in
|
|
|
|
|
let output =
|
|
|
|
|
if cmd#get_mode = `Eval then Language.eval prog input
|
|
|
|
|
else SM.run (SM.compile cmd prog) input
|
|
|
|
|
in
|
|
|
|
|
List.iter (fun i -> Printf.printf "%d\n" i) output)
|
|
|
|
|
| `Fail er ->
|
|
|
|
|
Printf.eprintf "Error: %s\n" er;
|
|
|
|
|
exit 255
|
2020-02-16 01:21:27 +03:00
|
|
|
with
|
2023-09-04 21:43:28 +02:00
|
|
|
| Language.Semantic_error msg ->
|
|
|
|
|
Printf.printf "Error: %s\n" msg;
|
|
|
|
|
exit 255
|
|
|
|
|
| Commandline_error msg ->
|
|
|
|
|
Printf.printf "%s\n" msg;
|
|
|
|
|
exit 255
|