home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-06-01 | 1.6 KB | 50 lines | [TEXT/MPS ] |
- #open "expr";;
-
- let compteur_d'états = ref 0;;
-
- let nouvel_état () =
- incr compteur_d'états;
- { transitions = []; epsilon_transitions = [];
- terminal = false; numéro = !compteur_d'états };;
-
- let ajoute_trans n1 c n2 =
- n1.transitions <- (c, n2) :: n1.transitions;;
-
- let ajoute_eps_trans n1 n2 =
- n1.epsilon_transitions <- n2 :: n1.epsilon_transitions;;
-
- type automate_de_thompson =
- { initial : état;
- final : état };;
-
- let rec thompson = function
- Epsilon ->
- let e1 = nouvel_état() and e2 = nouvel_état() in
- ajoute_eps_trans e1 e2;
- {initial = e1; final = e2}
- | Caractères cl ->
- let e1 = nouvel_état() and e2 = nouvel_état() in
- do_list (function c -> ajoute_trans e1 c e2) cl;
- {initial = e1; final = e2}
- | Alternative(r1, r2) ->
- let t1 = thompson r1 and t2 = thompson r2 in
- let e1 = nouvel_état() and e2 = nouvel_état() in
- ajoute_eps_trans e1 t1.initial; ajoute_eps_trans e1 t2.initial;
- ajoute_eps_trans t1.final e2; ajoute_eps_trans t2.final e2;
- {initial = e1; final = e2}
- | Séquence(r1, r2) ->
- let t1 = thompson r1 and t2 = thompson r2 in
- ajoute_eps_trans t1.final t2.initial;
- {initial = t1.initial; final = t2.final}
- | Répétition r ->
- let t = thompson r in
- let e1 = nouvel_état() and e2 = nouvel_état() in
- ajoute_eps_trans t.final t.initial;
- ajoute_eps_trans e1 t.initial;
- ajoute_eps_trans t.final e2;
- ajoute_eps_trans e1 e2;
- {initial = e1; final = e2};;
-
- let expr_vers_automate r =
- let t = thompson r in t.final.terminal <- true; t.initial;;
-