-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMain.java
More file actions
286 lines (224 loc) · 12.7 KB
/
Copy pathMain.java
File metadata and controls
286 lines (224 loc) · 12.7 KB
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
/* ------------------------------------------------------------*
*
* PROJET DU TEST TP THEORIE DES LANGUAGES
*
* FAIT PAR:
*
* - BOUMGHAR Lina Ghizelene A2
* - LEMMOUCHI Rym A2
* - SAFAR-REMALI Zineb Farah A3
*
* LES CLASSES INCLUSES DANS LE PROJET
* SONT :
* - Main (le programme principal)
* - LanguageK (pour générer le language k)
* - LanguageKR (pour générer le language kr)
* - LanguageKN (pour générer le language kn)
* - AnalyseSyntax (pour l'analyse syntaxique)
*
* TOUT A ETE PRE-COMPILE, IL VOUS SUFFIT
* SEULEMENT D'EXECTUER LA COMMANDE :
*
* java -jar projetTHL.jar
*
* POUR EXECUTER LE PROGRAMME
*
*
*
*------------------------------------------------------------*/
import java.util.List;
import java.util.Scanner;
/* |
|
∟==> importation des deux librairies pour manipuler des listes et pouvoir lire l'input de l'utilisateur
*/
public class Main {
public static final String ANSI_RESET = "\u001B[0m";
public static final String ANSI_BLACK = "\u001B[30m";
public static final String ANSI_RED = "\u001B[31m";
public static final String ANSI_GREEN = "\u001B[32m";
public static final String ANSI_YELLOW = "\u001B[33m";
public static final String ANSI_BLUE = "\u001B[34m";
public static final String ANSI_PURPLE = "\u001B[35m";
public static final String ANSI_CYAN = "\u001B[36m";
public static final String ANSI_WHITE = "\u001B[37m";
/* |
|
∟==> codes ANSI pour changer la couleur des caractères affichés sur la console
*/
public static boolean inputEstUnEntier(String input) {
for (char c : input.toCharArray()) {
if (!Character.isDigit(c)) {
return false;
}
}
return true;
}
/* |
|
∟==> une fonction permettant de vérifier si une chaine de caractères est un entier ou non
(on l'utilisera pour pouvoir convertir l'input d'une chaine de caractères à un entier)
*/
public static void main(String[] args) {
Scanner input_k = new Scanner(System.in);
String kString;
Scanner input_n = new Scanner(System.in);
String nString;
Scanner input_choix = new Scanner(System.in);
String choix;
String motVerif;
int k;
int n;
System.out.print("\033[H\033[2J");
/* |
|
∟==> une chaine de caractères spéciale pour effacer le contenu de la console
*/
System.out.println("Ce programme permet de générer les languages Lk, Lkr et Lkn tel que : ");
System.out.println("");
System.out.println("Lk : language généré par la grammaire G<T,N,P,S> tel que : ");
System.out.println("");
System.out.println("T={a,b,c}, N={S,A}, P: S -> A/e, A -> aAaa/bbAb/c");
System.out.println("");
System.out.println("Lkr : le language mirroir de Lk");
System.out.println("");
System.out.println("Lkn : le language puissance n de Lk");
System.out.println(ANSI_YELLOW + "\nNB : le mot vide 'epsilon' est représenté par un 'e' dans les 3 opérations");
System.out.println("à part l'operation 'puissance du language', et cela pour une meilleure lecture du language généré" + ANSI_RESET);
System.out.println("----------------------------------------------");
// la boucle principale du programme pour pouvoir executer plusieurs fonctions sans quitter le programme
while(true) {
System.out.println(ANSI_CYAN + "(entrez \"x\" pour quitter le programme)" + ANSI_RESET);
System.out.println("Pour générer le language L(G) : 1");
System.out.println("Pour générer le language miroir de L(G) : 2");
System.out.println("Pour générer le language L^n(G) : 3");
System.out.println("Pour voir si un mot appartient au language L(G) : 4");
System.out.println("Quelle operation voulez vous effectuer? : ");
// on utilise une instruction switch-case pour exécuter différentes parties du code en fonction du choix de l'utilisateur.
choix = input_choix.nextLine();
switch (choix) {
//premier cas : Génération du langage Lk :
//l'utilisteur choisit la valeur k pour générer le langage Lk.
//la fonction statique genererLanguageK de la classe LanguageK
//est utilisée pour générer les mots du langage Lk en fonction de la valeur k
// en prenant en compte la condition : k >= 0
case "1":
System.out.print("\033[H\033[2J");
System.out.println(ANSI_PURPLE + "\tGENERATION DU LANGUAGE LK" + ANSI_RESET);
while(true) {
System.out.println(ANSI_GREEN + "(entrez \"x\" pour quitter)" + ANSI_RESET + " Veuillez entrer k " + ANSI_YELLOW + "-la taille maximum d'un mot de Lk-" + ANSI_RESET + " tel que k >= 0 : ");
kString = input_k.nextLine();
if(inputEstUnEntier(kString)) {
k = Integer.parseInt(kString);
if(k >= 0) {
List<String> motsLanguageK = LanguageK.genererLanguageK(k);
for (String mot : motsLanguageK) {
System.out.print(mot + " - ");
}
System.out.println("");
}
} else if (kString.equals("x")) {
System.out.print("\033[H\033[2J");
break;
}
}
break;
//deuxieme cas : Génération du langage miroir Lkr :
//L'utilisateur choisit la valeur k pour générer le langage miroir Lkr.
//la fonction statique genererLanguageKR de la classe LanguageKR est
//utilisée pour générer les mots du langage miroir Lkr en fonction de la valeur k
// en prenant en compte la condition : k >= 0
case "2":
System.out.print("\033[H\033[2J");
System.out.println(ANSI_PURPLE + "\tGENERATION DU LANGUAGE MIRROIR LKR" + ANSI_RESET);
while(true) {
System.out.println(ANSI_CYAN + "(entrez \"x\" pour quitter)"+ANSI_RESET+"\nVeuillez entrer k " + ANSI_YELLOW + "-la taille maximum d'un mot de Lkr-" + ANSI_RESET + " tel que k >= 0 : ");
kString = input_k.nextLine();
if(inputEstUnEntier(kString)) {
k = Integer.parseInt(kString);
if(k >= 0) {
List<String> motsLanguageKR = LanguageKR.genererLanguageKR(k);
for (String mot : motsLanguageKR) {
System.out.print(mot + " - ");
}
System.out.println("");
}
} else if (kString.equals("x")) {
System.out.print("\033[H\033[2J");
break;
}
}
break;
//troisieme cas: Génération du langage puissance Lkn :
//L'utilisateur choisit les valeurs k et n pour générer le langage puissance Lkn.
//la fonction statique genererLanguageKN de la classe LanguageKN est utilisée pour
//générer les mots du langage puissance Lkn en fonction des valeurs k et n
// en prenant en compte les conditions : k >= 0 et n >= 0
case "3":
System.out.print("\033[H\033[2J");
System.out.println(ANSI_PURPLE + "\tGENERATION DU LANGUAGE PUISSANCE LKN" + ANSI_RESET);
while(true) {
System.out.println(ANSI_CYAN + "(entrez \"x\" pour quitter)"+ ANSI_RESET+"\nVeuillez entrer k " + ANSI_YELLOW + "-la taille maximum d'un mot de Lk-" + ANSI_RESET + " tel que k >= 0 : ");
kString = input_k.nextLine();
if(kString.equals("x")) {
System.out.print("\033[H\033[2J");
break;
}
if(inputEstUnEntier(kString)) {
k = Integer.parseInt(kString);
if(k >= 0) {
System.out.println("Veuillez entrer n" + ANSI_YELLOW + " -la puissance de Lk- " + ANSI_RESET + "tel que n >= 0 : ");
nString = input_n.nextLine();
if(nString.equals("x")) {
System.out.print("\033[H\033[2J");
break;
}
if(inputEstUnEntier(nString)) {
n = Integer.parseInt(nString);
if(n >= 0 && k >= 0) {
List<String> motsLanguageKN = LanguageKN.genererLanguageKN(k, n);
System.out.println("Les mots du language Lkn: ");
for (String mot : motsLanguageKN) {
System.out.print(mot + " - ");
}
}
else {
System.out.print("\033[H\033[2J");
}
}
}
}
}
break;
//quatrieme cas : Vérification si un mot appartient au langage Lk :
//L'utilisateur entre un mot pour vérifier s'il appartient au langage Lk.
//la fonction statique analyseSyntaxique de la classe AnalyseSyntax est
//utilisée pour analyser syntaxiquement le mot et déterminer s'il appartient
//au langage Lk ensuite un message est affiché pour indiquer si le mot appartient ou non au langage.
case "4":
System.out.print("\033[H\033[2J");
do {
System.out.println(ANSI_CYAN + "(entrez \"x\" pour quitter)"+ANSI_RESET+"\nVeuillez entrer le mot à vérifier : ");
motVerif = input_choix.nextLine();
if(AnalyseSyntax.analyseSyntaxique(motVerif)) {
System.out.println("Ce mot" + ANSI_GREEN + " appartient" + ANSI_RESET + " au language L(G).");
} else {
System.out.println("Ce mot" + ANSI_RED + " n'appartient pas " + ANSI_RESET +"au language L(G).");
}
} while (!motVerif.contentEquals("x"));
System.out.print("\033[H\033[2J");
break;
// cas spécial pour si l'utilisateur rentre x, on quitte le programme
case "x":
input_choix.close();
input_k.close();
input_n.close();
return;
// cas où la valeur entrée par l'utilisateur n'est pas une option du programme, ce dernier affiche se message et se réexecute
default:
System.out.println(ANSI_RED + "l'option entrée n'est pas valide" + ANSI_RESET);
break;
}
}
}
}