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 ""