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 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
| #ifndef GRAMMAIRE_HPP
#define GRAMMAIRE_HPP
class grammaire{
public:
std::vector<std::vector<std::string>>presencerecurs();
int comptertete(std::string tete);
int termine(std::string s);
void parseur();
void emettre();
private:
std::vector<std::vector<std::string>>grammaire_s;
std::vector<std::string>terminaux;
std::vector<std::string>nonterminaux;
std::vector<std::vector<std::string>>listesnonrecurs;
};
#endif
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include "grammaire.hpp"
int main(){
std::vector<std::vector<std::string>>listerecurs;
grammaire G;
G.parseur();
listerecurs =G.presencerecurs();
for(auto p:listerecurs){
for(auto s:p)
std::cout<<s<<' ';
std::cout<<std::endl;
}
return 0;
}
void grammaire::parseur(){
terminaux={"a","b","c","d"};
nonterminaux={"X","Y","A","B","C","D"};
grammaire_s={
{"X","Y"}, // X -> Y
{"Y","Y","D"}, // Y -> Y D
{"Y","Y","a"}, // Y -> Y a
{"Y","b"}, // Y -> b
{"A","B"}, // A -> B
{"B","d"}, // B -> d
{"C","c"}, // C -> c
{"D","D","c"} // D -> D C
};
}
std::vector<std::vector<std::string>> grammaire::presencerecurs(){
std::vector<std::vector<std::string>>temporaire,archive;
std::vector<std::string> unelistenonrecurs;
int n1,n2;
for(auto p:grammaire_s){
temporaire.clear();
n2=termine(p[0]);//indice d'élément de listenonrecurs terminé par p[0]
if(n2==-1){//si p[0] est absent
n1=comptertete(p[0]);
for(int i=0;i<n1;i++){
unelistenonrecurs.clear();
unelistenonrecurs.push_back(p[0]);
listesnonrecurs.push_back(unelistenonrecurs);
}
n2=termine(p[0]);
}
else
unelistenonrecurs=listesnonrecurs[n2];
if(std::find(nonterminaux.begin(),nonterminaux.end(),p[1])!=nonterminaux.end()){
if(std::find(unelistenonrecurs.begin(),unelistenonrecurs.end(),p[1])!=unelistenonrecurs.end()){
while(unelistenonrecurs[0]!=p[1])
unelistenonrecurs.erase(unelistenonrecurs.begin());
archive.push_back(unelistenonrecurs);//recurs gauche détectée
listesnonrecurs.erase(listesnonrecurs.begin()+n2);
continue;
}
else{
unelistenonrecurs.push_back(p[1]);
n1=comptertete(p[1]);
for(int i=0;i<n1;i++)
temporaire.push_back(unelistenonrecurs);
listesnonrecurs.erase(listesnonrecurs.begin()+n2);
listesnonrecurs.insert(listesnonrecurs.end(),temporaire.begin(),temporaire.end());
}
}
else{
listesnonrecurs.erase(listesnonrecurs.begin()+n2);
}
}
return archive;
}
int grammaire::termine(std::string fin){
//retourne l'indice de liste tel que 'fin' soit son dernier symbole
for(size_t i=0;i<listesnonrecurs.size();i++)
if(listesnonrecurs[i].back()==fin)
return i;
return -1;//en cas d'échec
}
int grammaire::comptertete(std::string s){
int c=0;
for(auto &p:grammaire_s)
if(s==p[0])
c++;
return c;
} |
Partager