open Arith_type let string_of_op o = match o with | Plus -> "+" | Mult -> "*" | Moins -> "-" let rec string_of_arith a = match a with | Int i -> string_of_int i | Op (o, ((Int i) as a1) , ((Int j) as a2)) -> let s1 = string_of_arith a1 in let s2 = string_of_arith a2 in let so = string_of_op o in s1 ^ so ^ s2 | Op (o, a1 , ((Int j) as a2)) -> let s1 = string_of_arith a1 in let s2 = string_of_arith a2 in let so = string_of_op o in "(" ^s1 ^")" ^ so ^ s2 | Op (o,((Int i) as a1) , a2 ) -> let s1 = string_of_arith a1 in let s2 = string_of_arith a2 in let so = string_of_op o in s1 ^ so ^ " (" ^s2^")" | Op (o,a1,a2) -> let s1 = string_of_arith a1 in let s2 = string_of_arith a2 in let so = string_of_op o in "(" ^s1 ^") " ^ so ^ " (" ^s2^")" | Minus a1 -> let s1 = string_of_arith a1 in "-" ^ "(" ^ s1 ^ ")" let rec eval a = match a with | Int i -> i | Op (Plus,a1,a2) -> eval a1 + eval a2 | Op (Moins,a1,a2) -> eval a1 - eval a2 | Op (Mult,a1,a2) -> eval a1 * eval a2 | Minus a1 -> - (eval a1) let rec distr a = match a with | Int i -> a | Op (Mult,a1,Op(Plus,a2,a3)) -> Op(Plus,Op(Mult,a1,a2),Op(Mult,a1,a3)) | Op (o,a1,a2) -> Op(o,distr a1,distr a2) | Minus a1 -> Minus (distr a1) let main () = try let lexbuf = Lexing.from_channel stdin in while true do let result = Parse_arith.main Lex_arith.token lexbuf in print_string (string_of_arith result); print_newline(); let distresult = distr result in print_string (string_of_arith distresult); print_newline(); let newresult = eval result in print_int newresult; print_int (eval distresult); print_newline(); flush stdout done with Lex_arith.Eof -> exit 0;; (* Lancement de main *) Printexc.print main () (* type atom = Parg | Pard | Int of int | Plus | Moins | Mult *)