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

Commit

Permalink
feature-visiteur: ajout pattern visiteur pour la compilation
Browse files Browse the repository at this point in the history
  • Loading branch information
Feelzor committed Oct 30, 2019
1 parent 287d95f commit 8682854
Show file tree
Hide file tree
Showing 7 changed files with 196 additions and 132 deletions.
114 changes: 0 additions & 114 deletions ArbreAbstrait.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,6 @@
NoeudSeqInst::NoeudSeqInst() : m_instructions() {
}

void NoeudSeqInst::compiler(ostream & out, int indentation) {
for (unsigned int i = 0; i < m_instructions.size(); i++) {
cout << std::string(indentation * 4, ' ');
m_instructions[i]->compiler(out, indentation);
cout << endl;
}
}

void NoeudSeqInst::accepter(Visiteur& visiteur) {
visiteur.visiterNoeudSeqInst(this);
}
Expand All @@ -37,19 +29,6 @@ NoeudAffectation::NoeudAffectation(Noeud* variable, Noeud* expression)
: m_variable(variable), m_expression(expression) {
}

void NoeudAffectation::compiler(ostream & out, int indentation) {
bool instructionSeule = true;
if (indentation < 0) {
indentation = 0;
instructionSeule = false;
}

m_variable->compiler(out, -1);
out << "=";
m_expression->compiler(out, -1);
if (instructionSeule) out << ";";
}

void NoeudAffectation::accepter(Visiteur& visiteur) {
visiteur.visiterNoeudAffectation(this);
}
Expand All @@ -62,24 +41,6 @@ NoeudOperateurBinaire::NoeudOperateurBinaire(Symbole operateur, Noeud* operandeG
: m_operateur(operateur), m_operandeGauche(operandeGauche), m_operandeDroit(operandeDroit) {
}

void NoeudOperateurBinaire::compiler(ostream & out, int indentation) {
std::string op = m_operateur.getChaine();

out << "(";
if (op == "non") {
out << "!";
m_operandeGauche->compiler(out, -1);
} else {
if (op == "et") op = "&&";
else if (op == "ou") op = "||";

m_operandeGauche->compiler(out, -1);
out << op;
m_operandeDroit->compiler(out, -1);
}
out << ")";
}

void NoeudOperateurBinaire::accepter(Visiteur& visiteur) {
visiteur.visiterNoeudOperateurBinaire(this);
}
Expand All @@ -92,27 +53,6 @@ NoeudInstSi::NoeudInstSi(Noeud* condition, Noeud* sequence)
: m_condition(condition), m_sequence(sequence), m_prochaineCondition(nullptr), m_isPremiereCondition(true) {
}

void NoeudInstSi::compiler(ostream & out, int indentation) {
std::string indent(indentation * 4, ' ');
if (m_condition != nullptr) {
if (!m_isPremiereCondition) { out << ' '; }
out << "if (";
m_condition->compiler(out, -1);
out << ")";
}

out << " {" << endl;
m_sequence->compiler(out, indentation + 1);
out << indent << "}";

if (m_prochaineCondition != nullptr) {
out << " else";
m_prochaineCondition->compiler(out, indentation);
} else {
out << endl;
}
}

void NoeudInstSi::ajoute(Noeud* condition) {
((NoeudInstSi*) condition)->setIsPremiereCondition(false);
if (m_prochaineCondition == nullptr) {
Expand All @@ -138,15 +78,6 @@ NoeudInstRepeter::NoeudInstRepeter(Noeud* instruction, Noeud* condition) : m_seq

}

void NoeudInstRepeter::compiler(ostream & out, int indentation) {
std::string indent(indentation * 4, ' ');
out << "do {" << endl;
m_sequence->compiler(out, indentation + 1);
out << indent << "} while (!(";
m_condition->compiler(out, -1);
out << "));" << endl;
}

void NoeudInstRepeter::accepter(Visiteur& visiteur) {
visiteur.visiterNoeudInstRepeter(this);
}
Expand All @@ -159,19 +90,6 @@ NoeudInstPour::NoeudInstPour(Noeud* init, Noeud* condition, Noeud* affect, Noeud
: m_init(init), m_condition(condition), m_affectation(affect), m_sequence(sequence) {
}

void NoeudInstPour::compiler(ostream & out, int indentation) {
std::string indent(4 * indentation, ' ');
out << "for (";
if (m_init != nullptr) m_init->compiler(out, -1);
out << ";";
m_condition->compiler(out, -1);
out << ";";
if (m_affectation != nullptr) m_affectation->compiler(out, -1);
out << ") {" << endl;
m_sequence->compiler(out, indentation + 1);
out << indent << "}" << endl;
}

void NoeudInstPour::accepter(Visiteur& visiteur) {
visiteur.visiterNoeudInstPour(this);
}
Expand All @@ -184,15 +102,6 @@ NoeudInstTantQue::NoeudInstTantQue(Noeud* condition, Noeud* sequence)
: m_condition(condition), m_sequence(sequence) {
}

void NoeudInstTantQue::compiler(ostream & out, int indentation) {
std::string indent(indentation * 4, ' ');
out << "while " ;
m_condition->compiler(out,indentation);
out << " {" << endl;
m_sequence->compiler(out,indentation+1);
out << indent << "}" << endl;
}

void NoeudInstTantQue::accepter(Visiteur& visiteur) {
visiteur.visiterNoeudInstTantQue(this);
}
Expand All @@ -204,16 +113,6 @@ NoeudInstLire::NoeudInstLire() {
m_variables = vector<Noeud*>();
}

void NoeudInstLire::compiler(ostream & out, int indentation) {
out << "std::cin";
for (Noeud* var : m_variables) {
out << " >> ";
var->compiler(out, -1);
}

out << ";";
}

void NoeudInstLire::accepter(Visiteur& visiteur) {
visiteur.visiterNoeudInstLire(this);
}
Expand All @@ -233,19 +132,6 @@ void NoeudInstEcrire::ajoute(Noeud* instruction) {
m_ecritures.push_back(instruction);
}

void NoeudInstEcrire::compiler(ostream & out, int indentation) {
out << "std::cout";
for (Noeud* inst : m_ecritures) {
out << " << ";
if ((typeid (*inst) == typeid (SymboleValue) && *((SymboleValue*) inst) == "<CHAINE>")) {
out << ((SymboleValue*) inst)->getChaine();
} else {
inst->compiler(out, -1);
}
}
out << ";";
}

void NoeudInstEcrire::accepter(Visiteur& visiteur) {
visiteur.visiterNoeudInstEcrire(this);
}
14 changes: 2 additions & 12 deletions ArbreAbstrait.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ class Noeud {
// Classe abstraite dont dériveront toutes les classes servant à représenter l'arbre abstrait
// Remarque : la classe ne contient aucun constructeur
public:
virtual void compiler(ostream & out, int indentation) =0 ;
virtual void accepter(Visiteur& visiteur) = 0;
virtual void ajoute(Noeud* instruction) { throw OperationInterditeException(); }
virtual ~Noeud() {} // Présence d'un destructeur virtuel conseillée dans les classes abstraites
Expand All @@ -32,7 +31,6 @@ class NoeudSeqInst : public Noeud {
public:
NoeudSeqInst(); // Construit une séquence d'instruction vide
~NoeudSeqInst() {} // A cause du destructeur virtuel de la classe Noeud
void compiler(ostream & out, int indentation) override;
void accepter(Visiteur& visiteur) override;
void ajoute(Noeud* instruction) override; // Ajoute une instruction à la séquence
inline vector<Noeud *> getInstructions() const { return m_instructions; }
Expand All @@ -48,7 +46,6 @@ class NoeudAffectation : public Noeud {
public:
NoeudAffectation(Noeud* variable, Noeud* expression); // construit une affectation
~NoeudAffectation() {} // A cause du destructeur virtuel de la classe Noeud
void compiler(ostream & out, int indentation) override;
void accepter(Visiteur& visiteur) override;

inline Noeud* getVariable() const { return m_variable; }
Expand All @@ -67,7 +64,6 @@ class NoeudOperateurBinaire : public Noeud {
NoeudOperateurBinaire(Symbole operateur, Noeud* operandeGauche, Noeud* operandeDroit);
// Construit une opération binaire : operandeGauche operateur OperandeDroit
~NoeudOperateurBinaire() {} // A cause du destructeur virtuel de la classe Noeud
void compiler(ostream & out, int indentation) override;
void accepter(Visiteur& visiteur) override;

inline Symbole getOperateur() const { return m_operateur; }
Expand All @@ -87,7 +83,6 @@ class NoeudInstSi : public Noeud {
NoeudInstSi(Noeud* condition, Noeud* sequence);
// Construit une "instruction si" avec sa condition et sa séquence d'instruction
~NoeudInstSi() {} // A cause du destructeur virtuel de la classe Noeud
void compiler(ostream & out, int indentation) override;
void accepter(Visiteur& visiteur) override;

void ajoute(Noeud* condition) override;
Expand All @@ -96,7 +91,7 @@ class NoeudInstSi : public Noeud {
inline Noeud* getCondition() const { return m_condition; }
inline Noeud* getSequence() const { return m_sequence; }
inline Noeud* getProchaineCondition() const { return m_prochaineCondition; }
inline bool getisPremiereCondition() const { return m_isPremiereCondition; }
inline bool isPremiereCondition() const { return m_isPremiereCondition; }

private:
Noeud* m_condition;
Expand All @@ -112,7 +107,6 @@ public :
NoeudInstRepeter(Noeud* instruction, Noeud* condition);

~NoeudInstRepeter() {}
void compiler(ostream & out, int indentation) override;
void accepter(Visiteur& visiteur) override;

inline Noeud* getCondition() const { return m_condition; }
Expand All @@ -132,7 +126,6 @@ class NoeudInstPour : public Noeud {

~NoeudInstPour() {
} // A cause du destructeur virtuel de la classe Noeud
void compiler(ostream & out, int indentation) override;
void accepter(Visiteur& visiteur) override;

inline Noeud* getInit() const { return m_init; }
Expand All @@ -157,7 +150,6 @@ class NoeudInstTantQue : public Noeud {

~NoeudInstTantQue() {
} // A cause du destructeur virtuel de la classe Noeud
void compiler(ostream & out, int indentation) override;
void accepter(Visiteur& visiteur) override;

inline Noeud* getCondition() const { return m_condition; }
Expand All @@ -178,7 +170,6 @@ class NoeudInstLire : public Noeud {

}

void compiler(ostream & out, int indentation) override;
void accepter(Visiteur& visiteur) override;
void ajoute(Noeud* var) override;

Expand All @@ -195,12 +186,11 @@ class NoeudInstEcrire : public Noeud {
public:
NoeudInstEcrire();
// Construit une "instruction ecrire" avec sa condition et sa séquence d'instruction
virtual void ajoute(Noeud* instruction);

~NoeudInstEcrire() {
} // A cause du destructeur virtuel de la classe Noeud
void compiler(ostream & out, int indentation) override;
void accepter(Visiteur& visiteur) override;
virtual void ajoute(Noeud* instruction);

inline vector<Noeud*> getEcritures() const { return m_ecritures; }

Expand Down
4 changes: 0 additions & 4 deletions SymboleValue.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,6 @@ Symbole(s.getChaine()) {
}
}

void SymboleValue::compiler(ostream & out, int indentation) {
out << getChaine();
}

void SymboleValue::accepter(Visiteur& visiteur) {
visiteur.visiterSymboleValue(this);
}
Expand Down
1 change: 0 additions & 1 deletion SymboleValue.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ class SymboleValue : public Symbole, // Un symbole valué est un symbole qui a
public:
SymboleValue(const Symbole & s); // Construit un symbole valué à partir d'un symbole existant s
~SymboleValue( ) {}
void compiler(ostream & out, int indentation) override;
void accepter(Visiteur& visiteur) override;
inline void setValeur(int valeur) { this->m_valeur=valeur; m_defini=true; } // accesseur
inline bool estDefini() { return m_defini; } // accesseur
Expand Down
Loading

0 comments on commit 8682854

Please sign in to comment.