blob: bd67cb494e7a1d2fefef81a1a72b871754b265c2 (
plain) (
tree)
|
|
open Ast
module Interpret = Interpret2.I
(* command line options *)
let dump = ref false
let dumprn = ref false
let test = ref false
let vtest = ref false
let ifile = ref ""
let usage = "usage: analyzer [options] file.scade"
let options = [
"--dump", Arg.Set dump, "Dump program source.";
"--dump-rn", Arg.Set dumprn, "Dump program source, after renaming.";
"--vtest", Arg.Set vtest, "Verbose testing.";
"--test", Arg.Set test, "Simple testing.";
]
let () =
Arg.parse options (fun f -> ifile := f) usage;
if !ifile = "" then begin
Format.eprintf "No input file...@.";
exit 1
end;
try
let prog = File_parser.parse_file !ifile in
if !dump then Ast_printer.print_prog Format.std_formatter prog;
let prog = Rename.rename_prog prog in
if !dumprn then Ast_printer.print_prog Format.std_formatter prog;
if !vtest then begin
let s0 = Interpret.init_state prog "test" in
Format.printf "Init state:@.";
Interpret.print_state Format.std_formatter s0;
let rec it i st =
let next_st, out =
Interpret.step st
["i", Interpret.int_value i]
in
Format.printf "@.> Step %d:@." i;
Interpret.print_state Format.std_formatter st;
Format.printf "Outputs:@.";
List.iter
(fun (k, v) -> Format.printf "%s = %s@."
k (Interpret.str_repr_of_val v))
out;
if not (Interpret.as_bool (List.assoc "exit" out)) then
it (i+1) next_st
in
it 0 s0
end;
if !test then begin
let s0 = Interpret.init_state prog "test" in
let rec it i st =
let next_st, outputs =
Interpret.step st
["i", Interpret.int_value i]
in
Format.printf "%d. %s %s %s@." i
(Interpret.str_repr_of_val (List.assoc "a" outputs))
(Interpret.str_repr_of_val (List.assoc "b" outputs))
(Interpret.str_repr_of_val (List.assoc "c" outputs));
if not (Interpret.as_bool (List.assoc "exit" outputs)) then
it (i+1) next_st
in
it 0 s0
end
with
| Util.NoLocError e -> Format.eprintf "Error: %s@." e
| Util.LocError(l, e) ->
Format.eprintf "Error: %s@." e;
List.iter
(fun loc -> Format.eprintf "At: %s@." (Ast_printer.string_of_extent loc))
l
|