let _ =
let rPretty = ref false and rUsat = ref true and rFile = ref "" in
let rec load_file ff =
if (!rFile = "") then
(rFile := ff;) else
raise (BadArgs "L'option fichier a ete utilisee deux fois !")
and aPretty = ("-pretty", Arg.Set(rPretty), " provoque l'affichage de la sortie du niveau 1 (pretty printing) pour chaque expression entrée.")
and aUsat = ("-usat", Arg.Clear(rUsat), " désactive le calcul de la satisfiabilité et l'affichage de la réponse.")
and aFile = ("-file", Arg.String(load_file), " lit les expressions dans le fichier fichier fournit en paramètre plutôt que sur l’entrée standard.")
and aHelp = ("-help", Arg.Unit(showHelp), " affiche l'aide de votre programme!.")
and aHelp2 = ("--help", Arg.Unit(showHelp), " affiche l'aide de votre programme.")
and msgMain = "Calcule la satisfiabilite d'une expression booleenne. Fait par Vincent LECHEMIN."
and args = [aPretty; aUsat; aFile; aHelp; aHelp2]
and showHelp () = (Arg.usage (Arg.align args) ("Usage: " ^ Sys.argv.(0) ^ " [-pretty | -usat | -file file ]
Calcule la satisfiabilite d'une expression booleenne. Fait par Vincent LECHEMIN."));exit 0;
and main _ =
try
Arg.parse (Arg.align args) (fun _ -> ()) msgMain;
(* ouverture du channel sur l'entree standard stdin *)
let lexbuf = Lexing.from_channel (match (!rFile) with
"" -> stdin
| f -> (match (Sys.file_exists f)
with true ->
open_in f
|false ->
raise
(BadArgs "File not found!"))
)
in
(* boucle sur les expressions *)
while true do
(* result contient l'arbre obtenue *)
let result = Parser.main Lexer.token lexbuf in
begin
if (!rPretty || Sys.argv.(0)="satl1") then (print_string (pretty result);print_newline(););
if (!rUsat) then
(print_string (match (satD result) with true -> "OUI" | _ -> "NON");print_newline(););
end
done
(* le lexer leve l'exception Lexer.Eof lorsque la fin de fichier est
atteinte (Ctrl D sur l'entree standard) *)
with Lexer.Eof -> exit 0
|BadArgs(s) -> prerr_string (s^"\n");exit 1;
in
main ""