Skip to content

Commit a73e503

Browse files
committed
Opti, Fixs.
1 parent e30005f commit a73e503

File tree

2 files changed

+45
-99
lines changed

2 files changed

+45
-99
lines changed

src/Parser.cpp

Lines changed: 44 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -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 {

src/Parser.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ namespace FPL {
4141
bool isVariable(std::string &name) const;
4242
bool executeInputs(std::optional<FonctionDefinition> &fonction, std::string& VarName, Type& VarType, std::string option);
4343
void ManageVariableName(std::optional<FonctionDefinition> &fonction, std::string name);
44-
void DefineVariable(std::optional<FonctionDefinition> &fonction, std::string &VarName, Type &VarType, std::string &VarValue);
44+
void DefineVariable(std::optional<FonctionDefinition>& fonction, std::string& VarName, Type& VarType, std::string& VarValue, std::optional<Statement>& ContentVarValue, bool isGlobal, bool HasReturnV);
4545
bool VariableInstruction(std::optional<FonctionDefinition>& fonction);
4646
bool ChangerInstruction(std::optional<FonctionDefinition>& fonction);
4747
bool SaisirInstruction(std::optional<FonctionDefinition>& fonction);

0 commit comments

Comments
 (0)