Bonjour,
mon programme, avec le même fichier d'entrée, des fois il marche et des fois il me dit erreur de segmentation.
Le fichier d'entrée est le suivant:
chaque ligne est une productions.Code:A epsilon\ A v b n\ v epsilon\ n epsilon\ #
le premier identificateur d'une ligne est la tête de production. Les autre constituent le corps. Une production se termine ici par un antislash, et l'ensemble des productions (la grammaire) se termine par un dièse.
Ici, les non terminaux (les symboles utilisés pour les têtes de production) sont A,v et n.
les terminaux sont b et epsilon.
j'ai fait un programme (pour un projet qui dépasse un peu ce post) qui vérifie qu'une production annulable ne l'est pas pour plus d'un corps.
un non-terminal ne doit pas être la tête de plus d'une production dont le corps est epsilon ou une suite de symboles annulables.
lors que j'exécute ce programme, des fois ça marche (il ne doit rien répondre) et parfois ça me met erreur de segmentation, sans avoir modfié ni le programme, ni le fichier d'entrée
mon déboggeur ne détecte aucune anomalie à ce programme avec ce fichier d'entrée
j'ai essayé avec un autre ordinateur et pareil.
je précise que ce code fonctionne avec les autres fichiers d'entré
Voici le programme:
main.cpp
syntaxique.hppCode:#include <iostream> #include "syntaxique.hpp" int main(int argc,char *argv[]){ if(argc<2) std::cout<<"argument manquant"<<std::endl; else{ syntaxique S(argv[1]); S.sortie(); } }
et syntaxique.cppCode:#include <string> #include <vector> #include <map> #include "uniLex.hpp" #include "lexical.hpp" #include "symboles.hpp" class production; class syntaxique{ public: syntaxique(char *nomfichier); void consommer(terminal const &t); std::vector<production>Grammaire(); std::vector<production> Restegrammaire(std::vector<production>restegrammaire_h); production Production(); std::vector<std::string> Corps(); std::vector<std::string> Restecorps(std::vector<std::string>restecorps_h); std::string Tete(); void sortie(); void deuxannulables(); std::vector<production>tetescommunes(std::string t); bool annulable(std::vector<std::string> c); //std::vector<std::string>listeteteprod(std::vector<production> g); /*std::vector<production> productifs(std::vector<production>const &grammaire);*/ //bool partie(std::vector<production>&prod,std::string const &alpha); //std::vector<production>normalise(std::vector<production> &prod); /*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);*/ 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,std::string>casevides;*/ }; class production{ public: bool annulable(); void settete(std::string const &t); std::string gettete(); void setcorps(std::vector<std::string> const &c); std::vector<std::string>getcorps(); private: std::string tete; std::vector<std::string> corps; }; /*class corps{ public: void clear(); void ajoutermot(std::string const &m); std::string getelem(int const &n); int taille(); std::vector<std::string>getcontenu(); void setcontenu(std::vector<std::string> const &c); private: std::vector<std::string> contenu; }; class productionsimple{ public: std::string gettete(); void settete(std::string t); std::vector<std::string> getcorps(); void ajoutersymbole(std::string s); private: std::string tete; std::vector<std::string> corpsseul; }; */
quelqu'un a une idée?Code:#include <vector> #include <string> #include <iostream> #include "lexical.hpp" #include "syntaxique.hpp" #include "symboles.hpp" #include "uniLex.hpp" bool absent(std::vector<std::string>const &l,std::string const &s); bool present(std::vector<std::string>const &l,std::string const &s); syntaxique::syntaxique(char *nomfichier):L(nomfichier){ a=L.anaLex(); grammaire=Grammaire(); } void syntaxique::consommer(terminal const &t){ if(t==a.getLex()) a=L.anaLex(); else{ std::cerr<<"Ligne "<<L.getLigne()<<": symbole "<<a.getLexeme() <<" inattendu"<<std::endl; } } std::vector<production>syntaxique::Grammaire(){ std::vector<production>restegrammaire_h,grammaire_s, restegrammaire_s; production production_s; production_s=Production(); restegrammaire_h.push_back(production_s); restegrammaire_s=Restegrammaire(restegrammaire_h); consommer(diese); grammaire_s=restegrammaire_s; for(auto s:symboles) if(absent(nonterminaux,s)) terminaux.push_back(s); return grammaire_s; } std::vector<production>syntaxique:: Restegrammaire(std::vector<production> restegrammaire_h){ std::vector<production>restegrammaire1_h,restegrammaire_s, restegrammaire1_s; production production_s; if(a.getLex()==mot){ production_s=Production(); restegrammaire_h.push_back(production_s); restegrammaire1_h=restegrammaire_h; restegrammaire1_s=Restegrammaire(restegrammaire1_h); restegrammaire_s=restegrammaire1_s; } else restegrammaire_s=restegrammaire_h; return restegrammaire_s; } production syntaxique::Production(){ production production_s; std::vector<std::string> corps_s; std::string tete_s; tete_s=Tete(); production_s.settete(tete_s); corps_s=Corps(); production_s.setcorps(corps_s); consommer(antislash); return production_s; } std::string syntaxique::Tete(){ std::string tete_s,mot_s; mot_s=a.getLexeme(); consommer(mot); if(absent(symboles,mot_s)) symboles.push_back(mot_s); if(absent(nonterminaux,mot_s)) nonterminaux.push_back(mot_s); tete_s=mot_s; return tete_s; } std::vector<std::string> syntaxique::Corps(){ std::string mot_s; std::vector<std::string> restecorps_h,corps_s,restecorps_s; mot_s=a.getLexeme(); consommer(mot); if(absent(symboles,mot_s)) symboles.push_back(mot_s); restecorps_h.push_back(mot_s); restecorps_s=Restecorps(restecorps_h); corps_s=restecorps_s; return corps_s; } std::vector<std::string> syntaxique:: Restecorps(std::vector<std::string>restecorps_h){ std::vector<std::string> restecorps1_h,restecorps1_s,restecorps_s; std::string mot_s; if(a.getLex()==mot){ mot_s=a.getLexeme(); if(absent(symboles,mot_s)) symboles.push_back(mot_s); consommer(mot); restecorps_h.push_back(mot_s); restecorps1_h=restecorps_h; restecorps1_s=Restecorps(restecorps1_h); restecorps_s=restecorps1_s; } else restecorps_s=restecorps_h; return restecorps_s; } void syntaxique::deuxannulables(){ int n_annulables; std::vector<production> listep; for(auto nt:nonterminaux){ n_annulables=0; listep=tetescommunes(nt); for(auto p:listep) if(annulable(p.getcorps())){ n_annulables++; if(n_annulables>1){ std::cerr<<"plus d'un annulable avec "<<p.gettete()<<std::endl; break; } } } } std::vector<production>syntaxique::tetescommunes(std::string t){ std::vector<production>retour; for(auto p:grammaire) if(p.gettete()==t) retour.push_back(p); return retour; } bool syntaxique::annulable(std::vector<std::string> c){ std::vector<production>communes; std::vector<std::string> pcorps; if(c[0]=="epsilon") return true; else for(auto s:c) if(present(terminaux,s)&&s!="epsilon") return false; else{ communes=tetescommunes(s); for(auto p:communes){ pcorps=p.getcorps(); if( ! annulable(pcorps)) return false; } } return true; } void syntaxique::sortie(){ deuxannulables(); } void production::settete(std::string const &t){ tete=t; } std::string production::gettete(){ return tete; } void production::setcorps(std::vector<std::string> const &c){ corps=c; } std::vector<std::string>production::getcorps(){ return corps; }
-----