From c7185b34b433b4532aec09b24699482381723422 Mon Sep 17 00:00:00 2001 From: VINCENT Thomas Date: Thu, 24 Oct 2019 09:54:31 +0200 Subject: [PATCH] feature-compile-seqinst: ajout compilation --- main.cpp | 64 ++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 53 insertions(+), 11 deletions(-) diff --git a/main.cpp b/main.cpp index 1ee2f37..c24d2af 100644 --- a/main.cpp +++ b/main.cpp @@ -1,16 +1,35 @@ #include +#include using namespace std; #include "Interpreteur.h" #include "Exceptions.h" +void compiler(ostream& out, const TableSymboles& symboles, Noeud* arbre); + int main(int argc, char* argv[]) { + bool compile = false; string nomFich; - if (argc != 2) { - cout << "Usage : " << argv[0] << " nom_fichier_source" << endl << endl; + ofstream o; + ostream* out; + if (argc < 3) { + cout << "Usage : " << argv[0] << " [fichierDestination]" << endl << endl; cout << "Entrez le nom du fichier que voulez-vous interpréter : "; getline(cin, nomFich); - } else - nomFich = argv[1]; + } else { + compile = strcmp(argv[1], "compiler") == 0; + nomFich = argv[2]; + if (argc == 4) { + o.open(argv[3]); + if (o) { + out = &o; + } else { + out = &cout; + } + } else { + out = &cout; + } + } + ifstream fichier(nomFich.c_str()); try { if (fichier.fail()) throw FichierException(); @@ -18,15 +37,38 @@ int main(int argc, char* argv[]) { interpreteur.analyse(); // Si pas d'exception levée, l'analyse syntaxique a réussi cout << endl << "================ Syntaxe Correcte" << endl; - // On affiche le contenu de la table des symboles avant d'exécuter le programme - cout << endl << "================ Table des symboles avant exécution : " << interpreteur.getTable(); - cout << endl << "================ Execution de l'arbre" << endl; - // On exécute le programme si l'arbre n'est pas vide - if (interpreteur.getArbre() != nullptr) interpreteur.getArbre()->executer(); - // Et on vérifie qu'il a fonctionné en regardant comment il a modifié la table des symboles - cout << endl << "================ Table des symboles apres exécution : " << interpreteur.getTable(); + if (compile) { + compiler(*out, interpreteur.getTable(), interpreteur.getArbre()); + } else { + // On affiche le contenu de la table des symboles avant d'exécuter le programme + cout << endl << "================ Table des symboles avant exécution : " << interpreteur.getTable(); + cout << endl << "================ Execution de l'arbre" << endl; + // On exécute le programme si l'arbre n'est pas vide + if (interpreteur.getArbre() != nullptr) interpreteur.getArbre()->executer(); + // Et on vérifie qu'il a fonctionné en regardant comment il a modifié la table des symboles + cout << endl << "================ Table des symboles apres exécution : " << interpreteur.getTable(); + } } catch (InterpreteurException & e) { cout << e.what() << endl; } + + if (o) { + o.close(); + } + return 0; } + +void compiler(ostream& out, const TableSymboles& symboles, Noeud* arbre) { + std::string indentationBasique(4, ' '); + out << "#include " << endl << endl; + out << "int main() {" << endl; + for (int i = 0; i < symboles.getTaille(); i++) { + const SymboleValue s = symboles[i]; + if (s == "") { + out << indentationBasique << "int " << s.getChaine() << ";" << endl; + } + } + arbre->compiler(out, 1); + out << "}" << endl; +} \ No newline at end of file