1
(***********************************************************************)
5
(* Pierre Weis, projet Cristal, INRIA Rocquencourt *)
7
(* Copyright 2001 Institut National de Recherche en Informatique et *)
8
(* en Automatique. All rights reserved. This file is distributed *)
9
(* only by permission. *)
11
(***********************************************************************)
13
{ mutable dtransitions : transition array;
21
let reconna�t automate cha�ne =
22
let �tat_courant = ref automate in
24
for i = 0 to String.length cha�ne - 1 do
25
match !�tat_courant.dtransitions.(int_of_char cha�ne.[i]) with
26
| Rejet -> raise �chec
27
| Vers e -> �tat_courant := e
29
!�tat_courant.dterminal
34
type ensemble_d'�tats =
36
�l�ments : Auto.�tat list };;
38
let vide = { contenu = Ensent.vide; �l�ments = [] };;
41
match ens.�l�ments with [] -> true | _ -> false;;
43
let appartient �tat ens =
44
Ensent.appartient �tat.num�ro ens.contenu;;
47
{ contenu = Ensent.ajoute �tat.num�ro ens.contenu;
48
�l�ments = �tat :: ens.�l�ments };;
50
let rec ajoute_fermeture �tat ferm =
51
if appartient �tat ferm then ferm else
52
List.fold_right ajoute_fermeture
53
�tat.epsilon_transitions (ajoute �tat ferm);;
55
let fermeture �tat = ajoute_fermeture �tat vide;;
57
let fermeture_ens ens = List.fold_right ajoute_fermeture ens.�l�ments vide;;
59
let d�placements liste_�tats =
60
let t = Array.make 256 vide in
64
(function (car, dest) ->
65
let i = int_of_char car in t.(i) <- ajoute dest t.(i))
70
let d�terminise �tat_initial =
71
let �tats_connus = Hashtbl.create 51
72
and �_remplir = Stack.create () in
74
try Hashtbl.find �tats_connus ens.contenu
77
{ dterminal = List.exists (function n -> n.terminal) ens.�l�ments;
78
dtransitions = Array.make 256 Rejet } in
79
Hashtbl.add �tats_connus ens.contenu nouvel_�tat;
80
Stack.push (ens.�l�ments, nouvel_�tat) �_remplir;
82
let nouvel_�tat_initial =
83
traduire (fermeture �tat_initial) in
86
let (liste, nouvel_�tat) = Stack.pop �_remplir in
87
let d�pl = d�placements liste in
89
if not (est_vide d�pl.(i)) then
90
nouvel_�tat.dtransitions.(i) <-
91
Vers(traduire (fermeture_ens d�pl.(i)))
94
with Stack.Empty -> ()