-
Notifications
You must be signed in to change notification settings - Fork 0
/
getconcat.ml
114 lines (92 loc) · 6.53 KB
/
getconcat.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
(* Le programme doit accepter les modes suivants de fonctionnement :
* genconcat <fichier> : doit afficher le programme Concat produit à partir du contenu de <fichier>.
* genconcat <fichier> <fichier> : doit créer un programme Concat à partir du contenu du premier fichier
* (contenant des lignes "input output") puis utiliser ce programme sur
* le second fichier qui ne contiendra que des lignes "input"
*)
type mode_de_fonctionnement = | Fichier_input_output | Deux_fichiers
(* Nombre de paramètres passés via la ligne de commande *)
let argc = Array.length Sys.argv
(* Le programme a 2 modes de fonctionnement *)
let mode = if argc = 2 then Fichier_input_output else Deux_fichiers
(* Verification si le nombre de paramètres passés via la ligne de commande est correct *)
let _ = if ((argc < 2) || (argc > 3)) then
begin
Printf.printf "Utilisation : %s <fichier> [<fichier>] \n%!" Sys.argv.(0) ;
Printf.printf "par exemple : %s ../exemples/etape1/date_to_month [./'Exemples pour le second fichier'/identity] \n%!" Sys.argv.(0) ;
exit 0;
end
else ()
(* ============================================================================================ *)
(* ***** VERIFICATION SI LES CHEMINS QUI NOUS ONT ÉTÉ PASSÉS REPRÉSENTENT BIEN UN FICHIER ***** *)
(* ============================================================================================ *)
let rec verification_chemins liste_chemins = match liste_chemins with
|[] -> true
|h::t -> if Sys.file_exists h then
if not (Sys.is_directory h) then
verification_chemins t
else
false
else
false
(* On n'a pas besoin du premier élément de la liste car ce n'est pas un des paramètres
que l'utilisateur a choisi de transférer au logiciel mais le nom du fichier exécutable *)
let liste_fichiers = List.tl (Array.to_list Sys.argv)
let _ = if not (verification_chemins liste_fichiers) then
begin
print_endline "Le système a detecte qu'un chemin qui lui est transfere ne mene pas a un fichier valide.";
exit 0;
end
else ()
(* ============================================================================================================ *)
(* ***** TRANSFORMER LES LISTES D'ENTRÉES (INPUTS) ET DE SORTIES (OUTPUTS) DANS LES FICHIERS , EN LISTES DE TYPE STRING LIST ***** *)
(* ============================================================================================================ *)
(* Une fonction qui reçoit en paramètre un fichier contenant une liste de inputs et renvoie une liste. Chaque cellule est l'une des entrées (inputs) *)
let input_file_to_list fichier =
let rec f liste input_channel = match input_line input_channel with
| next_line -> f (liste@[String.trim next_line]) input_channel
| exception End_of_file -> close_in input_channel ; liste
in f [] (open_in fichier)
(* Une fonction qui reçoit en paramètre un fichier contenant une liste de inputs et une liste de outputs
et renvoie un couple de listes : (input_list, output_list) *)
let input_output_file_to_lists fichier =
let rec f input_list output_list input_channel = match input_line input_channel with
| next_line -> let tmp_list = String.split_on_char '\t' (String.trim next_line) in
f (input_list@[List.nth tmp_list 0]) (output_list@[List.nth tmp_list 1]) input_channel
| exception End_of_file -> close_in input_channel ; (input_list, output_list)
in f [] [] (open_in fichier)
let input_output_lists = input_output_file_to_lists (List.nth liste_fichiers 0)
let input_list = fst input_output_lists
let output_list = snd input_output_lists
let input_list2 = match mode with
|Deux_fichiers -> input_file_to_list (List.nth liste_fichiers 1)
|_ -> []
(* ===================================================== *)
(* ***** IMPRIMER LE CONTENU DE TOUTES LES LISTES ***** *)
(* ===================================================== *)
(* Une fonction qui imprime le contenu d'une liste *)
let rec print_list liste = match liste with
|[] -> print_newline ()
|h::t -> print_endline h; print_list t
let _ = print_endline "Fichier 1 , inputs :" ; print_list input_list
let _ = print_endline "Fichier 1 , outputs :"; print_list output_list
let _ = if (List.length input_list2 > 0) then
begin
print_endline "Fichier 2 , inputs :" ;
print_list input_list2
end
else ()
let mode_fichier__input_output input_list output_list =
(* Concat.generateur_programme_apres_dijkstra str_in1 str_out1 str_in2 str_out2 *)
let pgm = Concat.generateur_programme_apres_dijkstra (List.hd input_list) (List.hd output_list) (List.nth input_list 1) (List.nth output_list 1) in
print_endline "Le programme Concat produit a partir du contenu du fichier : " ; List.iter (fun element -> print_endline element) (Concat.programme_to_string_liste pgm)
let mode_deux_fichier input_list output_list input_list2 =
(* Concat.generateur_programme_apres_dijkstra str_in1 str_out1 str_in2 str_out2 *)
let pgm = Concat.generateur_programme_apres_dijkstra (List.hd input_list) (List.hd output_list) (List.nth input_list 1) (List.nth output_list 1) in
print_endline "Fichier 2 , outputs :" ; List.iter (fun element -> print_endline (Concat.evaluation_program pgm element) ) (input_list2)
let _ = if (List.length input_list2 > 0) then
mode_deux_fichier input_list output_list input_list2
else
mode_fichier__input_output input_list output_list
(* TEST : RegularExp.ml *)
(* let _ = print_endline (RegularExp.partie_max_mot_filtrage_par_token "ocaML" (Plus Lower)) *)