Skip to content
This repository has been archived by the owner on May 17, 2024. It is now read-only.

Commit

Permalink
Merge branch 'master' into feature-procedures
Browse files Browse the repository at this point in the history
  • Loading branch information
Feelzor committed Nov 6, 2019
2 parents c16cd41 + e7ce034 commit 7e6f0c7
Show file tree
Hide file tree
Showing 23 changed files with 97 additions and 7 deletions.
10 changes: 10 additions & 0 deletions ArbreAbstrait.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -147,3 +147,13 @@ NoeudInstAppel::NoeudInstAppel(Symbole nom, vector<Noeud*> parametres)
void NoeudInstAppel::accepter(Visiteur& visiteur) {
visiteur.visiterNoeudInstAppel(this);
}

////////////////////////////////////////////////////////////////////////////////
// NoeudInstAlea
////////////////////////////////////////////////////////////////////////////////

NoeudAlea::NoeudAlea(Noeud* min, Noeud* max) : m_min(min), m_max(max) {}

void NoeudAlea::accepter(Visiteur& visiteur) {
visiteur.visiterNoeudAlea(this);
}
20 changes: 19 additions & 1 deletion ArbreAbstrait.h
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,7 @@ class NoeudInstAppel : public Noeud {
// Classe pour représenter un noeud "instruction appel"
public:
NoeudInstAppel(Symbole nom, vector<Noeud*> parametres);
// Construit une "instruction appel" avec sa condition et sa séquence d'instruction
// Construit une "instruction appel" avec son nom et ses paramètres

~NoeudInstAppel() {
} // A cause du destructeur virtuel de la classe Noeud
Expand All @@ -217,4 +217,22 @@ class NoeudInstAppel : public Noeud {
vector<Noeud*> m_parametres;
};

////////////////////////////////////////////////////////////////////////////////
class NoeudAlea : public Noeud {
// Classe pour représenter un noeud "alea"
public:
NoeudAlea(Noeud* min, Noeud* max);
// Construit un "alea" avec son min et son max

~NoeudAlea() {
} // A cause du destructeur virtuel de la classe Noeud
void accepter(Visiteur& visiteur) override;

inline Noeud* getMin() const { return m_min; }
inline Noeud* getMax() const { return m_max; }

private:
Noeud* m_min;
Noeud* m_max;
};
#endif /* ARBREABSTRAIT_H */
16 changes: 15 additions & 1 deletion Interpreteur.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,7 @@ Noeud* Interpreteur::expMult(){
}

Noeud* Interpreteur::facteur() {
// <facteur> ::= <entier> | <reel> | <chaine> | <variable> | - <facteur> | non <facteur> | ( <expression> )
// <facteur> ::= <entier> | <reel> | <chaine> | <variable> | - <facteur> | non <facteur> | ( <expression> ) | <alea>
Noeud* fact = nullptr;
if (m_lecteur.getSymbole() == "<VARIABLE>" || m_lecteur.getSymbole() == "<ENTIER>" || m_lecteur.getSymbole() == "<REEL>" || m_lecteur.getSymbole() == "<CHAINE>") {
fact = m_table.chercheAjoute(m_lecteur.getSymbole()); // on ajoute la variable ou l'entier à la table
Expand All @@ -235,6 +235,8 @@ Noeud* Interpreteur::facteur() {
m_lecteur.avancer();
fact = expression();
testerEtAvancer(")");
} else if (m_lecteur.getSymbole() == "alea") {
fact = alea();
} else
erreur("Facteur incorrect");
return fact;
Expand Down Expand Up @@ -377,4 +379,16 @@ Noeud* Interpreteur::instAppel() {
testerEtAvancer(";");

return new NoeudInstAppel(nom, parametres);
}

Noeud* Interpreteur::alea() {
// <alea> ::= alea(<expression>, <expression>)
testerEtAvancer("alea");
testerEtAvancer("(");
Noeud* min = expression();
testerEtAvancer(",");
Noeud* max = expression();
testerEtAvancer(")");

return new NoeudAlea(min, max);
}
3 changes: 2 additions & 1 deletion Interpreteur.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ class Interpreteur {
Noeud* expComp(); // <expComp> ::= <expAdd> { == | != | < | <= | > | >= <expAdd> }
Noeud* expAdd(); // <expAdd> ::= <expMult> { + | - <expMult> }
Noeud* expMult(); // <expMult> ::= <facteur> { * | / <facteur> }
Noeud* facteur(); // <facteur> ::= <entier> | <reel> | <chaine> | <variable> | - <facteur> | non <facteur> | ( <expression> )
Noeud* facteur(); // <facteur> ::= <entier> | <reel> | <chaine> | <variable> | - <facteur> | non <facteur> | ( <expression> ) | <alea>
// <opBinaire> ::= + | - | * | / | < | > | <= | >= | == | != | et | ou
Noeud* instSi(); // <instSi> ::= si ( <expression> ) <seqInst> { sinonsi (<expression>) <seqInst> } [ sinon <seqInst> ] finsi
Noeud* instPour(); // <instPour> ::= pour ( [ <affectation> ] ; <expression> ; [ <affection> ]) <seqInst> finpour
Expand All @@ -47,6 +47,7 @@ class Interpreteur {
Noeud* instEcrire(); // <instEcrire> ::= ecrire ( <expression> | <chaine> {, <expression> | <chaine> } );
Noeud* instRepeter(); // <instRepeter> ::= repeter <seqInst> jusqua ( <expression> )
Noeud* instAppel(); // <appel> ::= appel <variable>([<expression> {, <expression>}]);
Noeud* alea(); // <alea> ::= alea(<expression>, <expression>)

// outils pour simplifier l'analyse syntaxique
void tester (const string & symboleAttendu) const; // Si symbole courant != symboleAttendu, on lève une exception
Expand Down
1 change: 1 addition & 0 deletions Visiteur.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ class Visiteur {
virtual void visiterNoeudInstLire(NoeudInstLire* noeud) = 0;
virtual void visiterNoeudInstEcrire(NoeudInstEcrire* noeud) = 0;
virtual void visiterNoeudInstAppel(NoeudInstAppel* noeud) = 0;
virtual void visiterNoeudAlea(NoeudAlea* noeud) = 0;
virtual void visiterSymboleValue(SymboleValue* symbole) = 0;
};

Expand Down
8 changes: 8 additions & 0 deletions VisiteurCompiler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,14 @@ void VisiteurCompiler::visiterNoeudInstAppel(NoeudInstAppel* noeud) {
m_out << ")" << endl;
}

void VisiteurCompiler::visiterNoeudAlea(NoeudAlea* noeud) {
m_out << "random.randint(";
noeud->getMin()->accepter(*this);
m_out << ",";
noeud->getMax()->accepter(*this);
m_out << ")" << endl;
}

void VisiteurCompiler::visiterSymboleValue(SymboleValue* symbole) {
m_out << symbole->getChaine();
}
1 change: 1 addition & 0 deletions VisiteurCompiler.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ class VisiteurCompiler : public Visiteur {
void visiterNoeudInstLire(NoeudInstLire* noeud) override;
void visiterNoeudInstEcrire(NoeudInstEcrire* noeud) override;
void visiterNoeudInstAppel(NoeudInstAppel* noeud) override;
void visiterNoeudAlea(NoeudAlea* noeud) override;
void visiterSymboleValue(SymboleValue* symbole) override;

private:
Expand Down
8 changes: 8 additions & 0 deletions VisiteurExecuter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,14 @@ 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();
Expand Down
1 change: 1 addition & 0 deletions VisiteurExecuter.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ class VisiteurExecuter : public Visiteur {
void visiterNoeudInstLire(NoeudInstLire* noeud) override;
void visiterNoeudInstEcrire(NoeudInstEcrire* noeud) override;
void visiterNoeudInstAppel(NoeudInstAppel* noeud) override;
void visiterNoeudAlea(NoeudAlea* noeud) override;
void visiterSymboleValue(SymboleValue* symbole) override;

inline Valeur* getDerniereValeur() { return m_derniereValeur; }
Expand Down
2 changes: 2 additions & 0 deletions main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ using namespace std;
void compiler(ostream& out, const TableSymboles& symboles, Noeud* arbre);

int main(int argc, char* argv[]) {
srand (time(NULL));
bool compile = false;
string nomFich;
ofstream o;
Expand Down Expand Up @@ -73,6 +74,7 @@ int main(int argc, char* argv[]) {
}

void compiler(ostream& out, const TableSymboles& symboles, Noeud* arbre) {
out << "import random" << endl;
VisiteurCompiler visiteur(out, 0);
TableProcedures::getTable()->compilerProcedures(visiteur);
arbre->accepter(visiteur);
Expand Down
1 change: 1 addition & 0 deletions motsCles.txt
Original file line number Diff line number Diff line change
Expand Up @@ -34,3 +34,4 @@ et
ou
non
appel
alea
18 changes: 18 additions & 0 deletions pom.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
procedure principale()
ecrire("Entrez le minimum et le maximum : ");
lire(min, max);
nbMyst = alea(min, max);
nbDevin = nbMyst - 1;
nbCoups = 0;
tantque (nbDevin != nbMyst)
lire(nbDevin);
nbCoups = nbCoups + 1;
si (nbMyst > nbDevin)
ecrire("C'est plus");
sinonsi (nbMyst < nbDevin)
ecrire("C'est moins");
finsi
fintantque

ecrire("Bravo, vous avez trouvé en ", nbCoups, " coup(s)");
finproc
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
6 changes: 6 additions & 0 deletions test08-alea.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# Résultat attendu :
# i : Nombre entre 1 et 100

procedure principale()
i = alea(1, 100);
finproc
File renamed without changes.
1 change: 1 addition & 0 deletions testAffectation.txt
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ procedure principale()
l = k + j;
m = j + k;
n = "Bla" * 2 + "Car";
o = alea(3, 100);
finproc


8 changes: 4 additions & 4 deletions tests/TestInstPour.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ void TestInstPour::tearDown() {
}

void TestInstPour::testPour() {
std::ifstream fichier("testPour.txt");
std::ifstream fichier("test04-Pour.txt");
if (!fichier) {
CPPUNIT_ASSERT_MESSAGE("Fichier impossible à ouvrir", false);
}
Expand All @@ -43,12 +43,12 @@ void TestInstPour::testPour() {
interpreteur.getArbre()->accepter(visiteur);

const TableSymboles& table = interpreteur.getTable();
CPPUNIT_ASSERT_EQUAL_MESSAGE("Test valeur i", 11, table[3].getValeur());
CPPUNIT_ASSERT_EQUAL_MESSAGE("Test valeur j", 385, table[4].getValeur());
CPPUNIT_ASSERT_EQUAL_MESSAGE("Test valeur i", 11, table[3].getValeur()->getEntier());
CPPUNIT_ASSERT_EQUAL_MESSAGE("Test valeur j", 385, table[4].getValeur()->getEntier());
}

void TestInstPour::testPourErreur() {
std::ifstream fichier("testPourErreurSyntaxe.txt");
std::ifstream fichier("test07-PourErreurSyntaxe.txt");
if (!fichier) {
CPPUNIT_ASSERT_MESSAGE("Fichier impossible à ouvrir", false);
}
Expand Down

0 comments on commit 7e6f0c7

Please sign in to comment.