@@ -45,16 +45,28 @@ namespace FPL {
4545 }
4646 }
4747
48- void Parser::DefineVariable (std::optional<FonctionDefinition>& fonction, std::string& VarName, Type& VarType, std::string& VarValue) {
48+ void Parser::DefineVariable (std::optional<FonctionDefinition>& fonction, std::string& VarName, Type& VarType, std::string& VarValue, std::optional<Statement>& ContentVarValue, bool isGlobal, bool HasReturnV ) {
4949 VariableDefinition variable;
5050 variable.VariableName = VarName;
51- variable.VariableType = Type (VarType.mName , VarType.mType );
52- variable.IsGlobal = false ;
53- variable.HasReturnValue = false ;
51+ if (ContentVarValue.has_value () && ContentVarValue->StatementType .mType != AUTO) {
52+ variable.VariableType = Type (VarType.mName , VarType.mType );
53+ } else {
54+ if (ContentVarValue.has_value () && VarType.mType != ContentVarValue->StatementType .mType ) {
55+ std::cerr << " Vous devez donner une valeur a la variable qui correspond au type." << std::endl;
56+ exit (1 );
57+ }
58+
59+ variable.VariableType = Type (ContentVarValue->StatementType .mName , ContentVarValue->StatementType .mType );
60+ }
61+ variable.IsGlobal = isGlobal;
62+ variable.HasReturnValue = HasReturnV;
5463 variable.InFonction = false ;
5564 if (fonction.has_value ()) {
5665 variable.InFonction = true ;
5766 }
67+ if (ContentVarValue.has_value () && ContentVarValue->StatementType .mType == STRING) {
68+ std::replace (ContentVarValue->StatementName .begin (), ContentVarValue->StatementName .end (), ' "' , ' ' );
69+ }
5870 variable.VariableValue = VarValue;
5971 mVariables [variable.VariableName ] = variable;
6072 }
@@ -331,30 +343,7 @@ namespace FPL {
331343 auto VarValue = CheckerValue ();
332344 if (VarValue.has_value ()) {
333345 if (CheckerOperateur (" ;" ).has_value ()) {
334- VariableDefinition variable;
335- variable.VariableName = VarName->mText ;
336- if (VarType->mType == AUTO) {
337- variable.VariableType = Type (VarValue->StatementType .mName , VarValue->StatementType .mType );
338- } else {
339- if (VarType->mType != VarValue->StatementType .mType ) {
340- std::cerr << " Vous devez donner une valeur a la variable qui correspond au type." << std::endl;
341- exit (1 );
342- }
343-
344- variable.VariableType = Type (VarType->mName , VarType->mType );
345- }
346- variable.IsGlobal = true ;
347- variable.HasReturnValue = false ;
348- variable.InFonction = false ;
349- if (fonction.has_value () || fonction != std::nullopt ) {
350- variable.InFonction = true ;
351- }
352- if (VarValue->StatementType .mType == STRING) {
353- std::replace (VarValue->StatementName .begin (), VarValue->StatementName .end (), ' "' , ' ' );
354- }
355- variable.VariableValue = VarValue->StatementName ;
356-
357- mVariables [variable.VariableName ] = variable;
346+ DefineVariable (fonction, VarName->mText , VarType.value (), VarValue->StatementName , VarValue, true , false );
358347 return true ;
359348 }
360349 } else {
@@ -452,33 +441,13 @@ namespace FPL {
452441
453442 executeFonctionContent (f, PossibleFonction->mText );
454443
455- VariableDefinition variable;
456- variable.VariableName = VarName->mText ;
457- variable.VariableValue = f.ReturnValue ;
458- variable.VariableType = Type (f.ReturnType .mName , f.ReturnType .mType );
459- variable.IsGlobal = false ;
460- variable.InFonction = false ;
461- variable.HasReturnValue = true ;
462- if (fonction != std::nullopt ) {
463- variable.InFonction = true ;
464- }
465- mVariables [variable.VariableName ] = variable;
444+ DefineVariable (fonction, VarName->mText , VarType.value (), f.ReturnValue , (std::optional<Statement> &) std::nullopt , false , true );
466445 return true ;
467446 } else if (isVariable (PossibleFonction->mText )) {
468447 VariableDefinition var = mVariables [PossibleFonction->mText ];
469448 if (var.HasReturnValue ) {
470449 if (CheckerOperateur (" ;" ).has_value ()) {
471- VariableDefinition variable;
472- variable.VariableName = VarName->mText ;
473- variable.VariableValue = var.VariableValue ;
474- variable.VariableType = Type (var.VariableType .mName , var.VariableType .mType );
475- variable.IsGlobal = false ;
476- variable.InFonction = false ;
477- variable.HasReturnValue = true ;
478- if (fonction != std::nullopt ) {
479- variable.InFonction = true ;
480- }
481- mVariables [variable.VariableName ] = variable;
450+ DefineVariable (fonction, VarName->mText , VarType.value (), var.VariableValue , (std::optional<Statement> &) std::nullopt , false , true );
482451 return true ;
483452 } else {
484453 std::cerr << " Vous devez mettre le symbole ';' pour mettre fin a l'instruction." << std::endl;
@@ -514,25 +483,7 @@ namespace FPL {
514483 auto VarValue = CheckerValue ();
515484 if (VarValue.has_value ()) {
516485 if (CheckerOperateur (" ;" ).has_value ()) {
517- VariableDefinition variable;
518- variable.VariableName = VarName->mText ;
519- if (VarType->mType == AUTO) {
520- variable.VariableType = Type (VarValue->StatementType .mName , VarValue->StatementType .mType );
521- } else {
522- variable.VariableType = Type (VarType->mName , VarType->mType );
523- }
524- variable.IsGlobal = false ;
525- variable.HasReturnValue = false ;
526- variable.InFonction = false ;
527- if (fonction.has_value () || fonction != std::nullopt ) {
528- variable.InFonction = true ;
529- }
530- if (VarValue->StatementType .mType == STRING) {
531- std::replace (VarValue->StatementName .begin (), VarValue->StatementName .end (), ' "' , ' ' );
532- }
533- variable.VariableValue = VarValue->StatementName ;
534-
535- mVariables [variable.VariableName ] = variable;
486+ DefineVariable (fonction, VarName->mText , VarType.value (), VarValue->StatementName , VarValue, false , false );
536487 return true ;
537488 } else {
538489 std::cerr << " Merci de signifier la fin de la declaration de la variable avec ';'." << std::endl;
@@ -546,24 +497,29 @@ namespace FPL {
546497 if (isVariable (PossibleVariable->mText )) {
547498 auto OldVariable = mVariables [PossibleVariable->mText ];
548499 if (OldVariable.VariableType .mType == VarType->mType ) {
549- VariableDefinition variable;
550- variable.VariableName = VarName->mText ;
551- variable.VariableType = Type (VarType->mName , VarType->mType );
552- variable.IsGlobal = false ;
553- variable.HasReturnValue = false ;
554- variable.InFonction = false ;
555- if (fonction.has_value () || fonction != std::nullopt ) {
556- variable.InFonction = true ;
557- }
558- variable.VariableValue = OldVariable.VariableValue ;
559-
560- mVariables [variable.VariableName ] = variable;
500+ DefineVariable (fonction, VarName->mText , VarType.value (), OldVariable.VariableValue , (std::optional<Statement> &) std::nullopt , false , false );
561501 return true ;
562502 } else {
503+ if (VarType->mType == AUTO) {
504+ VariableDefinition variable;
505+ variable.VariableName = VarName->mText ;
506+ variable.VariableType = Type (OldVariable.VariableType .mName , OldVariable.VariableType .mType );
507+ variable.IsGlobal = false ;
508+ variable.HasReturnValue = false ;
509+ variable.InFonction = false ;
510+ if (fonction.has_value () || fonction != std::nullopt ) {
511+ variable.InFonction = true ;
512+ }
513+ variable.VariableValue = OldVariable.VariableValue ;
514+
515+ mVariables [variable.VariableName ] = variable;
516+ return true ;
517+ }
518+
563519 std::cerr << " Vous devez donner une valeur a la variable qui correspond au type." << std::endl;
564520 exit (1 );
565521 }
566- } else if (fonction != std:: nullopt && isArgument (fonction->FonctionName , PossibleVariable->mText )) {
522+ } else if (fonction. has_value () && isArgument (fonction->FonctionName , PossibleVariable->mText )) {
567523 VariableDefinition variable;
568524 variable.VariableName = VarName->mText ;
569525 variable.IsGlobal = false ;
@@ -641,30 +597,21 @@ namespace FPL {
641597 }
642598
643599 if (CheckerOperateur (" ;" ).has_value ()) {
644- VariableDefinition variable;
645- variable.VariableName = VarName;
646- variable.VariableType = Type (VarType.mName , VarType.mType );
647- variable.IsGlobal = false ;
648- variable.HasReturnValue = false ;
649- variable.InFonction = false ;
650- if (fonction.has_value ()) {
651- variable.InFonction = true ;
652- }
653-
600+ std::string finalv;
654601 if (VarType.mType == INT) {
655602 int v;
656603 std::cin >> v;
657- variable. VariableValue = std::to_string (v);
604+ finalv = std::to_string (v);
658605 } else if (VarType.mType == DOUBLE) {
659606 double v;
660607 std::cin >> v;
661- variable. VariableValue = std::to_string (v);
608+ finalv = std::to_string (v);
662609 } else if (VarType.mType == STRING) {
663610 std::string v;
664611 std::cin >> v;
665- variable. VariableValue = v;
612+ finalv = v;
666613 }
667- mVariables [variable. VariableName ] = variable ;
614+ DefineVariable (fonction, VarName, VarType, finalv, (std::optional<Statement> &) std:: nullopt , false , false ) ;
668615 return true ;
669616 } else {
670617 std::cerr << " Merci de signifier la fin de la declaration de la variable avec ';'." << std::endl;
@@ -870,8 +817,7 @@ namespace FPL {
870817 if (FonctionInstruction (parseStart)) {return true ;} else {return false ;}
871818 } else if (PeutEtreInstruction->mText == " appeler" ) {
872819 if (AppelerInstruction ()) { return true ; } else {return false ;}
873- }
874- else if (PeutEtreInstruction->mText == " saisir" ) {
820+ } else if (PeutEtreInstruction->mText == " saisir" ) {
875821 if (SaisirInstruction (fonction)) { return true ; } else { return false ; }
876822 }
877823 else {
0 commit comments