All pastes #816725 Raw Edit

Anonymous

public text v1 · immutable
·published 2007-12-14 22:58 UTC
rendered paste body
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 ""