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
| enum terminal {elem,sep,fin};//fin=fin de fichier détecté par l'analyseur lexical.
struct unitelexicale{//j'ai choisi struct pour l'encapsulement "public" par défaut
terminal valeur;
std::string attribut;
};
class lexical{
public:
unitelexicale analyselexicale(); //produit l'unité lexicale suivante
...
};
class grammaire{
public:
std::string analysesyntaxique();
std::string liste(); //axiome de la grammaire, pas d'attributs hérités (pas de paramètres)
//nous allons fusionner liste() et resteliste(std::string resteliste_herite), que je n'ai pas mentionné ici
void consommer(terminal terminalcourant);
std::string fonctionquelquonque(std::string resteliste_herite,std::string unitelexicaleelem);
private:
lexical L;
unitelexicale unitelexicalecourante;
};
std::string grammaire::analysesyntaxique(){
unitelexicalecourante = L.analyselexicale();
return liste();
}
std::string grammaire::liste(){
std::string resteliste_herite; //on en a aussi besoin hors du if
if(unitelexicalecourante.valeur == elem){
resteliste_herite = unitelexicalecourante.attribut;
consommer(elem);
while(unitelexicalecourante.valeur == sep){
consommer(sep);
std::string unitelexicaleelem = unitelexicalecourante.attribut; //sauvegarde de l'unité lexicale "elem"
consommer(elem);
resteliste_herite = fonctionquelquonque(resteliste_herite,unitelexicaleelem);
}
}
else{
//message d'erreur
exit(1);
}
std::string resteliste_synthetise = resteliste_herite;
std::string liste_synthetise = resteliste_synthetise;
return liste_synthetise;
}
void grammaire::consommer(terminal terminalcourant){
if(unitelexicalecourante.valeur == terminalcourant)
unitelexicalecourante = L.analyselexicale(); //prochaine unité lexicale
else
//message d'ereur
exit(2);
}
std::string grammaire::fonctionquelquonque(std::string resteliste_herite,std::string unitelexicaleelem){
return resteliste_herite + " " + unitelexicaleelem;
} |