70 lines
2.2 KiB
OCaml
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()
|