(*Fichier exemple pour le tp 4 de LP2, 2006/2007*) (*Mars 2007*) (*pour évaluer, juste utiliser la ligne suivante :*) (* #load "camlp4o.cma" *) (*pour compiler, utiliser les deux lignes suivantes:*) (* ocamlc -pp "camlp4o pa_extend.cmo" -I +camlp4 -c exparsing.ml *) (* ocamlc exparsing.cmo -o exparsging *) open Format (*pour utiliser printf*) (*Exercice 1 : jouons avec les flots*) let joli_flot_de_characteres = Stream.of_string "taratata" (* val joli_flot_de_characteres : char Stream.t = *) let majuscules_de_flux flot = let deca = Char.code 'a' - Char.code 'A' in let resu = ref (String.create 0) in Stream.iter (fun el -> resu := (!resu)^(String.make 1(Char.chr (Char.code el - 32))); ) flot; !resu (* val majuscules_de_flux : char Stream.t -> string = *) let s = majuscules_de_flux joli_flot_de_characteres let deuz = majuscules_de_flux joli_flot_de_characteres (*ahah, le flot est vide !*) (*exemple de parseur simple*) let rec integer accu = parser | [< ' (('0'..'9') as c);stream >] -> integer (10*accu + (Char.code c - Char.code '0')) stream | [<>] -> accu (* val integer : int -> char Stream.t -> int = *) let toto = (integer 0 [< ''4'; ''2' >]) (* val toto : int = 42 *) (* exemple de consommation de flot par l'intérieur *) (*particulierement utilise lorsqu'on a une grammaire récursive...*) let rec list_of_stream = parser | [< 'x; l = list_of_stream >] -> x :: l | [< >] -> [] (* val list_of_stream : 'a Stream.t -> 'a list = *) (*cette définition est équivalente à la suivante, plus facile !*) (* let rec list_of_stream = parser *) (* | [< 'x; u >] -> x :: (list_of_stream u) *) (* | [< >] -> [] *) let _ = ( if (integer 0 [< ''4'; ''2' >])=42 then print_string "ouioui" else print_string "nonnon"; print_newline(); print_string s; print_newline(); printf "fin du programme"; print_newline(); )