IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Mathématiques Discussion :

Ensemble des têtes de production possédant un corps de terminaux uniquement


Sujet :

Mathématiques

  1. #1
    Membre confirmé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    361
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 361
    Points : 452
    Points
    452
    Billets dans le blog
    15
    Par défaut Ensemble des têtes de production possédant un corps de terminaux uniquement
    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;
        }
    }
    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;
    };
    une idée?

  2. #2
    Membre confirmé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    361
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 361
    Points : 452
    Points
    452
    Billets dans le blog
    15
    Par défaut
    j'avais mal placé le if( ! pasajouter).
    avec le code ci-dessous ça marche
    (ça marche aussi si on ne teste pas si s!="epsilon")
    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(s!="epsilon" && 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;
        }
    }

  3. #3
    Membre confirmé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    361
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 361
    Points : 452
    Points
    452
    Billets dans le blog
    15
    Par défaut
    en fait, je ne sais toujours pas si epsilon est à considérer comme terminal dans le calcul des productions improductives
    si on écrit la grammaire suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    A -> b B | a C
    B -> b
    C -> a C | epsilon
    la production C est-elle improductive?

    une idée?

  4. #4
    Membre confirmé

    Homme Profil pro
    développeur à la maison
    Inscrit en
    Septembre 2006
    Messages
    361
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : développeur à la maison

    Informations forums :
    Inscription : Septembre 2006
    Messages : 361
    Points : 452
    Points
    452
    Billets dans le blog
    15
    Par défaut
    epsilon est un terminal et permet à C d'être productif
    sans epsilon, C serait improductif car dérivation à l'infini

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 06/04/2022, 12h11
  2. Script permettant de créer l'ensemble des indexes d'une base
    Par matacars dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 01/07/2005, 17h14
  3. Sauvegarder l'ensemble des DTS d'un serveur SQL
    Par maveric dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 05/02/2004, 20h20
  4. [JTree] Ouvrir/Fermer l'ensemble des noeuds
    Par Math_Caen dans le forum Composants
    Réponses: 3
    Dernier message: 07/04/2003, 15h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo