@@ -53,6 +53,7 @@ namespace FPL {
5353 std::cerr << " La fonction a des parametres, vous devez obligatoirement leur donner une valeur." << std::endl;
5454 }
5555 }
56+
5657 if (!fonction.FonctionContent .empty ()) {
5758 std::string finalContent;
5859 for (auto const &a : fonction.FonctionContent ) {
@@ -64,8 +65,19 @@ namespace FPL {
6465
6566 auto FCurrToken = tokens.begin ();
6667 auto oldCurrentToken = mCurrentToken ;
67- parse (tokens);
68+ parse (tokens, " fonction " );
6869 mCurrentToken = oldCurrentToken;
70+
71+ std::vector<std::string> toErase;
72+ for (auto var: mVariables ) {
73+ if (var.second .InFonction && !var.second .IsGlobal ) {
74+ toErase.push_back (var.first );
75+ }
76+ }
77+ for (auto it: toErase)
78+ {
79+ mVariables .erase (it);
80+ }
6981 return true ;
7082 }
7183 }
@@ -145,7 +157,7 @@ namespace FPL {
145157 return false ;
146158 }
147159
148- bool Parser::VariableInstruction () {
160+ bool Parser::VariableInstruction (std::optional<std::string> argument ) {
149161 auto VarType = CheckerType ();
150162 if (VarType.has_value ()) {
151163 auto VarName = CheckerIdentifiant ();
@@ -170,107 +182,85 @@ namespace FPL {
170182 if (VarValue.has_value ()) {
171183 std::cout << VarValue->StatementName << std::endl;
172184 }
185+
173186 if (CheckerOperateur (" ;" ).has_value ()) {
187+ VariableDefinition variable;
188+ variable.VariableName = VarName->mText ;
189+ variable.VariableType = Type (VarType->mName , VarType->mType );
190+ variable.IsGlobal = false ;
191+ variable.InFonction = false ;
192+ if (argument == " fonction" ) {
193+ variable.InFonction = true ;
194+ }
195+
174196 if (VarType->mType == INT) {
175197 int v;
176198 std::cin >> v;
177- VariableDefinition variable;
178- variable.VariableName = VarName->mText ;
179- variable.VariableType = Type (VarType->mName , VarType->mType );
180- variable.IsGlobal = false ;
181- variable.InFonction = false ;
182199 variable.VariableValue = std::to_string (v);
183-
184200 mVariables [variable.VariableName ] = variable;
185- return true ;
186201 } else if (VarType->mType == DOUBLE) {
187202 double v;
188203 std::cin >> v;
189- VariableDefinition variable;
190- variable.VariableName = VarName->mText ;
191- variable.VariableType = Type (VarType->mName , VarType->mType );
192- variable.IsGlobal = false ;
193- variable.InFonction = false ;
194204 variable.VariableValue = std::to_string (v);
195-
196205 mVariables [variable.VariableName ] = variable;
197- return true ;
198206 } else if (VarType->mType == STRING) {
199-
200207 std::string v;
201208 std::cin >> v;
202- VariableDefinition variable;
203- variable.VariableName = VarName->mText ;
204- variable.VariableType = Type (VarType->mName , VarType->mType );
205- variable.IsGlobal = false ;
206- variable.InFonction = false ;
207209 variable.VariableValue = v;
208-
209210 mVariables [variable.VariableName ] = variable;
210- return true ;
211- } else {
212- std::cerr << " Le type est inexistant en F.P.L." << std::endl;
213211 }
212+ return true ;
214213 } else {
215- std::cerr << " Merci de signifier la fin de la déclaration de la variable avec ';'." << std::endl;
214+ std::cerr << " Merci de signifier la fin de la declaration de la variable avec ';'." << std::endl;
216215 }
217216 } else {
218217 std::cerr << " Vous devez utiliser les symboles '->' pour donner une valeur." << std::endl;
219218 }
220219 } else {
221220 if (CheckerOperateur (" ;" ).has_value ()) {
221+ VariableDefinition variable;
222+ variable.VariableName = VarName->mText ;
223+ variable.VariableType = Type (VarType->mName , VarType->mType );
224+ variable.IsGlobal = false ;
225+ variable.InFonction = false ;
226+ if (argument == " fonction" ) {
227+ variable.InFonction = true ;
228+ }
229+
222230 if (VarType->mType == INT) {
223231 int v;
224232 std::cin >> v;
225- VariableDefinition variable;
226- variable.VariableName = VarName->mText ;
227- variable.VariableType = Type (VarType->mName , VarType->mType );
228- variable.IsGlobal = false ;
229- variable.InFonction = false ;
230233 variable.VariableValue = std::to_string (v);
231234
232235 mVariables [variable.VariableName ] = variable;
233- return true ;
234236 } else if (VarType->mType == DOUBLE) {
235237 double v;
236238 std::cin >> v;
237- VariableDefinition variable;
238- variable.VariableName = VarName->mText ;
239- variable.VariableType = Type (VarType->mName , VarType->mType );
240- variable.IsGlobal = false ;
241- variable.InFonction = false ;
242239 variable.VariableValue = std::to_string (v);
243240
244241 mVariables [variable.VariableName ] = variable;
245- return true ;
246242 } else if (VarType->mType == STRING) {
247243 std::string v;
248244 std::cin >> v;
249- VariableDefinition variable;
250- variable.VariableName = VarName->mText ;
251- variable.VariableType = Type (VarType->mName , VarType->mType );
252- variable.IsGlobal = false ;
253- variable.InFonction = false ;
254245 variable.VariableValue = v;
255-
256246 mVariables [variable.VariableName ] = variable;
257- return true ;
258- } else {
259- std::cerr << " Le type est inexistant en F.P.L." << std::endl;
260247 }
248+ return true ;
261249 } else {
262- std::cerr << " Vous devez utiliser les symboles '->' pour donner une valeur ." << std::endl;
250+ std::cerr << " Merci de signifier la fin de la declaration de la variable avec ';' ." << std::endl;
263251 }
264252 }
265253 } else {
266254 std::cerr << " Vous devez indiquer un nom à la variable." << std::endl;
267255 }
268- } else {
269- if (CheckerOperateur (" -" ).has_value ()) {
270- if (CheckerOperateur (" >" ).has_value ()) {
271- auto VarValue = CheckerValue ();
272- if (VarValue.has_value ()) {
273- if (VarValue->StatementType .mType == VarType->mType ) {
256+ }
257+ else if (VarName->mText == " globale" ) {
258+ VarName = CheckerIdentifiant ();
259+ if (VarName.has_value ()) {
260+ if (CheckerOperateur (" -" ).has_value ()) {
261+ if (CheckerOperateur (" >" ).has_value ()) {
262+ auto VarValue = CheckerValue ();
263+ if (VarValue.has_value ()) {
274264 if (CheckerOperateur (" ;" ).has_value ()) {
275265 VariableDefinition variable;
276266 variable.VariableName = VarName->mText ;
@@ -279,18 +269,61 @@ namespace FPL {
279269 } else {
280270 variable.VariableType = Type (VarType->mName , VarType->mType );
281271 }
282- variable.IsGlobal = false ;
272+ variable.IsGlobal = true ;
283273 variable.InFonction = false ;
274+ if (argument == " fonction" ) {
275+ variable.InFonction = true ;
276+ }
277+ if (VarValue->StatementType .mType == STRING) {
278+ std::replace (VarValue->StatementName .begin (), VarValue->StatementName .end (), ' "' , ' ' );
279+ }
284280 variable.VariableValue = VarValue->StatementName ;
285281
286282 mVariables [variable.VariableName ] = variable;
287283
288284 return true ;
285+ }
286+ } else {
287+ std::cerr << " Vous devez donner une valeur à votre variable." << std::endl;
288+ }
289+ } else {
290+ std::cerr << " Vous devez utiliser les symboles '->' pour donner une valeur." << std::endl;
291+ }
292+ } else {
293+ std::cerr << " Vous devez utiliser les symboles '->' pour donner une valeur." << std::endl;
294+ }
295+ } else {
296+ std::cerr << " Vous devez indiquer un nom à la variable." << std::endl;
297+ }
298+ }
299+ else {
300+ if (CheckerOperateur (" -" ).has_value ()) {
301+ if (CheckerOperateur (" >" ).has_value ()) {
302+ auto VarValue = CheckerValue ();
303+ if (VarValue.has_value ()) {
304+ if (CheckerOperateur (" ;" ).has_value ()) {
305+ VariableDefinition variable;
306+ variable.VariableName = VarName->mText ;
307+ if (VarType->mType == AUTO) {
308+ variable.VariableType = Type (VarValue->StatementType .mName , VarValue->StatementType .mType );
289309 } else {
290- std::cerr << " Merci de signifier la fin de la declaration de la variable avec ';'." << std::endl;
310+ variable.VariableType = Type (VarType->mName , VarType->mType );
311+ }
312+ variable.IsGlobal = false ;
313+ variable.InFonction = false ;
314+ if (argument == " fonction" ) {
315+ variable.InFonction = true ;
316+ }
317+ if (VarValue->StatementType .mType == STRING) {
318+ std::replace (VarValue->StatementName .begin (), VarValue->StatementName .end (), ' "' , ' ' );
291319 }
320+ variable.VariableValue = VarValue->StatementName ;
321+
322+ mVariables [variable.VariableName ] = variable;
323+
324+ return true ;
292325 } else {
293- std::cerr << " Vous devez donner une valeur qui est de même type que la variable." << std::endl;
326+ std::cerr << " Merci de signifier la fin de la declaration de la variable avec ';' ." << std::endl;
294327 }
295328 } else if (CheckerIdentifiant ().has_value ()) {
296329 --mCurrentToken ;
@@ -303,6 +336,11 @@ namespace FPL {
303336 VariableDefinition variable;
304337 variable.VariableName = VarName->mText ;
305338 variable.VariableType = Type (VarType->mName , VarType->mType );
339+ variable.IsGlobal = false ;
340+ variable.InFonction = false ;
341+ if (argument == " fonction" ) {
342+ variable.InFonction = true ;
343+ }
306344 variable.VariableValue = OldVariable.VariableValue ;
307345
308346 mVariables [variable.VariableName ] = variable;
@@ -352,6 +390,21 @@ namespace FPL {
352390 std::cerr << " Veuillez donner une valeur en rapport avec le type de la variable." << std::endl;
353391 }
354392 } else {
393+ auto PossibleVar = CheckerIdentifiant ();
394+ if (PossibleVar.has_value ()) {
395+ if (CheckerOperateur (" ;" ).has_value ()) {
396+ if (isVariable (PossibleVar->mText )) {
397+ if (mVariables [PossibleVar->mText ].VariableType .mType == mVariables [VarName->mText ].VariableType .mType ) {
398+ mVariables [VarName->mText ].VariableValue = mVariables [PossibleVar->mText ].VariableValue ;
399+ return true ;
400+ } else {
401+ std::cerr << " Le type de la variable n'est pas le même que celui de la variable que vous voulez modifier." << std::endl;
402+ }
403+ } else {
404+ std::cerr << " La variable n'existe pas." << std::endl;
405+ }
406+ }
407+ }
355408 std::cerr << " Veuillez preciser la nouvelle valeur de la variable." << std::endl;
356409 }
357410 } else {
@@ -429,14 +482,14 @@ namespace FPL {
429482 return false ;
430483 }
431484
432- bool Parser::ManagerInstruction () {
485+ bool Parser::ManagerInstruction (std::optional<std::string> argument ) {
433486 auto parseStart = mCurrentToken ; // std::vector<Token>::iterator
434487 auto PeutEtreInstruction = CheckerIdentifiant ();
435488 if (PeutEtreInstruction.has_value ()) {
436489 if (PeutEtreInstruction->mText == " envoyer" ) {
437490 if (PrintInstruction (parseStart)) { return true ; } else { return false ; }
438491 } else if (PeutEtreInstruction->mText == " variable" ) {
439- if (VariableInstruction ()) { return true ; } else { return false ; }
492+ if (VariableInstruction (argument )) { return true ; } else { return false ; }
440493 } else if (PeutEtreInstruction->mText == " changer" ) {
441494 if (ChangerInstruction ()) { return true ; } else { return false ; }
442495 } else if (PeutEtreInstruction->mText == " definir" ) {
@@ -453,12 +506,12 @@ namespace FPL {
453506
454507
455508
456- void Parser::parse (std::vector<Token> &tokens) {
509+ void Parser::parse (std::vector<Token> &tokens, std::optional<std::string> argument ) {
457510 mEndToken = tokens.end ();
458511 mCurrentToken = tokens.begin ();
459512
460513 while (mCurrentToken != mEndToken ) { // Tant que tout le fichier n'est pas parcouru et qu'on n'a pas analysé tous les éléments.
461- if (ManagerInstruction ()) {
514+ if (ManagerInstruction (argument )) {
462515
463516 } else {
464517 if (mCurrentToken ->mText .empty () || mCurrentToken ->mType == ESPACEVIDE ) {
0 commit comments