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
| #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","epsilon"};
nonterminaux={"S","A"};
grammaire_s={
{"S","A","a"}, // S -> A a
{"S","b"}, // S -> b
{"A","A","c"}, // A -> A c
{"A","S","d"}, // A -> S d
{"A","epsilon"} // A -> epsilon
};
axiome="S";
}
std::vector<std::vector<std::string>>
grammaire::presencerecurs(){
std::vector<std::vector<std::string>>temporaire,archive;
std::vector<std::string> unelistenonrecurs;
int n1,n2;
n1=comptertete(axiome);
for(int i=0;i<n1;i++){
unelistenonrecurs.push_back(axiome);
listesnonrecurs.push_back(unelistenonrecurs);
unelistenonrecurs.clear();
}
for(auto p:grammaire_s){
temporaire.clear();
n2=termine(p[0]);//listenonrecursterminé par p[0]
if(n2!=-1){
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;
}
int grammaire::comptertete(std::string s){
int c=0;
for(auto &p:grammaire_s)
if(s==p[0])
c++;
return c;
} |
Partager