This repository has been archived by the owner on May 17, 2024. It is now read-only.
forked from Feelzor/InterpreteurCpp
-
Notifications
You must be signed in to change notification settings - Fork 0
/
VisiteurExecuter.cpp
127 lines (114 loc) · 5.04 KB
/
VisiteurExecuter.cpp
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
#include "VisiteurExecuter.h"
#include "ValeurEntiere.h"
#include "TableProcedures.h"
void VisiteurExecuter::visiterProcedure(Procedure* procedure) {
procedure->getSequence()->accepter(*this);
}
void VisiteurExecuter::visiterNoeudSeqInst(NoeudSeqInst* noeud) {
for (unsigned int i = 0; i < noeud->getInstructions().size(); i++)
noeud->getInstructions()[i]->accepter(*this); // on exécute chaque instruction de la séquence
}
void VisiteurExecuter::visiterNoeudAffectation(NoeudAffectation* noeud) {
noeud->getExpression()->accepter(*this); // On exécute (évalue) l'expression
((SymboleValue*) noeud->getVariable())->setValeur(m_derniereValeur); // On affecte la variable
}
void VisiteurExecuter::visiterNoeudOperateurBinaire(NoeudOperateurBinaire* noeud) {
Valeur *og, *od, *valeur;
if (noeud->getOperandeGauche() != nullptr) {
noeud->getOperandeGauche()->accepter(*this); // On évalue l'opérande gauche
og = m_derniereValeur;
}
if (noeud->getOperandeDroit() != nullptr) {
noeud->getOperandeDroit()->accepter(*this); // On évalue l'opérande droit
od = m_derniereValeur;
}
// Et on combine les deux opérandes en fonctions de l'opérateur
if (noeud->getOperateur() == "+") valeur = (*og + od);
else if (noeud->getOperateur() == "-") valeur = (*og - od);
else if (noeud->getOperateur() == "*") valeur = (*og * od);
else if (noeud->getOperateur() == "==") valeur = new ValeurEntiere(*og == od);
else if (noeud->getOperateur() == "!=") valeur = new ValeurEntiere(*og != od);
else if (noeud->getOperateur() == "<") valeur = new ValeurEntiere(*og < od);
else if (noeud->getOperateur() == ">") valeur = new ValeurEntiere(*og > od);
else if (noeud->getOperateur() == "<=") valeur = new ValeurEntiere(*og <= od);
else if (noeud->getOperateur() == ">=") valeur = new ValeurEntiere(*og >= od);
else if (noeud->getOperateur() == "et") valeur = new ValeurEntiere(*og && od);
else if (noeud->getOperateur() == "ou") valeur = new ValeurEntiere(*og || od);
else if (noeud->getOperateur() == "non") valeur = new ValeurEntiere(!*og);
else if (noeud->getOperateur() == "/") {
if (od == 0) throw DivParZeroException();
valeur = *og / od;
}
m_derniereValeur = valeur;
}
void VisiteurExecuter::visiterNoeudInstSi(NoeudInstSi* noeud) {
if (noeud->getCondition() != nullptr) {
noeud->getCondition()->accepter(*this);
if (m_derniereValeur->isVrai()) {
noeud->getSequence()->accepter(*this);
} else if (noeud->getProchaineCondition() != nullptr) {
noeud->getProchaineCondition()->accepter(*this);
}
} else {
noeud->getSequence()->accepter(*this);
}
}
void VisiteurExecuter::visiterNoeudInstRepeter(NoeudInstRepeter* noeud) {
do {
noeud->getSequence()->accepter(*this);
noeud->getCondition()->accepter(*this);
} while (!m_derniereValeur->isVrai());
}
void VisiteurExecuter::visiterNoeudInstPour(NoeudInstPour* noeud) {
if (noeud->getInit() != nullptr) noeud->getInit()->accepter(*this);
noeud->getCondition()->accepter(*this);
while (m_derniereValeur->isVrai()) {
noeud->getSequence()->accepter(*this);
if (noeud->getAffectation() != nullptr) noeud->getAffectation()->accepter(*this);
noeud->getCondition()->accepter(*this);
}
}
void VisiteurExecuter::visiterNoeudInstTantQue(NoeudInstTantQue* noeud) {
noeud->getCondition()->accepter(*this);
while (m_derniereValeur->isVrai()) {
noeud->getSequence()->accepter(*this);
noeud->getCondition()->accepter(*this);
}
}
void VisiteurExecuter::visiterNoeudInstLire(NoeudInstLire* noeud) {
for (Noeud* var : noeud->getVariables()){
int val;
cout << "Saisir un entier : ";
cin >> val;
if(!cin.fail()){
((SymboleValue*)var)->setValeur(val);
} else {
cout << "La valeur que vous avez saisie n'est pas un entier. La valeur zéro a été attribuée par défaut." << endl;
cin.clear();
cin.ignore(10000,'\n');
((SymboleValue*)var)->setValeur(0);
}
}
}
void VisiteurExecuter::visiterNoeudInstEcrire(NoeudInstEcrire* noeud) {
for (Noeud* inst : noeud->getEcritures()) {
m_derniereValeur = 0;
inst->accepter(*this);
cout << m_derniereValeur;
}
cout << endl;
}
void VisiteurExecuter::visiterNoeudInstAppel(NoeudInstAppel* noeud) {
TableProcedures::getTable()->executerProcedure(noeud->getNom(), noeud->getParametres(), *this);
}
void VisiteurExecuter::visiterNoeudAlea(NoeudAlea* noeud) {
noeud->getMin()->accepter(*this);
int min = m_derniereValeur->getEntier();
noeud->getMax()->accepter(*this);
int max = m_derniereValeur->getEntier();
m_derniereValeur = new ValeurEntiere(rand() % (max - min) + min);
}
void VisiteurExecuter::visiterSymboleValue(SymboleValue* symbole) {
if (!symbole->estDefini()) throw IndefiniException(); // on lève une exception si valeur non définie
m_derniereValeur = symbole->getValeur();
}