Bonjour,
je suis dans l'algorithme de production (im)productives et je voulais savoir si il faut tenir compte des production vide.
epsilon est-il un terminal? la production vide est-elle productive?
Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
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 void syntaxique::improductifs(){ std::vector<std::string>Prod,nouveaux; bool dansProd,pasajouter; for(auto p:grammaire){ for(auto c:p.getlistecorps()){ dansProd=true; for(auto s:c.getcontenu()) if(s!="epsilon" && absent(terminaux,s)){ dansProd=false; break; } if(dansProd && absent(Prod,p.gettete())){ Prod.push_back(p.gettete()); break; } } } do{ nouveaux.clear(); for(auto A:grammaire){ if(absent(Prod,A.gettete())) for(auto c:A.getlistecorps()){ pasajouter=false; for(auto s:c.getcontenu()) if(absent(terminaux,s) && absent(Prod,s)){ pasajouter=true; break; } } if( ! pasajouter) nouveaux.push_back(A.gettete()); } for(auto x:nouveaux) if(absent(Prod,x)) Prod.push_back(x); }while( ! nouveaux.empty()); for(auto p:grammaire) if(absent(Prod,p.gettete())){ std::cerr<<"Le non-terminal "<<p.gettete()<<" est improductif" <<std::endl; ecriresortie=false; } }une idée?
Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
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 #include <string> #include <vector> #include <map> #include "uniLex.hpp" #include "lexical.hpp" #include "symboles.hpp" class production; class corps; class syntaxique{ public: syntaxique(char *nomfichier); void consommer(terminal const &t); void Grammaire(); std::vector<production>Restegrammaire(); std::vector<production>Suitegrammaire(std::vector<production> const &suitegrammaire_h); production Production(); std::vector<corps> Listecorps(); std::vector<corps> Restelistecorps(std::vector<corps>const &restelistecorps_h); corps Corps(); corps Restecorps(corps const &restecorps_h); std::string Tete(); void sortie(); std::vector<std::string>finprod(corps c,std::string s); void touslessuivants(); void deuxannulables(production const &p); std::vector<std::string>suivants(std::string const &n); std::vector<std::string>suivantsn(std::string const &s,int const &n); void ajoutersuivants(std::vector<std::string> const &v, std::string const &s); void recursivitees(production const &A); void ambigue(production const &p); //std::vector<production>commence(std::string const &recherche); std::string gettete(); production quelleproduction(std::string const &t); std::vector<std::string> nonterminaux0(production const &A); bool annulable(std::string s); bool annulable(corps const &c); bool annulable(production const &p); bool annulable(std::vector<std::string>const & groupe); std::vector<std::string>premiers(std::string const &s); std::vector<std::string>premiers(std::vector<std::string>const & groupe); int comptersymboles(std::string const &s); void factorisable(production const &p); void improductifs(); private: bool ax; lexical L; uniLex a; std::vector<std::string>symboles; std::vector<std::string>nonterminaux; std::vector<std::string>terminaux; std::vector<std::string>pilerecurs; std::vector<std::string>pastester; std::vector<std::string>pilesuivants,dejacalcule,encours; std::vector<production>grammaire; bool ecriresortie,recurs; std::map<std::string,std::vector<std::string>>tabsuivants; std::map<std::string,int>traite; }; class production{ public: void settete(std::string const &t); std::string gettete(); void setlistecorps(std::vector<corps> const &liste); std::vector<corps>getlistecorps(); bool deuxepsilon(); void setaxiome(bool ax); bool getaxiome(); private: std::string tete; std::vector<corps> listecorps; bool axiome; }; class corps{ public: void clear(); void ajoutermot(std::string const &m); std::string getelem(int const &n); std::vector<std::string>getcontenu(); private: std::vector<std::string> contenu; };
Partager