@@ -8,168 +8,162 @@ namespace FPL {
88 mTypes [" texte" ] = Type (" texte" , STRING);
99 }
1010
11- bool Parser::FunctionChecker () {
12- auto parseStart = mCurrentToken ; // std::vector<Token>::iterator
13- auto PeutEtreInstruction = CheckerIdentifiant ();
14- if (PeutEtreInstruction.has_value ()) {
15- // On a une instruction
16- if (PeutEtreInstruction->mText == " definir" ) { // On vérifie si l'instruction est une fonction
17- auto PeutEtreNom = CheckerIdentifiant ();
18- if (PeutEtreNom.has_value ()) {
19- // On a le nom d'une fonction.
20- if (CheckerOperateur (" (" ).has_value ()) {
21- // On a surement une fonction finie !
22-
23- FonctionDefinition fonction;
24- fonction.FonctionName = PeutEtreNom->mText ;
11+ bool Parser::FunctionChecker (auto parseStart) {
12+ auto PeutEtreNom = CheckerIdentifiant ();
13+ if (PeutEtreNom.has_value ()) {
14+ // On a le nom d'une fonction.
15+ if (CheckerOperateur (" (" ).has_value ()) {
16+ // On a surement une fonction finie !
2517
26- while ( CheckerOperateur ( " ) " ) == std:: nullopt ) {
27- auto type = CheckerType () ;
18+ FonctionDefinition fonction;
19+ fonction. FonctionName = PeutEtreNom-> mText ;
2820
29- // Si aucun paramètre ou l'utilisateur a utilisé l'argument 'vide' ou juste fermer.
30- if ( type-> mType == VOID) { break ; }
21+ while ( CheckerOperateur ( " ) " ) == std:: nullopt ) {
22+ auto type = CheckerType ();
3123
32- if (!type.has_value () || type == std::nullopt ) {
33- throw std::runtime_error (" Vous devez spécifier un type d'argument." );
34- }
24+ // Si aucun paramètre ou l'utilisateur a utilisé l'argument 'vide' ou juste fermer.
25+ if (type->mType == VOID) { break ; }
3526
36- // Ajout de l'argument...
37- auto variableName = CheckerIdentifiant ();
38- if (!variableName.has_value ()) {
39- throw std::runtime_error (" Vous devez spécifier un nom unique à l'argument." );
40- }
41- ArgumentDefinition param;
42- param.ArgType .mName = type->mName ;
43- param.ArgType .mType = type->mType ;
44- param.ArgName = variableName->mText ;
45- fonction.ArgsFonction .push_back (param);
46-
47- if (CheckerOperateur (" )" ).has_value ()) {
48- break ;
49- }
50- if (!CheckerOperateur (" ," ).has_value ()) {
51- throw std::runtime_error (
52- " Vous devez utiliser la ',' pour separer les arguments de la fonction." );
53- }
54- }
27+ if (!type.has_value () || type == std::nullopt ) {
28+ throw std::runtime_error (" Vous devez spécifier un type d'argument." );
29+ }
5530
56- mFonctions [fonction.FonctionName ] = fonction;
31+ // Ajout de l'argument...
32+ auto variableName = CheckerIdentifiant ();
33+ if (!variableName.has_value ()) {
34+ throw std::runtime_error (" Vous devez spécifier un nom unique à l'argument." );
35+ }
36+ ArgumentDefinition param;
37+ param.ArgType .mName = type->mName ;
38+ param.ArgType .mType = type->mType ;
39+ param.ArgName = variableName->mText ;
40+ fonction.ArgsFonction .push_back (param);
41+
42+ if (CheckerOperateur (" )" ).has_value ()) {
43+ break ;
44+ }
45+ if (!CheckerOperateur (" ," ).has_value ()) {
46+ throw std::runtime_error (
47+ " Vous devez utiliser la ',' pour separer les arguments de la fonction." );
48+ }
49+ }
5750
58- // On récupère le code entre les {} :
51+ mFonctions [fonction. FonctionName ] = fonction;
5952
60- if (CheckerOperateur (" {" )) {
61- while (!CheckerOperateur (" }" ).has_value ()) {
62- fonction.FonctionContent .push_back (mCurrentToken ->mText );
63- ++mCurrentToken ;
53+ // On récupère le code entre les {} :
6454
65- if (CheckerOperateur (" } " ). has_value ( )) {
66- break ;
67- }
68- }
55+ if (CheckerOperateur (" { " )) {
56+ while (! CheckerOperateur ( " } " ). has_value ()) {
57+ fonction. FonctionContent . push_back ( mCurrentToken -> mText );
58+ ++ mCurrentToken ;
6959
60+ if (CheckerOperateur (" }" ).has_value ()) {
61+ break ;
7062 }
71-
72- return true ;
73- } else {
74- mCurrentToken = parseStart;
75- std::cerr
76- << " Vous devez ouvrir les parenthèses pour ajouter des paramètres si vous le souhaitez."
77- << std::endl;
7863 }
79- } else {
80- mCurrentToken = parseStart;
81- std::cerr << " Vous devez donner un nom à votre fonction." << std::endl;
64+
8265 }
66+
67+ return true ;
8368 } else {
8469 mCurrentToken = parseStart;
70+ std::cerr
71+ << " Vous devez ouvrir les parenthèses pour ajouter des paramètres si vous le souhaitez."
72+ << std::endl;
8573 }
74+ } else {
75+ mCurrentToken = parseStart;
76+ std::cerr << " Vous devez donner un nom à votre fonction." << std::endl;
8677 }
8778 return false ;
8879 }
8980
90- bool Parser::ManagerInstruction () {
91- auto parseStart = mCurrentToken ; // std::vector<Token>::iterator
92- auto PeutEtreInstruction = CheckerIdentifiant ();
93- if (PeutEtreInstruction.has_value ()) {
94- if (PeutEtreInstruction->mText == " envoyer" ) {
95- auto Value = CheckerValue ();
96- if (Value.has_value ()) {
97- if (Value->StatementType .mType == STRING) {
98- std::replace (Value->StatementName .begin (), Value->StatementName .end (), ' "' , ' ' );
99- }
100- std::cout << Value->StatementName << std::endl;
101- return true ;
102- } else {
103- mCurrentToken = parseStart;
104- ++mCurrentToken ;
105- auto value = CheckerIdentifiant ();
106- if (value.has_value ()) {
107- if (CheckerOperateur (" <" ).has_value ()) {
108- if (CheckerOperateur (" -" ).has_value ()) {
109- if (isVariable (value->mText )) {
110- std::cout << mVariables [value->mText ].VariableValue << std::endl;
81+ bool Parser::VariableInstruction (auto parseStart) {
82+ auto VarType = CheckerType ();
83+ if (VarType.has_value ()) {
84+ auto VarName = CheckerIdentifiant ();
85+ if (VarName.has_value ()) {
86+ if (CheckerOperateur (" -" ).has_value ()) {
87+ if (CheckerOperateur (" >" ).has_value ()) {
88+ auto VarValue = CheckerValue ();
89+ if (VarValue.has_value ()) {
90+ if (VarValue->StatementType .mType == VarType->mType ) {
91+ if (CheckerOperateur (" |" )) {
92+ VariableDefinition variable;
93+ variable.VariableName = VarName->mText ;
94+ variable.VariableType = Type (VarType->mName , VarType->mType );
95+ variable.VariableValue = VarValue->StatementName ;
96+
97+ mVariables [variable.VariableName ] = variable;
98+
99+ std::cout << " La variable '"
100+ << mVariables [variable.VariableName ].VariableName << " ' a pour valeur "
101+ << mVariables [variable.VariableName ].VariableValue << std::endl;
102+
111103 return true ;
112104 } else {
113- mCurrentToken = parseStart;
114- std::cerr << " La variable n'existe pas." << std::endl;
115- }
116- }
117- }
118- }
119- std::cerr << " Vous devez ouvrir les guillements pour transmettre une chaine de caractères ou le nom de votre variable sous ce format : 'envoyer (variable) <-" << std::endl;
120- return false ;
121- }
122- } else if (PeutEtreInstruction->mText == " variable" ) {
123- auto VarType = CheckerType ();
124- if (VarType.has_value ()) {
125- auto VarName = CheckerIdentifiant ();
126- if (VarName.has_value ()) {
127- if (CheckerOperateur (" -" ).has_value ()) {
128- if (CheckerOperateur (" >" ).has_value ()) {
129- auto VarValue = CheckerValue ();
130- if (VarValue.has_value ()) {
131- if (VarValue->StatementType .mType == VarType->mType ) {
132- VariableDefinition variable;
133- variable.VariableName = VarName->mText ;
134- variable.VariableType = Type (VarType->mName , VarType->mType );
135- variable.VariableValue = VarValue->StatementName ;
136-
137- if (VarType->mType == STRING) {
138- std::replace (variable.VariableValue .begin (), variable.VariableValue .end (), ' "' , ' ' );
139- }
140-
141- mVariables [variable.VariableName ] = variable;
142-
143- std::cout << " La variable '"
144- << mVariables [variable.VariableName ].VariableName << " ' a pour valeur "
145- << mVariables [variable.VariableName ].VariableValue << std::endl;
146-
147- return true ;
148- } else {
149- std::cerr << " Vous devez donner une valeur qui est de même type que la variable." << std::endl;
150- mCurrentToken = parseStart;
151- }
152- } else {
153- std::cerr << " Vous devez donner une valeur a la variable qui correspond au type." << std::endl;
154- mCurrentToken = parseStart;
105+ std::cerr << " Merci de signifier la fin de la déclaration de la variable avec '|'." << std::endl;
155106 }
156107 } else {
157- std::cerr << " Vous devez utiliser les symboles '->' pour donner une valeur à la variable." << std::endl;
158- mCurrentToken = parseStart;
108+ std::cerr << " Vous devez donner une valeur qui est de même type que la variable." << std::endl;
159109 }
160110 } else {
161- std::cerr << " Vous devez utiliser les symboles '->' pour donner une valeur à la variable." << std::endl;
162- mCurrentToken = parseStart;
111+ std::cerr << " Vous devez donner une valeur a la variable qui correspond au type." << std::endl;
163112 }
164113 } else {
165- std::cerr << " Vous devez indiquer un nom à la variable." << std::endl;
166- mCurrentToken = parseStart;
114+ std::cerr << " Vous devez utiliser les symboles '->' pour donner une valeur à la variable." << std::endl;
167115 }
168116 } else {
169- std::cerr << " Vous devez indiquer une type pour la variable." << std::endl;
170- mCurrentToken = parseStart;
117+ std::cerr << " Vous devez utiliser les symboles '->' pour donner une valeur à la variable." << std::endl;
171118 }
172119 } else {
120+ std::cerr << " Vous devez indiquer un nom à la variable." << std::endl;
121+ }
122+ }
123+ return false ;
124+ }
125+
126+ bool Parser::PrintInstruction (auto parseStart) {
127+ auto Value = CheckerValue ();
128+ if (Value.has_value ()) {
129+ if (Value->StatementType .mType == STRING) {
130+ std::replace (Value->StatementName .begin (), Value->StatementName .end (), ' "' , ' ' );
131+ }
132+ std::cout << Value->StatementName << std::endl;
133+ return true ;
134+ } else {
135+ mCurrentToken = parseStart;
136+ ++mCurrentToken ;
137+ auto value = CheckerIdentifiant ();
138+ if (value.has_value ()) {
139+ if (CheckerOperateur (" <" ).has_value ()) {
140+ if (CheckerOperateur (" -" ).has_value ()) {
141+ if (isVariable (value->mText )) {
142+ std::cout << mVariables [value->mText ].VariableValue << std::endl;
143+ return true ;
144+ } else {
145+ mCurrentToken = parseStart;
146+ std::cerr << " La variable n'existe pas." << std::endl;
147+ }
148+ }
149+ }
150+ }
151+ std::cerr << " Vous devez ouvrir les guillements pour transmettre une chaine de caractères ou le nom de votre variable sous ce format : 'envoyer (variable) <-" << std::endl;
152+ }
153+ return false ;
154+ }
155+
156+ bool Parser::ManagerInstruction () {
157+ auto parseStart = mCurrentToken ; // std::vector<Token>::iterator
158+ auto PeutEtreInstruction = CheckerIdentifiant ();
159+ if (PeutEtreInstruction.has_value ()) {
160+ if (PeutEtreInstruction->mText == " envoyer" ) {
161+ if (PrintInstruction (parseStart)) {return true ;} else {return false ;}
162+ } else if (PeutEtreInstruction->mText == " variable" ) {
163+ if (VariableInstruction (parseStart)) { return true ; } else {return false ;}
164+ } else if (PeutEtreInstruction->mText == " definir" ) {
165+ if (FunctionChecker (parseStart)) {return true ;} else {return false ;}
166+ } else {
173167 mCurrentToken = parseStart;
174168 }
175169 return false ;
@@ -218,7 +212,7 @@ namespace FPL {
218212 return *returnToken; // On donne l'opérateur
219213 }
220214
221- std::optional<Type> Parser::CheckerType (std::string_view name ) {
215+ std::optional<Type> Parser::CheckerType () {
222216 auto possibleType = CheckerIdentifiant ();
223217 if (!possibleType.has_value ()) { return std::nullopt ; }
224218
0 commit comments