This repository has been archived on 2019-08-08. You can view files and clone it, but cannot push or open issues or pull requests.
PILG/src/analyserCommande.cpp
Geoffrey Frogeye 2e5cbafa3c Analyse syntaxique de la commande
Code de la séance du 05/05/14 + Code à la maison
* Différenciation entre flags de production et flags de tests
* Mise à jour de TODO.md
* Abandon de BGI
* Définition partielle de l'analyse de commande
* Ajout de la fonction decoupeCommande()
* Ajout de la fonction boucleDeCommandes()
* Modification de l'appel des fichiers externes
* Ajout d'un mode hors-REPL
* Ajout du code correct pour creer()
* Changement de l'indentation de traitementImage.cpp
2014-05-05 21:00:08 +02:00

89 lines
2.8 KiB
C++

#include <vector>
#include <string>
using namespace std;
int messageErreur(string message) {
cerr << "Erreur : " << message << endl;
}
int decoupeCommande(string commande, vector< string > &decoupe) {
// Boucle de découpage
// vector< string > decoupe;
string elementCourrant = "";
bool dansLeVide = false;
bool echape = false;
bool vaEchapper = false;
bool entreSimplesGuillemets = false;
bool entreDoublesGuillemets = false;
for (int i = 0; i < commande.length(); i++) {
echape = false;
if (vaEchapper) {
vaEchapper = false;
echape = true;
}
if (commande[i] == ' ' && !(echape || entreSimplesGuillemets || entreDoublesGuillemets)) {
// cout << i << " : " << "espace" << endl;
if (!dansLeVide) {
// cout << "Ajout de " << elementCourrant << endl;
decoupe.push_back(elementCourrant);
elementCourrant = "";
dansLeVide = true;
}
} else if (commande[i] == '\\' && !echape) {
vaEchapper = true;
} else if (commande[i] == '\'' && !(echape || entreDoublesGuillemets)) {
if (entreSimplesGuillemets) {
entreSimplesGuillemets = false;
// cout << "Ajout de " << elementCourrant << endl;
decoupe.push_back(elementCourrant);
elementCourrant = "";
dansLeVide = true;
} else {
entreSimplesGuillemets = true;
}
} else if (commande[i] == '"' && !(echape || entreSimplesGuillemets)) {
if (entreDoublesGuillemets) {
entreDoublesGuillemets = false;
// cout << "Ajout de " << elementCourrant << endl;
decoupe.push_back(elementCourrant);
elementCourrant = "";
dansLeVide = true;
} else {
entreDoublesGuillemets = true;
}
} else {
// cout << i << " : " << "else" << endl;
elementCourrant += commande[i];
dansLeVide = false;
}
}
if (!dansLeVide) {
// cout << "Ajout de " << elementCourrant << endl;
decoupe.push_back(elementCourrant);
}
}
int analyserDecoupe(vector< string > decoupe) {
for (int i = 0; i < decoupe.size(); i++) { // DEBUG
cout << "Argument " << i << " = " << decoupe[i] << endl;
}
}
int boucleDeCommandes() {
bool continuer = true;
string commande;
while (continuer) {
cout << "$ ";
getline(cin, commande);
if (commande == "exit" || commande == "quitter") {
continuer = false;
} else {
vector< string > decoupe;
decoupeCommande(commande, decoupe);
analyserDecoupe(decoupe);
}
}
return 0;
}