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.