let indexer_fichier fichier = let in_chan = open_in fichier and acte_nr = ref 0 and scene_nr = ref 0 and buffer = Buffer.create 10000 and table = Hashtbl.create 1000 in let process_scene () = begin incr scene_nr; (* Printf.printf "acte %d scene %d\n" !acte_nr !scene_nr; *) decouper_mots (ajouter_dans_table table (!acte_nr, !scene_nr)) (String.lowercase (Buffer.contents buffer)); Buffer.reset buffer end in try while true do let ligne = input_line in_chan in if chaine_au_debut "Scène" ligne then process_scene () else if chaine_au_debut "ACTE" ligne then begin scene_nr := 0; incr acte_nr end else if chaine_au_debut "FIN" ligne then raise End_of_file else begin Buffer.add_string buffer ligne; Buffer.add_char buffer '\n' end done; failwith "I should not be here" with End_of_file -> begin process_scene(); table; end;;
Nous avons choisi ici un style impératif, reflétant le fait qu'une
lecture de fichiers fait des effets de bord. Nous lisons chaque ligne;
si la ligne indique un changement de scène ou d'acte, nous agissons en
conséquence en mettant à jour les compteurs; en fin de scène ou de
fichier, nous indexons les mots rencontrés dans la scène; sinon, nous
accumulons la ligne dans buffer
,
qui contient tout le texte d'une scène lu jusqu'à présent.