(* 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.