pga.ml 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. open Types
  2. open Stringify
  3. let main () =
  4. let usage status =
  5. prerr_endline ("usage: " ^ Sys.argv.(0) ^ " command [args]");
  6. prerr_endline "command:";
  7. prerr_endline " help show this help page";
  8. prerr_endline " echo TERM pretty-print a program";
  9. prerr_endline " norm TERM get the norm of a program";
  10. prerr_endline " i TERM get the ith instruction of a program";
  11. prerr_endline " dot TERM generate Dot code for a flow graph";
  12. prerr_endline "input program syntax:";
  13. prerr_endline " - write star (*) instead of omega sign";
  14. prerr_endline " - write dollar sign ($) instead of pound sign";
  15. prerr_endline "";
  16. prerr_endline "A TERM argument may also be omitted and passed on stdin";
  17. prerr_endline "instead for convenient use of UNIX pipes, e.g.:";
  18. prerr_endline "$ ./pga echo 'a;b;(c)*' | ./pga dot | dot -T png | display";
  19. exit status
  20. in
  21. let argc = Array.length Sys.argv in
  22. if argc = 1 then usage 1;
  23. let input_term i =
  24. let lexbuf =
  25. if argc > i
  26. then Lexing.from_string Sys.argv.(i)
  27. else Lexing.from_channel stdin
  28. in
  29. Parse.parse_with_error lexbuf
  30. in
  31. begin
  32. try
  33. match Sys.argv.(1) with
  34. | "help" ->
  35. usage 0
  36. | "echo" ->
  37. print_endline (string_of_program (input_term 2))
  38. | "norm" | "i" | "dot" ->
  39. raise (Failure "not implemented")
  40. | _ ->
  41. usage 1
  42. with
  43. | FatalError msg ->
  44. prerr_endline msg;
  45. exit 1
  46. end;
  47. exit 0
  48. let () = main ()