module Ast = Modal.Ast module Parse = Modal.Parse module Eval = Modal.Eval module Program = Modal.Program let () = let usage = "Usage: modal [-q] [-a] [-n] RULES.modal [INPUT]" in if Array.length Sys.argv < 2 then (prerr_endline usage; exit 2); let cfg = Eval.default_config () in let rec parse_flags i = if i < Array.length Sys.argv && String.length Sys.argv.(i) > 0 && Sys.argv.(i).[0] = '-' then ( (match Sys.argv.(i) with | "-q" -> cfg.quiet <- true | "-a" -> cfg.allow_access <- true | "-n" -> cfg.cycles <- 0x7fffffff | _ -> ()); parse_flags (i + 1)) else i in let i = parse_flags 1 in if i >= Array.length Sys.argv then (prerr_endline usage; exit 2); let rules_path = Sys.argv.(i) in let input_arg = if i + 1 < Array.length Sys.argv then Some Sys.argv.(i + 1) else None in let rules, file_input = Program.load_file rules_path in let input = match input_arg with | Some s -> Parse.parse s | None -> ( match file_input with Some n -> n | None -> Ast.List []) in let result = Eval.eval ~config:cfg rules input in Format.printf "%a\n" Ast.pp result