about summary refs log tree commit diff stats
path: root/modal/ocaml/app/main.ml
blob: 63ecfb968db55842a1bec68d35b5a0b20313677b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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