2.7 Indexer le fichier

(* impératif *)
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
  and en_scene = ref false in
  let process_scene () =
    (* 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
  in
  try
    while true do
      let ligne = input_line in_chan in
      if chaine_au_debut "Scène" ligne
      then 
  	begin
	  process_scene ();
	  incr scene_nr;
	  en_scene := true
	end
      else if chaine_au_debut "ACTE" ligne
      then
	begin
	  process_scene ();
	  scene_nr := 0;
	  incr acte_nr;
	  en_scene := false
	end
      else if chaine_au_debut "FIN" ligne
      then raise End_of_file
      else if !en_scene then
	begin
	  Buffer.add_string buffer ligne;
	  Buffer.add_char buffer '\n'
	end
      else () (* en dehors d'une scène *)
    done;
    failwith "I should not be here"
  with
    End_of_file ->
      begin
        process_scene();
	close_in in_chan;
        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.