2022-01-24 18:18:27 +01:00

70 lines
2.2 KiB
OCaml

open Expr
open Affichage
(* "incantations" qu'il n'est pas nécessaire de comprendre dans un premier
temps : on récupère l'entrée, dans un fichier ou sur le clavier *)
let nom_fichier = ref ""
let recupere_entree () =
Arg.parse [] (fun s -> nom_fichier := s) "";
try
let where_from = match !nom_fichier with
| "" -> stdin
| s -> open_in s in
let lexbuf = Lexing.from_channel where_from in
let parse () = Parser.main Lexer.token lexbuf in
parse ()
with e -> (Printf.printf "problème de saisie\n"; raise e)
(* mettre à true et recompiler si l'on veut voir l'exécution pas à pas de l'automate *)
let trace = ref false
let _ = Stdlib.Parsing.set_trace !trace
let rec affiche_printexpr e env = begin
match e with
| Add(e1,e2) -> affiche_printexpr e1 env;affiche_printexpr e2 env
| Mul(e1,e2) -> affiche_printexpr e1 env;affiche_printexpr e2 env
| Min(e1,e2) -> affiche_printexpr e1 env;affiche_printexpr e2 env
| Eq(e1,e2) -> affiche_printexpr e1 env;affiche_printexpr e2 env
| Gt(e1,e2) -> affiche_printexpr e1 env;affiche_printexpr e2 env
| Lt(e1,e2) -> affiche_printexpr e1 env;affiche_printexpr e2 env
| Gte(e1,e2) -> affiche_printexpr e1 env;affiche_printexpr e2 env
| Lte(e1,e2) -> affiche_printexpr e1 env;affiche_printexpr e2 env
| Band(e1,e2) -> affiche_printexpr e1 env;affiche_printexpr e2 env
| Bor(e1,e2) -> affiche_printexpr e1 env;affiche_printexpr e2 env
| ITE(ec,e1,e2) -> affiche_printexpr ec env;affiche_printexpr e1 env;affiche_printexpr e2 env
| _ -> ()
end;
begin
match e with
| PrInt e -> (match (eval e env) with
| VInt(k) -> print_int k;print_newline ()
| _ -> raise InvalidTypeException)
| _ -> ()
end
(* le traitement d'une expression en entrée *)
let execute e =
begin
affiche_expr e;
print_newline();
affiche_printexpr e Expr.empty_env;
print_newline();
let v = Expr.eval e Expr.empty_env in
affiche_val v;
print_newline()
end
(* la boucle principale *)
let calc () =
try
let saisie = recupere_entree () in
execute saisie; flush stdout
with e -> raise e
let _ = calc()